Converti un timestamp Unix in tempo in JavaScript


1159

Sto memorizzando il tempo in un database MySQL come un timestamp Unix e che viene inviato ad un codice JavaScript. Come avrei avuto il tempo di uscirne?

Ad esempio, nel formato HH / MM / SS.


5
Basta moltiplicare per 1000 poiché i timestamp JS sono in millisecondi e PHP consegna in pochi secondi.
ankr

Ecco un link molto utile con diversi formati di data: timestamp.online/article/… Combina con la moltiplicazione per 1000 e fa il lavoro!
Kevin Lemaire il

Risposte:


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);

Per ulteriori informazioni sull'oggetto Date, fare riferimento a MDN o alla specifica ECMAScript 5 .


114
Le moltiplicazioni di @nickf sono banali per le moderne CPU: la concatenazione di stringhe richiederà molto più lavoro!
Alnitak,

4
La concatenazione dovrebbe consistere nella lettura della memoria e nella scrittura della memoria ... come potrebbe qualcuno progettare qualcosa che prende qualcosa di semplice come accodarsi e renderlo più complicato della multiplazione ... chiedere a un bambino di concatenare e loro possono ... la multiplo è più difficile ... inoltre la memoria è progettata per funzionare in modo lineare comunque ... Qualcuno può fornire un riferimento al commento @nickf?

29
In realtà visualizzerà l'ora nel formato '10: 2: 2 ', poiché non aggiunge un ulteriore 0 prima di valori inferiori a 10.
Fireblaze,

16
@ user656925 - La moltiplicazione comporta numeri, la concatenazione implica stringhe. I computer gestiscono i numeri in modo molto più efficiente delle stringhe. Al termine della concatenazione di stringhe, in background è in corso molta gestione della memoria. (Tuttavia, se stai già eseguendo una concatenazione di stringhe comunque, includere alcuni caratteri extra in una delle stringhe potrebbe in realtà essere meno costoso in media rispetto a un processore operato per moltiplicare due numeri insieme.)
Brilliand

6
Il calcolo dei numeri di @Stallman è la cosa più fondamentale che fanno i computer e sono estremamente efficienti, sia in memoria che in runtime. Il commento di Brilliand sopra è pertinente, sebbene l'IMHO la parte finale del suo commento sia 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));


per HH / MM / SS usate solo le ultime tre variabili e questa è l'ora sarà nella vostra ora locale ma se volete ottenere l'ora UTC usate semplicemente i metodi getUTC. Ecco il codice.
shomrat,

36
Ho usato questa soluzione ma l'ho modificata in modo che minuti e secondi fossero visualizzati come: 03 o: 09 anziché: 3 o: 9, in questo modo:var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds();
user1985189

3
Bug: getMonth()restituisce un numero di mese compreso tra 0 e 11, quindi a.getMonth() - 1è errato.
jcampbell1,

195

JavaScript funziona in millisecondi, quindi dovrai prima convertire il timestamp UNIX da secondi a millisecondi.

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

80

Sono parziale della Date.format()libreria di Jacob Wright , che implementa la formattazione della data JavaScript nello stile della date()funzione di PHP .

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

12
So che è stata una buona risposta in pochi giorni, ma in questi giorni l'estensione degli oggetti js nativi è un anti-pattern.
Peter,

3
Non funziona (più?) Nel nodo js format is not a function. Ma a quanto pare questo funziona: stackoverflow.com/a/34015511/7550772
ibodi

71

Uso:

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

e per tempo:

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

vedi Date.prototype.toLocaleDateString ()


Questo è un comando per ottenere la data (M / D / AAAA), non l'ora (HH / MM / SS) come richiesto.
Wolfgang

2
solo una nota, il numero "1504095567183" è unix_timestamp * 1000
camillo777

1
Inoltre, toLocaleStringinclude sia la data che l'ora.
Sean

56

Ecco la soluzione one-liner più breve per formattare i secondi come 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"

Il metodo Date.prototype.toISOString()restituisce il tempo in formato ISO 8601 esteso semplificato , che è sempre lungo 24 o 27 caratteri (ovvero YYYY-MM-DDTHH:mm:ss.sssZo ±YYYYYY-MM-DDTHH:mm:ss.sssZrispettivamente). Il fuso orario è sempre zero UTC offset.

NB: questa soluzione non richiede librerie di terze parti ed è supportata in tutti i browser e motori JavaScript moderni.


Sto incollando la tua funzione nella console di Chrome: / Anche nel tuo violino sta mostrando 01:02:00 per me! Ho provato su Firefox, gli stessi risultati. Molto strano ... Sono abbastanza sicuro che sono GMT + 1!
Steve Chamaillard,

Ho offerto una modifica per la tua risposta che ignora qualsiasi fuso orario, quindi mostrerà sempre il giusto valore formattato!
Steve Chamaillard,

1
@SteveChamaillard Grazie, Steve. Avevi ragione, toTimeStringnon funzionava bene con i fusi orari. Purtroppo la tua modifica è stata respinta prima che io la vedessi. Tuttavia, suggerirei di utilizzare toISOStringinvece, poiché toGMTStringè obsoleto e potrebbe restituire risultati diversi su piattaforme diverse.
VisioN,

Ancora più breve con ES6: let time = s => new Date (s * 1e3) .toISOString (). Slice (-13, -5)
SamGoody

28

Penserei di usare una libreria come momentjs.com , che rende tutto molto semplice:

Basato su un timestamp Unix:

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

Basato su una stringa di date MySQL:

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

3
un altro vantaggio di moment.js (o librerie simili) sarebbe il loro supporto del tempo relativo , per messaggi come "6 ore fa".
martin,

Nei tuoi console.logesempi, ero confuso riguardo al formato a causa del /, ma mi ha aiutato molto.
NetOperator Wibby

Il mio timestamp è in formato UTC. Qualche cambiamento che devo fare qui per quello? Come posso avere am / pm?
codec,

moment.js è troppo complicato per una cosa così piccola da fare e influenzerà le tue prestazioni. Utilizzare invece metodi nativi, cfr. Risposta di Dan Alboteanu
Robin Métral,

22

Il timestamp UNIX è il numero di secondi dalle 00:00:00 UTC del 1 ° gennaio 1970 (secondo Wikipedia ).

L'argomento dell'oggetto Date in Javascript è il numero di millisecondi dalle 00:00:00 UTC del 1 ° gennaio 1970 (secondo la documentazione Javascript di W3Schools ).

Vedi il codice sotto per esempio:

    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);

dà:

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

soluzione one-liner più corta per formattare i secondi come hh: mm: ss: variante:

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


1
quando lo utilizzo con i timestamp di PHP unix ottengo + 5h rispetto all'ora effettiva per qualche motivo: /
keanu_reeves

2
@keanu_reeves: sembra che tu sia nel fuso orario degli Stati Uniti orientali e che i timestamp siano UTC. Prova a rimuovere .slice (0,19) e penso che vedrai che il fuso orario del risultato è Z (Zulu).
Bitfiddler

17

Usando Moment.js , puoi ottenere ora e data in questo modo:

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

E puoi ottenere solo tempo usando questo:

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

Sai come farlo al contrario, come convertire questo formato GG-MM-AAAA HH: mm: ss in qualcosa del genere 1439198499 ??
Kemat Rochi,

Ciao Kemat, puoi farlo tramite questo momento di dichiarazione ("15-07-2009 00:00:00"). Unix ()
Peter T.

Il mio timestamp è in formato UTC. Qualche differenza che devo fare qui per quello? Come posso avere am / pm?
codec,

Puoi facilmente convertire il timestamp in data usign moment JS, dai un'occhiata a questo coderszine.com/convert-timestamp-to-date-using-javascript
Laeeq

15

Il problema con le soluzioni di cui sopra è che se ora, minuto o secondo ha solo una cifra (cioè 0-9), il tempo sarebbe sbagliato, ad esempio potrebbe essere 2: 3: 9, ma dovrebbe piuttosto essere 02: 03:09.

Secondo questa pagina sembra essere una soluzione migliore per utilizzare il metodo "toLocaleTimeString" di Date.


5
per la maggior parte delle soluzioni Web, questa è la risposta più corretta, poiché utilizza le impostazioni internazionali del client, ad esempio il formato 24h contro 12h am / pm. Per una stringa di tempo, useresti quindi:date.toLocaleTimeString()
Bachi,

1
Non accadrà con il toTimeStringmetodo. Controlla qui: stackoverflow.com/a/35890537/1249581 .
VisioN,

14

Un altro modo: da una data 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]);


Ottengo "L'oggetto ... non ha un metodo 'toISOString'"
Aviram Netanel

Il mio timestamp è in formato UTC. Qualche differenza che devo fare qui per quello? Come posso avere am / pm?
codec,

13

Al momento è necessario utilizzare unix timestamp:

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

10

Basato sulla risposta di @ shomrat, ecco uno snippet che scrive automaticamente datetime in questo modo (un po 'simile alla data di StackOverflow per le risposte:) answered Nov 6 '16 at 11:51:

today, 11:23

o

yersterday, 11:23

o (se diverso ma lo stesso anno di oggi)

6 Nov, 11:23

o (se un altro anno rispetto ad oggi)

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 soluzione moderna che non necessita di una libreria da 40 KB:

Intl.DateTimeFormat è il modo non culturalmente imperialista di formattare una data / ora.

// 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 ) ) );

Riguardo a "il modo non culturalmente imperialista" : non intendi "il modo non culturalmente e non imperialista" ?
Peter Mortensen,

Purtroppo questo metodo non è compatibile con Safari.
Stephen S.

9

Il mio timestamp viene recuperato da un back-end PHP. Ho provato tutti i metodi sopra e non ha funzionato. Mi sono imbattuto in un tutorial che ha funzionato:

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());

i metodi sopra genereranno questi risultati

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

Esistono molti metodi che funzionano perfettamente con i timestamp. Non posso elencarli tutti


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

Funziona bene. Grazie
Vlad

6

Presta attenzione al problema zero con alcune delle risposte. Ad esempio, il timestamp 1439329773verrebbe erroneamente convertito in12/08/2015 0:49 .

Suggerirei di utilizzare quanto segue per superare questo 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);

Ora risulta in:

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());

Non penso che tu abbia bisogno di una funzione extra, separata, per ottenere un numero con zero finale, ogni volta che è necessario - vedi la mia risposta in fondo.
Trejder,

2
@trejder, nel tuo esempio, DUPLICATE la logica mentre con una funzione extra la hai in un unico posto. Inoltre attivi la funzione date (ad es. GetHours ()) sempre due volte mentre sei qui - è una chiamata di una volta. Non puoi mai sapere quanto deve essere rieseguita una funzione di libreria (tuttavia credo che sia leggera per le date).
venerdì

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

Vedi Convertitore data / epoca .

È necessario ParseInt, altrimenti non funzionerebbe:


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

È possibile utilizzare la seguente funzione per convertire il timestamp nel 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 : ':' );
}

Senza passare un separatore, utilizza :come separatore (predefinito):

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

Se si desidera utilizzare /come separatore, basta passarlo come secondo parametro:

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

dimostrazione

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>';

Vedi anche questo violino .


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


Questo non è un timestamp Unix: 1.435.986,9 milioni / Questo è un timestamp Unix: 1435,9869 milioni
Orici

questa soluzione funziona per me, ma come posso prendere il mese come febbraio mar apr invece del numero?
abidinberkay

2

Se si desidera convertire la durata del tempo Unix in ore, minuti e secondi reali, è possibile utilizzare il seguente codice:

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

Il codice seguente fornisce anche millisec a 3 cifre, ideale per i prefissi di log della console:

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 risposta data da @Aron funziona, ma non ha funzionato per me poiché stavo cercando di convertire il timestamp a partire dal 1980. Quindi ho apportato alcune modifiche come segue

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);

Quindi, se hai un timestamp a partire da un altro decennio o giù di lì, usa questo. Mi ha risparmiato molto mal di testa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.