Formateo de la hora actual con Javascript

101

Quiero obtener la hora actual en un formato específico con javascript.

Con la función a continuación y llamarla me dará el viernes 01 de febrero de 2013 13:56:40 GMT + 1300 (hora de verano de Nueva Zelanda) pero quiero formatearlo como viernes 2:00 pm 1 de febrero de 2013

var d = new Date();
var x = document.getElementById("time");
x.innerHTML = d;

Por supuesto, el código anterior no tiene ninguna lógica de formato, pero todavía no me he encontrado con ningún formateador "funcional".

Seong Lee
fuente
Para una pregunta similar para Node.js, consulte stackoverflow.com/questions/10645994/…
Ohad Schneider

Respuestas:

160

Una fecha de JavaScript tiene varios métodos que le permiten extraer sus partes:

getFullYear()- Devuelve el año de 4 dígitos
getMonth()- Devuelve un entero de base cero (0-11) que representa el mes del año.
getDate()- Devuelve el día del mes (1-31).
getDay()- Devuelve el día de la semana (0-6). 0 es domingo, 6 es sábado.
getHours()- Devuelve la hora del día (0-23).
getMinutes()- Devuelve el minuto (0-59).
getSeconds()- Devuelve el segundo (0-59).
getMilliseconds()- Devuelve los milisegundos (0-999).
getTimezoneOffset()- Devuelve el número de minutos entre la hora local de la máquina y UTC.

No hay métodos integrados que le permitan obtener cadenas localizadas como "Viernes", "Febrero" o "PM". Tienes que codificarlo tú mismo. Para obtener la cadena que desea, al menos necesita almacenar representaciones de cadena de días y meses:

var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

Luego, júntelo usando los métodos anteriores:

var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var d = new Date();
var day = days[d.getDay()];
var hr = d.getHours();
var min = d.getMinutes();
if (min < 10) {
    min = "0" + min;
}
var ampm = "am";
if( hr > 12 ) {
    hr -= 12;
    ampm = "pm";
}
var date = d.getDate();
var month = months[d.getMonth()];
var year = d.getFullYear();
var x = document.getElementById("time");
x.innerHTML = day + " " + hr + ":" + min + ampm + " " + date + " " + month + " " + year;
<span id="time"></span>

Tengo una función de formato de fecha que me gusta incluir en mi biblioteca estándar. Toma un parámetro de cadena de formato que define la salida deseada. Las cadenas de formato se basan libremente en cadenas de formato de fecha y hora personalizadas de .Net . Para el formato que ha especificado la siguiente cadena de formato funcionaría: "dddd h:mmtt d MMM yyyy".

var d = new Date();
var x = document.getElementById("time");
x.innerHTML = formatDate(d, "dddd h:mmtt d MMM yyyy");

Demostración: jsfiddle.net/BNkkB/1

Aquí está mi función de formato de fecha completa:

function formatDate(date, format, utc) {
    var MMMM = ["\x00", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    var MMM = ["\x01", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    var dddd = ["\x02", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    var ddd = ["\x03", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];

    function ii(i, len) {
        var s = i + "";
        len = len || 2;
        while (s.length < len) s = "0" + s;
        return s;
    }

    var y = utc ? date.getUTCFullYear() : date.getFullYear();
    format = format.replace(/(^|[^\\])yyyy+/g, "$1" + y);
    format = format.replace(/(^|[^\\])yy/g, "$1" + y.toString().substr(2, 2));
    format = format.replace(/(^|[^\\])y/g, "$1" + y);

    var M = (utc ? date.getUTCMonth() : date.getMonth()) + 1;
    format = format.replace(/(^|[^\\])MMMM+/g, "$1" + MMMM[0]);
    format = format.replace(/(^|[^\\])MMM/g, "$1" + MMM[0]);
    format = format.replace(/(^|[^\\])MM/g, "$1" + ii(M));
    format = format.replace(/(^|[^\\])M/g, "$1" + M);

    var d = utc ? date.getUTCDate() : date.getDate();
    format = format.replace(/(^|[^\\])dddd+/g, "$1" + dddd[0]);
    format = format.replace(/(^|[^\\])ddd/g, "$1" + ddd[0]);
    format = format.replace(/(^|[^\\])dd/g, "$1" + ii(d));
    format = format.replace(/(^|[^\\])d/g, "$1" + d);

    var H = utc ? date.getUTCHours() : date.getHours();
    format = format.replace(/(^|[^\\])HH+/g, "$1" + ii(H));
    format = format.replace(/(^|[^\\])H/g, "$1" + H);

    var h = H > 12 ? H - 12 : H == 0 ? 12 : H;
    format = format.replace(/(^|[^\\])hh+/g, "$1" + ii(h));
    format = format.replace(/(^|[^\\])h/g, "$1" + h);

    var m = utc ? date.getUTCMinutes() : date.getMinutes();
    format = format.replace(/(^|[^\\])mm+/g, "$1" + ii(m));
    format = format.replace(/(^|[^\\])m/g, "$1" + m);

    var s = utc ? date.getUTCSeconds() : date.getSeconds();
    format = format.replace(/(^|[^\\])ss+/g, "$1" + ii(s));
    format = format.replace(/(^|[^\\])s/g, "$1" + s);

    var f = utc ? date.getUTCMilliseconds() : date.getMilliseconds();
    format = format.replace(/(^|[^\\])fff+/g, "$1" + ii(f, 3));
    f = Math.round(f / 10);
    format = format.replace(/(^|[^\\])ff/g, "$1" + ii(f));
    f = Math.round(f / 10);
    format = format.replace(/(^|[^\\])f/g, "$1" + f);

    var T = H < 12 ? "AM" : "PM";
    format = format.replace(/(^|[^\\])TT+/g, "$1" + T);
    format = format.replace(/(^|[^\\])T/g, "$1" + T.charAt(0));

    var t = T.toLowerCase();
    format = format.replace(/(^|[^\\])tt+/g, "$1" + t);
    format = format.replace(/(^|[^\\])t/g, "$1" + t.charAt(0));

    var tz = -date.getTimezoneOffset();
    var K = utc || !tz ? "Z" : tz > 0 ? "+" : "-";
    if (!utc) {
        tz = Math.abs(tz);
        var tzHrs = Math.floor(tz / 60);
        var tzMin = tz % 60;
        K += ii(tzHrs) + ":" + ii(tzMin);
    }
    format = format.replace(/(^|[^\\])K/g, "$1" + K);

    var day = (utc ? date.getUTCDay() : date.getDay()) + 1;
    format = format.replace(new RegExp(dddd[0], "g"), dddd[day]);
    format = format.replace(new RegExp(ddd[0], "g"), ddd[day]);

    format = format.replace(new RegExp(MMMM[0], "g"), MMMM[M]);
    format = format.replace(new RegExp(MMM[0], "g"), MMM[M]);

    format = format.replace(/\\(.)/g, "$1");

    return format;
};
gilly3
fuente
Muchas gracias. Aunque mi código final necesitaba algunos ajustes, sus conocimientos ayudaron.
Seong Lee
¿Cómo puedo formatear la fecha = "2016/03/01 11:00" hasta la fecha = "Sáb 01 de marzo de 2016 11:00:00 GMT + 0530 (IST)"
Vishal Singh
¿Cómo MMMM[0]devuelve el nombre del mes correcto en lugar del carácter no imprimible en el índice 0? ¿No debería serlo MMMM[M]? ¿Soy tonto? (No importa. Lo establece en el carácter no imprimible, que reemplaza más tarde para evitar conflictos)
Danegraphics
189

Puede que quieras probar

var d = new Date();
d.toLocaleString();       // -> "2/1/2013 7:37:08 AM"
d.toLocaleDateString();   // -> "2/1/2013"
d.toLocaleTimeString();  // -> "7:38:05 AM"

Documentación

Ye Lin Aung
fuente
1
¿Por qué tu método no me funciona? d.toLocaleTimeString()y d.toLocaleTimeString()no funcionan.
afzalex
@afzalex, ¿quieres decir que no obtendrás ninguna devolución?
Ye Lin Aung
si. No encontré ningún método toLocaleTimeString()ytoLocaleTimeString()
afzalex
afzalex prueba este: new Date (). toLocaleString ();
blueberry0xff
console.log (nueva fecha (). toLocaleString ()); // 27/9/2015, 2:52:18 PM
blueberry0xff
37

Actualización de 2017 : use toLocaleDateString y toLocaleTimeString para formatear fechas y horas. El primer parámetro que se pasa a estos métodos es un valor de configuración regional, como en-us . El segundo parámetro, cuando está presente, especifica las opciones de formato, como la forma larga para el día de la semana.

let date = new Date();  
let options = {  
    weekday: "long", year: "numeric", month: "short",  
    day: "numeric", hour: "2-digit", minute: "2-digit"  
};  

console.log(date.toLocaleTimeString("en-us", options)); 

Salida: miércoles, 25 de octubre de 2017, 8:19 p.m.

Consulte el enlace a continuación para obtener más detalles.

Cadenas de fecha y hora (JavaScript)

Joomler
fuente
2
En este momento, más de cuatro años después de las primeras respuestas a esta pregunta, esta es la solución más conveniente y flexible, y la respuesta a esta pregunta. Debería promoverse más alto como un ejemplo de la práctica actual (AD 2018) :-)
Jochem Schulenklopper
Rasgado. El puerto de strftime de @ thdoan parece más flexible. Por ejemplo, toLocalTimeStringofrece 4 estilos de fecha full long medium short, y quizás el significado de esos términos esté definido en alguna parte. Mientras tanto, strftime podría (probablemente) coincidir con cualquiera de esos y muchos más. Por otro lado, toLocalTimeStringadmite zonas horarias. Espero que eso incluya las zonas horarias que utilizan el horario de verano ...
Capitán Puget
14

Puedes usar mi puerto de strftime :

/* Port of strftime(). Compatibility notes:
 *
 * %c - formatted string is slightly different
 * %D - not implemented (use "%m/%d/%y" or "%d/%m/%y")
 * %e - space is not added
 * %E - not implemented
 * %h - not implemented (use "%b")
 * %k - space is not added
 * %n - not implemented (use "\n")
 * %O - not implemented
 * %r - not implemented (use "%I:%M:%S %p")
 * %R - not implemented (use "%H:%M")
 * %t - not implemented (use "\t")
 * %T - not implemented (use "%H:%M:%S")
 * %U - not implemented
 * %W - not implemented
 * %+ - not implemented
 * %% - not implemented (use "%")
 *
 * strftime() reference:
 * http://man7.org/linux/man-pages/man3/strftime.3.html
 *
 * Day of year (%j) code based on Joe Orost's answer:
 * http://stackoverflow.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366
 *
 * Week number (%V) code based on Taco van den Broek's prototype:
 * http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html
 */
function strftime(sFormat, date) {
  if (!(date instanceof Date)) date = new Date();
  var nDay = date.getDay(),
    nDate = date.getDate(),
    nMonth = date.getMonth(),
    nYear = date.getFullYear(),
    nHour = date.getHours(),
    aDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    aMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
    aDayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
    isLeapYear = function() {
      if ((nYear&3)!==0) return false;
      return nYear%100!==0 || nYear%400===0;
    },
    getThursday = function() {
      var target = new Date(date);
      target.setDate(nDate - ((nDay+6)%7) + 3);
      return target;
    },
    zeroPad = function(nNum, nPad) {
      return ('' + (Math.pow(10, nPad) + nNum)).slice(1);
    };
  return sFormat.replace(/%[a-z]/gi, function(sMatch) {
    return {
      '%a': aDays[nDay].slice(0,3),
      '%A': aDays[nDay],
      '%b': aMonths[nMonth].slice(0,3),
      '%B': aMonths[nMonth],
      '%c': date.toUTCString(),
      '%C': Math.floor(nYear/100),
      '%d': zeroPad(nDate, 2),
      '%e': nDate,
      '%F': date.toISOString().slice(0,10),
      '%G': getThursday().getFullYear(),
      '%g': ('' + getThursday().getFullYear()).slice(2),
      '%H': zeroPad(nHour, 2),
      '%I': zeroPad((nHour+11)%12 + 1, 2),
      '%j': zeroPad(aDayCount[nMonth] + nDate + ((nMonth>1 && isLeapYear()) ? 1 : 0), 3),
      '%k': '' + nHour,
      '%l': (nHour+11)%12 + 1,
      '%m': zeroPad(nMonth + 1, 2),
      '%M': zeroPad(date.getMinutes(), 2),
      '%p': (nHour<12) ? 'AM' : 'PM',
      '%P': (nHour<12) ? 'am' : 'pm',
      '%s': Math.round(date.getTime()/1000),
      '%S': zeroPad(date.getSeconds(), 2),
      '%u': nDay || 7,
      '%V': (function() {
              var target = getThursday(),
                n1stThu = target.valueOf();
              target.setMonth(0, 1);
              var nJan1 = target.getDay();
              if (nJan1!==4) target.setMonth(0, 1 + ((4-nJan1)+7)%7);
              return zeroPad(1 + Math.ceil((n1stThu-target)/604800000), 2);
            })(),
      '%w': '' + nDay,
      '%x': date.toLocaleDateString(),
      '%X': date.toLocaleTimeString(),
      '%y': ('' + nYear).slice(2),
      '%Y': nYear,
      '%z': date.toTimeString().replace(/.+GMT([+-]\d+).+/, '$1'),
      '%Z': date.toTimeString().replace(/.+\((.+?)\)$/, '$1')
    }[sMatch] || sMatch;
  });
}

Uso de muestra:

// Returns "Thursday 4:45pm 15 Sep 2016"
strftime('%A %l:%M%P %e %b %Y');

// You can optionally pass it a Date object
// Returns "Friday 2:00pm 1 Feb 2013"
strftime('%A %l:%M%P %e %b %Y', new Date('Feb 1, 2013 2:00 PM'));

El último código está disponible aquí: https://github.com/thdoan/strftime

thdoan
fuente
Esto es asombroso. Muchas gracias.
PerpetualStudent
7

Mire los aspectos internos de la clase Date y verá que puede extraer todos los bits (fecha, mes, año, hora, etc.).

http://www.w3schools.com/jsref/jsref_obj_date.asp

Para algo como Fri 23:00 1 Feb 2013el código es como:

date = new Date();

weekdayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var dateString = weekdayNames[date.getDay()] + " " 
    + date.getHours() + ":" + ("00" + date.getMinutes()).slice(-2) + " " 
    + date.getDate() + " " + monthNames[date.getMonth()] + " " + date.getFullYear();

console.log(dateString);

**** Modificado 2019-05-29 para mantener felices a 3 votantes en contra

Lee Meador
fuente
9
w3schools no es genial. Consulte w3fools . Las mejores fuentes de referencia incluyen MDN y MSDN .
gilly3
Date # getDay devuelve un número entero, no un nombre de día de la semana. Además, en mi humilde opinión, MDN lo hace peor para transmitir el punto rápidamente con respecto al objeto Date, por lo que no entiendo por qué debe tener lugar el menosprecio.
Ninjaxor
El problema date.getMinutes()es que devuelve un solo dígito cuando los minutos son inferiores a 10, lo que da como resultado tiempos como "10: 4 am" en lugar del más común "10:04 am".
Jochem Schulenklopper
@JochemSchulenklopper Se agregó el código sin fecha para mostrar un cero a la izquierda en los minutos
Lee Meador
@Ninjaxor Se agregó un código no relacionado con la fecha para convertir un número en una cadena. Esto debería funcionar si quieres nombres en inglés.
Lee Meador
4

Hay muchas bibliotecas geniales para aquellos interesados

Realmente no debería ser necesario en estos días inventar sus propios especificadores de formato.

slf
fuente
Solo quería mencionar, a partir de octubre de 2017, que momentes el estándar actual para cosas relacionadas con el tiempo en Javascript.
shawon191
gracias @ shawon191 por la actualización :) ya, momentrocas. d3también ha agregado algunas cosas de tiempo, por lo que si ya lo está usando, es posible que pueda guardar una importación de biblioteca github.com/d3/d3/blob/master/API.md#time-formats-d3-time-format
slf
1

2,39 KB minificado. Un archivo. https://github.com/rhroyston/clock-js

La hora actual es

var str = clock.month;
var m = str.charAt(0).toUpperCase() + str.slice(1,3); //gets you abbreviated month
clock.weekday + ' ' + clock.time + ' ' + clock.day + ' ' + m + ' ' + clock.year; //"tuesday 5:50 PM 3 May 2016"
Ronnie Royston
fuente
1

d = Date.now();
d = new Date(d);
d = (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getFullYear()+' '+(d.getHours() > 12 ? d.getHours() - 12 : d.getHours())+':'+d.getMinutes()+' '+(d.getHours() >= 12 ? "PM" : "AM");

console.log(d);

Cris
fuente
0

Para trabajar con la clase Date base, puede buscar en MDN sus métodos (en lugar de W3Schools debido a esta razón ). Allí puede encontrar una buena descripción sobre cada método útil para acceder a cada componente de fecha / hora e información relativa a si un método está obsoleto o no.

De lo contrario, puede mirar Moment.js, que es una buena biblioteca para usar para el procesamiento de fecha y hora. Puede usarlo para manipular la fecha y la hora (como analizar, formatear, i18n, etc.).

Ragnarokkr
fuente
0
function formatTime(date){

  d = new Date(date);
  var h=d.getHours(),m=d.getMinutes(),l="AM";
  if(h > 12){
    h = h - 12;
  }
  if(h < 10){
    h = '0'+h;
  }
  if(m < 10){
    m = '0'+m;
  }
  if(d.getHours() >= 12){
    l="PM"
  }else{
    l="AM"
  }

  return h+':'+m+' '+l;

}

Uso y resultado:

var formattedTime=formatTime(new Date('2020 15:00'));
// Output: "03:00 PM"
Simón
fuente
0

Para este verdadero estilo mysql use esta función a continuación: 2019/02/28 15:33:12

  • Si hace clic en el
  • Botón "Ejecutar fragmento de código" a continuación
  • Le mostrará un ejemplo simple de reloj digital en tiempo real. La demostración aparecerá debajo del fragmento de código.

function getDateTime() {
        var now     = new Date(); 
        var year    = now.getFullYear();
        var month   = now.getMonth()+1; 
        var day     = now.getDate();
        var hour    = now.getHours();
        var minute  = now.getMinutes();
        var second  = now.getSeconds(); 
        if(month.toString().length == 1) {
             month = '0'+month;
        }
        if(day.toString().length == 1) {
             day = '0'+day;
        }   
        if(hour.toString().length == 1) {
             hour = '0'+hour;
        }
        if(minute.toString().length == 1) {
             minute = '0'+minute;
        }
        if(second.toString().length == 1) {
             second = '0'+second;
        }   
        var dateTime = year+'/'+month+'/'+day+' '+hour+':'+minute+':'+second;   
         return dateTime;
    }

    // example usage: realtime clock
    setInterval(function(){
        currentTime = getDateTime();
        document.getElementById("digital-clock").innerHTML = currentTime;
    }, 1000);
<div id="digital-clock"></div>

Daniel Lee
fuente
0

ISO8601 (por ejemplo: HH: MM: SS, 07:55:55 o 18:50:30) en Chrome:

nueva fecha (Date.now ()). toTimeString (). substr (0,8);

en el borde:

nueva Fecha (Date.now ()). toLocaleTimeString ();

Wael Chorfan
fuente
-2
function startTime() {
    var today = new Date(),
        h = checkTime(((today.getHours() + 11) % 12 + 1)),
        m = checkTime(today.getMinutes()),
        s = checkTime(today.getSeconds());
    document.getElementById('demo').innerHTML = h + ":" + m + ":" + s;
    t = setTimeout(function () {
        startTime()
    }, 500);
}
startTime();

}) ();

05:12:00

Umashankar Chaudhary
fuente
Su respuesta de ninguna manera responde al OP.
Sнаđошƒаӽ
¿Qué es la función checkTime?
Weijing Jay Lin
-4

let date = new Date();
let time = date.format("hh:ss")

Владимир Олейников
fuente
3
Ejecutar el código da un error: Uncaught TypeError: date.format no es una función
Alex Leo