Convierta una marca de tiempo de Unix a tiempo en JavaScript


1159

Estoy almacenando tiempo en una base de datos MySQL como una marca de tiempo de Unix y eso se envía a algún código JavaScript. ¿Cómo obtendría el tiempo justo?

Por ejemplo, en formato HH / MM / SS.


55
Simplemente multiplique por 1000 ya que las marcas de tiempo de JS están en milisegundos y PHP entrega en segundos.
ankr

Aquí hay un enlace muy útil con diferentes formatos de fecha: timestamp.online/article/… ¡ Combina con la multiplicación por 1000 y se hace el trabajo!
Kevin Lemaire

Respuestas:


1735

let unix_timestamp = 1549312452
// Create a new JavaScript Date object based on the timestamp
// multiplied by 1000 so that the argument is in milliseconds, not seconds.
var date = new Date(unix_timestamp * 1000);
// Hours part from the timestamp
var hours = date.getHours();
// Minutes part from the timestamp
var minutes = "0" + date.getMinutes();
// Seconds part from the timestamp
var seconds = "0" + date.getSeconds();

// Will display time in 10:30:23 format
var formattedTime = hours + ':' + minutes.substr(-2) + ':' + seconds.substr(-2);

console.log(formattedTime);

Para obtener más información sobre el objeto Fecha, consulte MDN o la especificación ECMAScript 5 .


114
Las multiplicaciones de @nickf son triviales en las CPU modernas: ¡la concatenación de cadenas requerirá mucho más trabajo!
Alnitak

44
La concatenación debe consistir en la lectura de la memoria y la escritura de la memoria ... ¿cómo podría alguien diseñar algo que tome algo simple como agregar y hacer que sea más complicado que la multiplacción ... pedirle a un niño que concatene y pueden ... la multiplicación es más difícil ... Además, la memoria está diseñada para funcionar linealmente anyawyas ... ¿Alguien puede proporcionar una referencia al comentario de @nickf?

29
En realidad, mostrará el tiempo en formato '10: 2: 2 ', ya que no agrega un 0 adicional antes de los valores por debajo de 10.
Fireblaze

16
@ user656925 - La multiplicación involucra números, la concatenación involucra cadenas. Las computadoras manejan números mucho más eficientemente que las cadenas. Cuando se realiza la concatenación de cadenas, hay mucha administración de memoria en segundo plano. (Sin embargo, si ya está haciendo una concatenación de cadenas de todos modos, incluir algunos caracteres adicionales en una de las cadenas en realidad podría ser menos costoso en promedio que la operación de un procesador para multiplicar dos números juntos).
Brilliand

66
El cálculo de números de @Stallman es lo más fundamental que hacen las computadoras, y son extremadamente eficientes, tanto en memoria como en tiempo de ejecución. El comentario de Brilliand anterior es relevante, aunque en mi humilde opinión, la parte final de su comentario es completamente falsa.
Alnitak

298

function timeConverter(UNIX_timestamp){
  var a = new Date(UNIX_timestamp * 1000);
  var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
  var year = a.getFullYear();
  var month = months[a.getMonth()];
  var date = a.getDate();
  var hour = a.getHours();
  var min = a.getMinutes();
  var sec = a.getSeconds();
  var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ;
  return time;
}
console.log(timeConverter(0));


para HH / MM / SS solo use las últimas tres variables y esta es la hora en su hora local, pero si desea obtener la hora UTC, simplemente use los métodos getUTC. Aquí está el código.
Shomrat

36
Utilicé esta solución, pero la modifiqué para que los minutos y segundos aparecieran como: 03 o: 09 en lugar de: 3 o: 9, así:var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds();
user1985189

3
Error: getMonth()devuelve un número de mes entre 0 y 11, por lo tanto, a.getMonth() - 1está mal.
jcampbell1

195

JavaScript funciona en milisegundos, por lo que primero tendrá que convertir la marca de tiempo UNIX de segundos a milisegundos.

var date = new Date(UNIX_Timestamp * 1000);
// Manipulate JavaScript Date object here...

80

Soy parcial a la Date.format()biblioteca de Jacob Wright , que implementa el formato de fecha JavaScript en el estilo de la date()función de PHP .

new Date(unix_timestamp * 1000).format('h:i:s')

12
Sé que fue una buena respuesta en unos días, pero estos días extender objetos nativos js es un antipatrón.
Peter

3
No funciona (¿ya?) En el nodo js format is not a function. Pero esto aparentemente funciona: stackoverflow.com/a/34015511/7550772
ibodi

71

Utilizar:

var s = new Date(1504095567183).toLocaleDateString("en-US")
console.log(s)
// expected output "8/30/2017"  

y por tiempo:

var s = new Date(1504095567183).toLocaleTimeString("en-US")
console.log(s)
// expected output "3:19:27 PM"

ver Date.prototype.toLocaleDateString ()


Este es un comando para obtener la fecha (M / D / AAAA), no la hora (HH / MM / SS) según lo solicitado.
Wolfgang

2
solo una nota, el número "1504095567183" es unix_timestamp * 1000
camillo777

1
Además, toLocaleStringincluye tanto la fecha como la hora.
Sean

56

Aquí está la solución más simple de una línea para formatear segundos como hh:mm:ss:

/**
 * Convert seconds to time string (hh:mm:ss).
 *
 * @param Number s
 *
 * @return String
 */
function time(s) {
    return new Date(s * 1e3).toISOString().slice(-13, -5);
}

console.log( time(12345) );  // "03:25:45"

El método Date.prototype.toISOString()devuelve el tiempo en formato ISO 8601 extendido simplificado , que siempre tiene 24 o 27 caracteres de longitud (es decir, YYYY-MM-DDTHH:mm:ss.sssZo ±YYYYYY-MM-DDTHH:mm:ss.sssZrespectivamente). La zona horaria siempre es cero desplazamiento UTC.

NB: esta solución no requiere ninguna biblioteca de terceros y es compatible con todos los navegadores modernos y motores de JavaScript.


Estoy pegando su función en la consola de Chrome: / ¡Incluso en su violín me muestra 01:02:00! Probado en Firefox, los mismos resultados. Muy extraño ... ¡Estoy bastante seguro de que es porque soy GMT + 1!
Steve Chamaillard

¡He ofrecido una edición para su respuesta que ignora cualquier zona horaria, por lo que siempre mostrará el valor formateado correcto!
Steve Chamaillard

1
@ SteveChamaillard Gracias, Steve. Tenías razón, toTimeStringno funcionaba bien con las zonas horarias. Lamentablemente, su edición fue rechazada antes de que la viera. Sin embargo, sugeriría usar toISOStringen su lugar, ya que toGMTStringestá en desuso y puede devolver resultados diferentes en diferentes plataformas.
VisioN

Aún más corto con ES6: let time = s => new Date (s * 1e3) .toISOString (). Slice (-13, -5)
SamGoody

28

Pensaría en usar una biblioteca como momentjs.com , eso lo hace realmente simple:

Basado en una marca de tiempo Unix:

var timestamp = moment.unix(1293683278);
console.log( timestamp.format("HH/mm/ss") );

Basado en una cadena de fecha MySQL:

var now = moment("2010-10-10 12:03:15");
console.log( now.format("HH/mm/ss") );

3
Otra ventaja de moment.js (o libs similares) sería su soporte de tiempo relativo , para mensajes como "Hace 6 horas".
Martin

En sus console.logejemplos, estaba confundido sobre el formato debido al /, pero me ayudó mucho.
NetOperator Wibby

Mi marca de tiempo está en formato UTC. ¿Algún cambio que deba hacer aquí para eso? ¿Cómo puedo tener am / pm?
códec

moment.js es demasiado exagerado para hacer algo tan pequeño y afectará su rendimiento. Utilice métodos nativos en su lugar, cf. Respuesta de Dan Alboteanu
Robin Métral

22

La marca de tiempo UNIX es el número de segundos desde las 00:00:00 UTC del 1 de enero de 1970 (según Wikipedia ).

El objeto Argumento de fecha en Javascript es el número de milisegundos desde las 00:00:00 UTC del 1 de enero de 1970 (según la documentación de Javascript de W3Schools ).

Vea el código a continuación, por ejemplo:

    function tm(unix_tm) {
        var dt = new Date(unix_tm*1000);
        document.writeln(dt.getHours() + '/' + dt.getMinutes() + '/' + dt.getSeconds() + ' -- ' + dt + '<br>');

    }

tm(60);
tm(86400);

da:

1/1/0 -- Thu Jan 01 1970 01:01:00 GMT+0100 (Central European Standard Time)
1/0/0 -- Fri Jan 02 1970 01:00:00 GMT+0100 (Central European Standard Time)

19

La solución de una línea más corta para formatear segundos como hh: mm: ss: variante:

console.log(new Date(1549312452 * 1000).toISOString().slice(0, 19).replace('T', ' '));
// "2019-02-04 20:34:12"


1
cuando uso esto con las marcas de tiempo de PHP unix obtengo + 5h que el tiempo real por alguna razón: /
keanu_reeves

2
@keanu_reeves: suena como si estuvieras en la zona horaria del este de EE. UU. y las marcas de tiempo son UTC. Intente eliminar el .slice (0,19) y creo que verá que la zona horaria del resultado es Z (Zulu).
bitfiddler

17

Usando Moment.js , puede obtener la hora y la fecha de esta manera:

var dateTimeString = moment(1439198499).format("DD-MM-YYYY HH:mm:ss");

Y solo puede obtener tiempo usando esto:

var timeString = moment(1439198499).format("HH:mm:ss");

¿Sabes cómo hacerlo al revés, como convertir este formato DD-MM-AAAA HH: mm: ss a algo como esto 1439198499 ??
Kemat Rochi

Hola Kemat, puedes hacerlo a través de este momento de declaración ('2009-07-15 00:00:00'). Unix ()
Peter T.

Mi marca de tiempo está en formato UTC. ¿Hay alguna diferencia que deba hacer aquí para eso? ¿Cómo puedo tener am / pm?
códec

Puede convertir fácilmente la marca de tiempo a la fecha usign momentJS, consulte
Laeeq

15

El problema con las soluciones antes mencionadas es que si la hora, minuto o segundo tiene solo un dígito (es decir, 0-9), la hora sería incorrecta, por ejemplo, podría ser 2: 3: 9, pero debería ser 02: 03:09.

Según esta página , parece ser una mejor solución para utilizar el método "toLocaleTimeString" de Date.


55
Para la mayoría de las soluciones web, esta es la respuesta más correcta, ya que utiliza la configuración regional del cliente, por ejemplo, formato 24h vs. 12h am / pm. Para una cadena de tiempo, entonces usarías:date.toLocaleTimeString()
Bachi

1
No sucederá con el toTimeStringmétodo. Consulte aquí: stackoverflow.com/a/35890537/1249581 .
VisioN

14

Otra forma: desde una fecha ISO 8601 .

var timestamp = 1293683278;
var date = new Date(timestamp * 1000);
var iso = date.toISOString().match(/(\d{2}:\d{2}:\d{2})/)
alert(iso[1]);


Obtengo "Objeto ... no tiene método 'toISOString'"
Aviram Netanel

Mi marca de tiempo está en formato UTC. ¿Hay alguna diferencia que deba hacer aquí para eso? ¿Cómo puedo tener am / pm?
códec

13

En este momento debe usar la marca de tiempo de Unix:

var dateTimeString = moment.unix(1466760005).format("DD-MM-YYYY HH:mm:ss");

10

Basado en la respuesta de @ shomrat, aquí hay un fragmento que escribe automáticamente datetime de esta manera (un poco similar a la fecha de StackOverflow para las respuestas:) answered Nov 6 '16 at 11:51:

today, 11:23

o

yersterday, 11:23

o (si es diferente pero el mismo año que hoy)

6 Nov, 11:23

o (si es otro año que hoy)

6 Nov 2016, 11:23

function timeConverter(t) {     
    var a = new Date(t * 1000);
    var today = new Date();
    var yesterday = new Date(Date.now() - 86400000);
    var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var year = a.getFullYear();
    var month = months[a.getMonth()];
    var date = a.getDate();
    var hour = a.getHours();
    var min = a.getMinutes();
    if (a.setHours(0,0,0,0) == today.setHours(0,0,0,0))
        return 'today, ' + hour + ':' + min;
    else if (a.setHours(0,0,0,0) == yesterday.setHours(0,0,0,0))
        return 'yesterday, ' + hour + ':' + min;
    else if (year == today.getFullYear())
        return date + ' ' + month + ', ' + hour + ':' + min;
    else
        return date + ' ' + month + ' ' + year + ', ' + hour + ':' + min;
}

9

La solución moderna que no necesita una biblioteca de 40 KB:

Intl.DateTimeFormat es la forma no culturalmente imperialista de formatear una fecha / hora.

// Setup once
var options = {
    //weekday: 'long',
    //month: 'short',
    //year: 'numeric',
    //day: 'numeric',
    hour: 'numeric',
    minute: 'numeric',
    second: 'numeric'
},
intlDate = new Intl.DateTimeFormat( undefined, options );

// Reusable formatter
var timeStamp = 1412743273;
console.log( intlDate.format( new Date( 1000 * timeStamp ) ) );

Con respecto a "la forma no culturalmente imperialista" : ¿No quiere decir "la forma no cultural y no imperialista" ?
Peter Mortensen

Lamentablemente, este método no es compatible con Safari.
Stephen S.

9

Mi marca de tiempo se obtiene de un backend de PHP. Intenté todos los métodos anteriores y no funcionó. Luego me encontré con un tutorial que funcionó:

var d =val.timestamp;
var date=new Date(+d); //NB: use + before variable name

console.log(d);
console.log(date.toDateString());
console.log(date.getFullYear());
console.log(date.getMinutes());
console.log(date.getSeconds());
console.log(date.getHours());
console.log(date.toLocaleTimeString());

los métodos anteriores generarán estos resultados

1541415288860
Mon Nov 05 2018 
2018 
54 
48 
13
1:54:48 PM

Hay muchos métodos que funcionan perfectamente con marcas de tiempo. No puedo enumerarlos a todos


8
function getTIMESTAMP() {
  var date = new Date();
  var year = date.getFullYear();
  var month = ("0" + (date.getMonth() + 1)).substr(-2);
  var day = ("0" + date.getDate()).substr(-2);
  var hour = ("0" + date.getHours()).substr(-2);
  var minutes = ("0" + date.getMinutes()).substr(-2);
  var seconds = ("0" + date.getSeconds()).substr(-2);

  return year + "-" + month + "-" + day + " " + hour + ":" + minutes + ":" + seconds;
}

//2016-01-14 02:40:01

Funciona bien. Gracias
Vlad

6

Presta atención al problema cero con algunas de las respuestas. Por ejemplo, la marca de tiempo 1439329773se convertiría por error a 12/08/2015 0:49.

Sugeriría usar lo siguiente para superar este problema:

var timestamp = 1439329773; // replace your timestamp
var date = new Date(timestamp * 1000);
var formattedDate = ('0' + date.getDate()).slice(-2) + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear() + ' ' + ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2);
console.log(formattedDate);

Ahora da como resultado:

12/08/2015 00:49

5
// Format value as two digits 0 => 00, 1 => 01
function twoDigits(value) {
   if(value < 10) {
    return '0' + value;
   }
   return value;
}

var date = new Date(unix_timestamp*1000);
// display in format HH:MM:SS
var formattedTime = twoDigits(date.getHours()) 
      + ':' + twoDigits(date.getMinutes()) 
      + ':' + twoDigits(date.getSeconds());

No creo que necesite una función adicional y separada para obtener un número con cero al final, siempre que sea necesario; consulte mi respuesta al final.
trejder

2
@trejder, en tu ejemplo, DUPLICAS la lógica mientras que con una función adicional la tienes en un solo lugar. También activa la función de fecha (por ejemplo, getHours ()) siempre dos veces mientras está aquí; es una llamada única. Nunca se puede saber qué tan pesada es alguna función de biblioteca para volver a ejecutarse (sin embargo, creo que es ligera para las fechas).
walv

4
function timeConverter(UNIX_timestamp){
 var a = new Date(UNIX_timestamp*1000);
     var hour = a.getUTCHours();
     var min = a.getUTCMinutes();
     var sec = a.getUTCSeconds();
     var time = hour+':'+min+':'+sec ;
     return time;
 }

4

Ver Fecha / Epoch Converter .

Necesitas hacerlo ParseInt, de lo contrario no funcionaría:


if (!window.a)
    window.a = new Date();

var mEpoch = parseInt(UNIX_timestamp);

if (mEpoch < 10000000000)
    mEpoch *= 1000;

------
a.setTime(mEpoch);
var year = a.getFullYear();
...
return time;

4

Puede usar la siguiente función para convertir su marca de tiempo a HH:MM:SSformato:

var convertTime = function(timestamp, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    var date = timestamp ? new Date(timestamp * 1000) : new Date();
    return [
        pad(date.getHours()),
        pad(date.getMinutes()),
        pad(date.getSeconds())
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

Sin pasar un separador, se usa :como separador (predeterminado):

time = convertTime(1061351153); // --> OUTPUT = 05:45:53

Si desea usarlo /como separador, simplemente páselo como el segundo parámetro:

time = convertTime(920535115, '/'); // --> OUTPUT = 09/11/55

Manifestación

var convertTime = function(timestamp, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    var date = timestamp ? new Date(timestamp * 1000) : new Date();
    return [
        pad(date.getHours()),
        pad(date.getMinutes()),
        pad(date.getSeconds())
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

document.body.innerHTML = '<pre>' + JSON.stringify({
    920535115 : convertTime(920535115, '/'),
    1061351153 : convertTime(1061351153, ':'),
    1435651350 : convertTime(1435651350, '-'),
    1487938926 : convertTime(1487938926),
    1555135551 : convertTime(1555135551, '.')
}, null, '\t') +  '</pre>';

Ver también este violín .


3

 function getDateTimeFromTimestamp(unixTimeStamp) {
        var date = new Date(unixTimeStamp);
        return ('0' + date.getDate()).slice(-2) + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear() + ' ' + ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2);
      }

    var myTime = getDateTimeFromTimestamp(1435986900000);
    console.log(myTime); // output 01/05/2000 11:00


Esta no es una marca de tiempo de Unix: 1435986900000 / Esta es una marca de tiempo de Unix: 1435986900
Orici

esta solución funciona para mí, pero ¿cómo puedo tomar el mes como febrero, marzo, abril en lugar del número?
abidinberkay

2

Si desea convertir la duración del tiempo de Unix en horas, minutos y segundos reales, puede usar el siguiente código:

var hours = Math.floor(timestamp / 60 / 60);
var minutes = Math.floor((timestamp - hours * 60 * 60) / 60);
var seconds = Math.floor(timestamp - hours * 60 * 60 - minutes * 60 );
var duration = hours + ':' + minutes + ':' + seconds;

1
function getDateTime(unixTimeStamp) {

    var d = new Date(unixTimeStamp);
    var h = (d.getHours().toString().length == 1) ? ('0' + d.getHours()) : d.getHours();
    var m = (d.getMinutes().toString().length == 1) ? ('0' + d.getMinutes()) : d.getMinutes();
    var s = (d.getSeconds().toString().length == 1) ? ('0' + d.getSeconds()) : d.getSeconds();

    var time = h + '/' + m + '/' + s;

    return time;
}

var myTime = getDateTime(1435986900000);
console.log(myTime); // output 01/15/00

1

El siguiente código también proporciona milisegundos de 3 dígitos, ideal para prefijos de registro de consola:

const timeStrGet = date => {
    const milliSecsStr = date.getMilliseconds().toString().padStart(3, '0') ;
    return `${date.toLocaleTimeString('it-US')}.${milliSecsStr}`;
};

setInterval(() => console.log(timeStrGet(new Date())), 299);



1

La respuesta dada por @Aron funciona, pero no funcionó para mí, ya que estaba tratando de convertir la marca de tiempo a partir de 1980. Así que hice algunos cambios de la siguiente manera

function ConvertUnixTimeToDateForLeap(UNIX_Timestamp) {
    var dateObj = new Date(1980, 0, 1, 0, 0, 0, 0);
    dateObj.setSeconds(dateObj.getSeconds() + UNIX_Timestamp);
    return dateObj;  
}

document.body.innerHTML = 'TimeStamp : ' + ConvertUnixTimeToDateForLeap(1269700200);

Entonces, si tiene una marca de tiempo que comienza en otra década más o menos, solo use esto. Me ahorró mucho dolor de cabeza.

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.