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.

roflwaffle
fuente
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 .

Aron Rotteveel
fuente
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));

shomrat
fuente
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...
Steve Harrison
fuente
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')
Brad Koch
fuente
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 ()

Dan Alboteanu
fuente
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.

Visión
fuente
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") );
homtg
fuente
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)
Grzegorz Gierlik
fuente
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"

Luis David
fuente
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");
Peter T.
fuente
¿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.

Bernie
fuente
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]);

muerto
fuente
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");
Valix85
fuente
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;
}
Basj
fuente
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 ) ) );
Adria
fuente
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

James Ace
fuente
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
synan54
fuente
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
TechWisdom
fuente
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());
Llamas de fuego
fuente
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;
 }
shomrat
fuente
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;
farsa
fuente
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 .

John Slegers
fuente
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

Ashish Gupta
fuente
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;
milkovsky
fuente
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
Bhaumik Mehta
fuente
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);

tivoni
fuente
1

moment.js

convertir marcas de tiempo a cadena de fecha en js

https://momentjs.com/

moment().format('YYYY-MM-DD hh:mm:ss');
// "2020-01-10 11:55:43"

moment(1578478211000).format('YYYY-MM-DD hh:mm:ss');
// "2020-01-08 06:10:11"

xgqfrms
fuente
opción alternativa day.js github.com/iamkun/dayjs
xgqfrms
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.

Amey Vartak
fuente