Javascript agrega ceros a la fecha


438

He creado este script para calcular la fecha con 10 días de anticipación en el formato dd / mm / aaaa:

var MyDate = new Date();
var MyDateString = new Date();
MyDate.setDate(MyDate.getDate()+10);
MyDateString = MyDate.getDate() + '/' + (MyDate.getMonth()+1) + '/' + MyDate.getFullYear();

Necesito que la fecha aparezca con ceros a la izquierda en el componente de día y mes agregando estas reglas al script. Parece que no puedo hacer que funcione.

if (MyDate.getMonth < 10)getMonth = '0' + getMonth;

y

if (MyDate.getDate <10)get.Date = '0' + getDate;

Si alguien pudiera mostrarme dónde insertarlos en el guión, estaría realmente agradecido.


66
Como buena convención, debe poner en minúscula el primer carácter en los nombres de sus variables y reservar la carcasa de camello para objetos / prototipos.
zykadelic

Si el formato AAAA-MM-DD es aceptable, esta sería una muy buena respuesta: stackoverflow.com/a/28431880/1717535
Fabien Snauwaert el

Respuestas:


1354

Pruebe esto: http://jsfiddle.net/xA5B7/

var MyDate = new Date();
var MyDateString;

MyDate.setDate(MyDate.getDate() + 20);

MyDateString = ('0' + MyDate.getDate()).slice(-2) + '/'
             + ('0' + (MyDate.getMonth()+1)).slice(-2) + '/'
             + MyDate.getFullYear();

EDITAR:

Para explicar, .slice(-2)nos da los dos últimos caracteres de la cadena.

Así que no importa qué, podemos agregar "0"al día o mes, y solo pedir los dos últimos, ya que esos son siempre los dos que queremos.

Entonces, si los MyDate.getMonth()retornos 9, serán:

("0" + "9") // Giving us "09"

sumando .slice(-2)eso nos da los dos últimos caracteres que es:

("0" + "9").slice(-2)
"09"

Pero si MyDate.getMonth()regresa 10, será:

("0" + "10") // Giving us "010"

entonces agregar .slice(-2)nos da los dos últimos caracteres, o:

("0" + "10").slice(-2)
"10"

27
Bifurcado: formato de fecha AAAA-MM-DD jsfiddle.net/j6qJp/1 Puede ser útil para alguien. Gracias
tomexx

3
¿Alguien puede explicar por qué esto es mejor que la respuesta que @Aleross proporciona a continuación? No está claro de inmediato qué hace frente a la función de almohadilla, que está explícitamente claro.
claudio

2
Sin mencionar que hoy este ejemplo me dio 26/06/2014 en lugar de 06/06/2014
DazManCat

3
@DazManCat: Eso es lo que se supone que debe hacer. El código comienza agregando 20 días a la fecha actual. MyDate.setDate(MyDate.getDate() + 20);
cookie monster

3
@ n00b y @Phil Cooper, sin quedar atrapado en una discusión sobre los entresijos de las rutinas de JavaScript de tiempo, descubrí que la slice()técnica en la respuesta aceptada es aproximadamente 1/10 de segundo más rápido que la técnica de @Aleross pad()en 1 millón de iteraciones. jsFiddle . "paga tu dinero, elige".
Karl

105

Aquí hay un ejemplo de los documentos de objetos Date en la red de desarrolladores de Mozilla usando una función personalizada "pad", sin tener que extender el prototipo de número de Javascript. La práctica función que dan como ejemplo es

function pad(n){return n<10 ? '0'+n : n}

Y a continuación se está utilizando en contexto.

/* use a function for the exact format desired... */
function ISODateString(d){
    function pad(n){return n<10 ? '0'+n : n}
    return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z'
}

var d = new Date();
console.log(ISODateString(d)); // prints something like 2009-09-28T19:03:12Z

3
Muy buena forma de hacerlo. Creo que la respuesta aceptada es realmente agradable, pero esto es aún más limpio en mi opinión
Binke

1
esto podría generar errores inesperados, ya que genera una cadena para <10 y un número para> = 10
David Fregoli

@DavidFregoli, todas esas funciones de fecha a cadena devuelven una cadena, por lo que si ingresa una cadena, padsolo genera cadenas.
Rohmer

56

La nueva forma moderna de hacerlo es usarlo toLocaleDateString, ya que no solo le permite formatear una fecha con la localización adecuada, sino que incluso puede pasar opciones de formato para archivar el resultado deseado:

var date = new Date(2018, 2, 1);
var result = date.toLocaleDateString("en-GB", { // you can skip the first argument
  year: "numeric",
  month: "2-digit",
  day: "2-digit",
});
console.log(result);

Cuando omita el primer argumento, detectará el idioma del navegador. Alternativamente, también puede usar 2-digitla opción del año.

Si no necesita admitir navegadores antiguos como IE10, esta es la forma más limpia de hacer el trabajo. IE10 y versiones inferiores no entenderán el argumento de las opciones.

Nota: Además, también existe toLocaleTimeString, si desea localizar o formatear la hora de una fecha.


3
Esto es exactamente lo que estaba buscando, gracias. Más información sobre las opciones disponibles para toLocaleDateString aquí: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JoseLinares

1
@JoseLinares Hola, gracias por volver a poner este enlace en los días. Simplemente decidí mejorar mi respuesta para hacer que la solución sea más atractiva para escenarios comunes, ya que puede omitir el primer argumento y IE10 ya no es relevante. Con eso en mente, incluí tu enlace en mi respuesta.
Martin Braun

@modiX, lo siento, fue mi error en el código y tomé la descripción de manera incorrecta, Sí, las configuraciones regionales (primera variable) son opcionales .
Kanhaiya lal

@Kanhaiyalal No se preocupe, pueden ocurrir errores. Solo me sorprendió que 2 de los 3 revisores también aprobaran la edición incorrecta.
Martin Braun

51

Puede definir una función "str_pad" (como en php):

function str_pad(n) {
    return String("00" + n).slice(-2);
}

99
"0" en lugar de "00" es suficiente
David Fregoli

La mejor respuesta con diferencia.
Lucas Andrade

30

Para ustedes, personas del futuro (ECMAScript 2017 y más allá)

Solución

"use strict"

const today = new Date()

const year = today.getFullYear()

const month = `${today.getMonth() + 1}`.padStart(2, "0")

const day = `${today.getDate()}`.padStart(2, "0")

const stringDate = [day, month, year].join("/") // 13/12/2017

Explicación

el String.prototype.padStart(targetLength[, padString])agrega tantos como sea posible padStringen el String.prototypeobjetivo para que la nueva longitud del objetivo sea targetLength.

Ejemplo

"use strict"

let month = "9"

month = month.padStart(2, "0") // "09"

let byte = "00000100"

byte = byte.padStart(8, "0") // "00000100"

44
Esto es parte de ES2017 o ES8. Por lo tanto, es incorrecto decir "ES6 +" ya que no es parte de ES6 y ES7.
Noel Llevares

1
Esto debería ser técnicamente .padStart(2, '0')ya que el segundo parámetro es una cadena, aunque probablemente no importará a menos que esté usando TypeScript
bmaupin

Tienes razón, editaré mi respuesta.
Amin NAIRI

11
Number.prototype.padZero= function(len){
 var s= String(this), c= '0';
 len= len || 2;
 while(s.length < len) s= c + s;
 return s;
}

//en uso:

(function(){
 var myDate= new Date(), myDateString;
 myDate.setDate(myDate.getDate()+10);

 myDateString= [myDate.getDate().padZero(),
 (myDate.getMonth()+1).padZero(),
 myDate.getFullYear()].join('/');

 alert(myDateString);
})()

/*  value: (String)
09/09/2010
*/

10

Encontré la forma más corta de hacer esto:

 MyDateString.replace(/(^|\D)(\d)(?!\d)/g, '$10$2');

agregará ceros iniciales a todos los dígitos solitarios y únicos


Me gusta esta solución, ¿podrías aclarar un poco lo que sucede allí?
Gobliins

7
var MyDate = new Date();
var MyDateString = '';
MyDate.setDate(MyDate.getDate());
var tempoMonth = (MyDate.getMonth()+1);
var tempoDate = (MyDate.getDate());
if (tempoMonth < 10) tempoMonth = '0' + tempoMonth;
if (tempoDate < 10) tempoDate = '0' + tempoDate;
MyDateString = tempoDate + '/' + tempoMonth + '/' + MyDate.getFullYear();

5

Puede usar el operador ternario para formatear la fecha como una declaración "if".

Por ejemplo:

var MyDate = new Date();
MyDate.setDate(MyDate.getDate()+10);
var MyDateString = (MyDate.getDate() < 10 ? '0' + MyDate.getDate() : MyDate.getDate()) + '/' + ((d.getMonth()+1) < 10 ? '0' + (d.getMonth()+1) : (d.getMonth()+1)) + '/' + MyDate.getFullYear();

Entonces

(MyDate.getDate() < 10 ? '0' + MyDate.getDate() : MyDate.getDate())

sería similar a una instrucción if, donde if getDate () devuelve un valor menor que 10, luego devuelve un '0' + la Fecha, o si no, la fecha si es mayor que 10 (ya que no necesitamos agregar el valor inicial 0). Lo mismo para el mes.

Editar: Olvidé que getMonth comienza con 0, así que agregué el +1 para tenerlo en cuenta. Por supuesto, también podría decir d.getMonth () <9: pero pensé que usar el +1 ayudaría a que sea más fácil de entender.


gracias por explicar el +1
Bryan A

5

Hay otro enfoque para resolver este problema, utilizando sliceJavaScript.

var d = new Date();
var datestring = d.getFullYear() + "-" + ("0"+(d.getMonth()+1)).slice(-2) +"-"+("0" + d.getDate()).slice(-2);

la datestring fecha de regreso con el formato que espera: 2019-09-01

Otro enfoque es utilizar la dateformatbiblioteca: https://github.com/felixge/node-dateformat


Tenga cuidado al deletrear "JavaScript".
Basil Bourque

3

Haz tu vida más fácil y usa Moment.js algún código de muestra:

var beginDateTime = moment()
  .format('DD-MM-YYYY HH:mm')
  .toString();

// Now will print 30-06-2015 17:55
console.log(beginDateTime);

44
moment.js -> no es una buena solución porque tiene 19.8k de código en comparación con las soluciones de 0.3k aquí.
MarcoZen

3
function formatDate(jsDate){
  // add leading zeroes to jsDate when days or months are < 10.. 
  // i.e.
  //     formatDate(new Date("1/3/2013")); 
  // returns
  //    "01/03/2103"
  ////////////////////
  return (jsDate.getDate()<10?("0"+jsDate.getDate()):jsDate.getDate()) + "/" + 
      ((jsDate.getMonth()+1)<10?("0"+(jsDate.getMonth()+1)):(jsDate.getMonth()+1)) + "/" + 
      jsDate.getFullYear();
}

3

Puede proporcionar opciones como parámetro para formatear la fecha. El primer parámetro es para la configuración regional que podría no necesitar y el segundo es para las opciones. Para obtener más información, visite https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

var date = new Date(Date.UTC(2012, 1, 1, 3, 0, 0));
var options = { year: 'numeric', month: '2-digit', day: '2-digit' };
console.log(date.toLocaleDateString(undefined,options));

1
Gracias por las sugerencias
MJ55

2

Envolví la respuesta correcta de esta pregunta en una función que puede agregar varios ceros a la izquierda, pero por defecto agrega 1 cero.

function zeroFill(nr, depth){
  depth = (depth === undefined)? 1 : depth;

  var zero = "0";
  for (var i = 0; i < depth; ++i) {
    zero += "0";
  }

  return (zero + nr).slice(-(depth + 1));
}

para trabajar solo con números y no más de 2 dígitos, este también es un enfoque:

function zeroFill(i) {
    return (i < 10 ? '0' : '') + i
  }

1

Otra opción, usar una función incorporada para hacer el relleno (¡pero resulta en un código bastante largo!):

myDateString = myDate.getDate().toLocaleString('en-US', {minimumIntegerDigits: 2})
  + '/' + (myDate.getMonth()+1).toLocaleString('en-US', {minimumIntegerDigits: 2})
  + '/' + myDate.getFullYear();

// '12/06/2017'

Y otro, manipulando cadenas con expresiones regulares:

var myDateString = myDate.toISOString().replace(/T.*/, '').replace(/-/g, '/');

// '2017/06/12'

Pero tenga en cuenta que uno mostrará el año al comienzo y el día al final .


Me gustó más esto: myDate.getDate (). toLocaleString ('en-US', {minimumIntegerDigits: 2})
Max Alexander Hanna

1

Agregando a la respuesta @modiX, esto es lo que funciona ... NO DEJE ESO como vacío

today.toLocaleDateString("default", {year: "numeric", month: "2-digit", day: "2-digit"})

1

Aquí hay un ejemplo muy simple de cómo puede manejar esta situación.

var mydate = new Date();

var month = (mydate.getMonth().toString().length < 2 ? "0"+mydate.getMonth().toString() :mydate.getMonth());

var date = (mydate.getDate().toString().length < 2 ? "0"+mydate.getDate().toString() :mydate.getDate());

var year = mydate.getFullYear();

console.log("Format Y-m-d : ",year+"-"+month+"-" + date);

console.log("Format Y/m/d : ",year+"/"+month+"/" + date);


0

El siguiente objetivo es extraer la configuración, conectar Date.protoypey aplicar la configuración.

He usado un Arraypara almacenar fragmentos de tiempo y cuando yo push() thiscomo Dateobjeto, me devuelve la longitud para iterar. Cuando termine, puedo usar joinel returnvalor.

Esto parece funcionar bastante rápido: 0.016ms

// Date protoype
Date.prototype.formatTime = function (options) {
    var i = 0,
        time = [],
        len = time.push(this.getHours(), this.getMinutes(), this.getSeconds());

    for (; i < len; i += 1) {
        var tick = time[i];
        time[i] = tick < 10 ? options.pad + tick : tick;
    }

    return time.join(options.separator);
};

// Setup output
var cfg = {
    fieldClock: "#fieldClock",
    options: {
        pad: "0",
        separator: ":",
        tick: 1000
    }
};

// Define functionality
function startTime() {
    var clock = $(cfg.fieldClock),
        now = new Date().formatTime(cfg.options);

    clock.val(now);
    setTimeout(startTime, cfg.options.tick);
}

// Run once
startTime();

demostración: http://jsfiddle.net/tive/U4MZ3/


0

Lo que haría es crear mi propio asistente de fecha personalizado que se vea así:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Add 20 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), 20));

(ver también este violín )


0

Agregue un poco de relleno para permitir un cero inicial, donde sea necesario, y concatene utilizando su delimitador de elección como cadena.

Number.prototype.padLeft = function(base,chr){
        var  len = (String(base || 10).length - String(this).length)+1;
        return len > 0? new Array(len).join(chr || '0')+this : this;
    }

var d = new Date(my_date);
var dformatted = [(d.getMonth()+1).padLeft(), d.getDate().padLeft(), d.getFullYear()].join('/');

0

Como sugiere @John Henckel, comenzar a usar el método toISOString () facilita las cosas

const dateString = new Date().toISOString().split('-');
const year = dateString[0];
const month = dateString[1];
const day = dateString[2].split('T')[0];

console.log(`${year}-${month}-${day}`);


0
 let date = new Date();
 let dd = date.getDate();//day of month

 let mm = date.getMonth();// month
 let yyyy = date.getFullYear();//day of week
 if (dd < 10) {//if less then 10 add a leading zero
     dd = "0" + dd;
   }
 if (mm < 10) {
    mm = "0" + mm;//if less then 10 add a leading zero
  }

También puede describir brevemente lo que intenta.
Shiv Kumar Baghel

0

intente esto para una función básica, no se requieren bibliotecas

Date.prototype.CustomformatDate = function() {
 var tmp = new Date(this.valueOf());
 var mm = tmp.getMonth() + 1;
 if (mm < 10) mm = "0" + mm;
 var dd = tmp.getDate();
 if (dd < 10) dd = "0" + dd;
 return mm + "/" + dd + "/" + tmp.getFullYear();
};

0
function pad(value) {
    return value.tostring().padstart(2, 0);
}

let d = new date();
console.log(d);
console.log(`${d.getfullyear()}-${pad(d.getmonth() + 1)}-${pad(d.getdate())}t${pad(d.gethours())}:${pad(d.getminutes())}:${pad(d.getseconds())}`);

2
Si bien este código puede responder la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
leopal

0

Puede usar String.slice () que extrae una sección de una cadena y la devuelve como una nueva cadena, sin modificar la cadena original:

const currentDate = new Date().toISOString().slice(0, 10) // 2020-04-16

O también puede usar una biblioteca como Moment.js para formatear la fecha:

const moment = require("moment")
const currentDate = moment().format("YYYY-MM-DD") // 2020-04-16
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.