Konvertieren Sie einen Unix-Zeitstempel in JavaScript in Zeit


1157

Ich speichere Zeit in einer MySQL-Datenbank als Unix-Zeitstempel und diese wird an einen JavaScript-Code gesendet. Wie würde ich nur die Zeit daraus machen?

Zum Beispiel im HH / MM / SS-Format.


5
Multiplizieren Sie einfach mit 1000, da JS-Zeitstempel in Millisekunden angegeben sind und PHP in Sekunden liefert.
Ankr

Hier ist ein sehr nützlicher Link mit verschiedenen Datumsformaten: timestamp.online/article/… Kombinieren Sie mit der Multiplikation mit 1000 und es wird die Arbeit erledigt!
Kevin Lemaire

Antworten:


1732

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

Weitere Informationen zum Date-Objekt finden Sie in MDN oder in der ECMAScript 5-Spezifikation .


114
@nickf-Multiplikationen sind auf modernen CPUs trivial - die Verkettung von Strings erfordert viel mehr Arbeit!
Alnitak

4
Die Verkettung sollte aus dem Lesen des Gedächtnisses und dem Schreiben des Gedächtnisses bestehen. Wie könnte jemand etwas entwerfen, das etwas Einfaches wie Anhängen erfordert und es komplizierter macht als die Multiplikation? Bitten Sie ein Kind, sich zu verketten, und es kann ... Multiplikation ist schwieriger ... Außerdem ist der Speicher so angelegt, dass er linear funktioniert. Kann jemand einen Verweis auf den @ nickf-Kommentar geben?

29
Tatsächlich wird die Zeit im Format '10: 2: 2 'angezeigt, da vor Werten unter 10 keine zusätzliche 0
hinzugefügt wird

16
@ user656925 - Multiplikation beinhaltet Zahlen, Verkettung beinhaltet Strings. Computer verarbeiten Zahlen weitaus effizienter als Zeichenfolgen. Wenn die Verkettung von Zeichenfolgen abgeschlossen ist, wird im Hintergrund viel Speicher verwaltet. (Wenn Sie jedoch ohnehin bereits eine Zeichenfolgenverkettung durchführen, ist das Einfügen einiger zusätzlicher Zeichen in eine der Zeichenfolgen im Durchschnitt möglicherweise weniger kostspielig als der Prozessor, der zum Multiplizieren von zwei Zahlen erforderlich ist.)
Brilliand

6
Die Berechnung der @ Stallman-Zahl ist das Grundlegendste, was Computer tun, und sie sind sowohl im Speicher als auch zur Laufzeit äußerst effizient. Brilliands Kommentar oben ist relevant, obwohl IMHO der letzte Teil seines Kommentars völlig falsch ist.
Alnitak

297

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


Verwenden Sie für HH / MM / SS nur die letzten drei Variablen. Dies ist die Zeit in Ihrer Ortszeit. Wenn Sie jedoch die UTC-Zeit erhalten möchten, verwenden Sie einfach die getUTC-Methoden. Hier ist der Code.
Shomrat

36
Ich habe diese Lösung verwendet, sie aber so angepasst, dass Minuten und Sekunden als: 03 oder: 09 anstelle von: 3 oder: 9 var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds();
angezeigt werden

3
Fehler: getMonth()Gibt eine Monatszahl zwischen 0 und 11 zurück, ist also a.getMonth() - 1falsch.
Jcampbell1

195

JavaScript funktioniert in Millisekunden, daher müssen Sie zuerst den UNIX-Zeitstempel von Sekunden in Millisekunden konvertieren.

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

80

Ich bin Teil der Date.format()Bibliothek von Jacob Wright , die die JavaScript-Datumsformatierung im Stil der PHP- date()Funktion implementiert .

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

12
Ich weiß, es war eine gute Antwort in ein paar Tagen, aber heutzutage ist das Erweitern nativer js-Objekte ein Anti-Muster.
Peter

3
Es funktioniert (nicht mehr?) In Knoten js format is not a function. Aber das funktioniert anscheinend: stackoverflow.com/a/34015511/7550772
ibodi

71

Verwenden:

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

und für die Zeit:

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

siehe Date.prototype.toLocaleDateString ()


Dies ist ein Befehl zum Abrufen des Datums (M / T / JJJJ) und nicht der angeforderten Uhrzeit (HH / MM / SS).
Wolfgang

2
Nur eine Anmerkung, die Nummer "1504095567183" ist unix_timestamp * 1000
camillo777

1
Darüber hinaus toLocaleStringumfasst sowohl Datum und Uhrzeit.
Sean

56

Hier ist die kürzeste Einzeiler-Lösung zum Formatieren von Sekunden wie folgt 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"

Die Methode Date.prototype.toISOString()gibt die Zeit im vereinfachten erweiterten ISO 8601- Format zurück, das immer 24 oder 27 Zeichen lang ist (dh YYYY-MM-DDTHH:mm:ss.sssZbzw. ±YYYYYY-MM-DDTHH:mm:ss.sssZ). Die Zeitzone ist immer Null UTC-Offset.

Hinweis: Diese Lösung erfordert keine Bibliotheken von Drittanbietern und wird in allen modernen Browsern und JavaScript-Engines unterstützt.


Ich füge deine Funktion in die Chrome-Konsole ein: / Selbst in deiner Geige wird für mich 01:02:00 angezeigt! Versucht auf Firefox, gleiche Ergebnisse. Sehr seltsam ... Ich bin mir ziemlich sicher, dass ich GMT + 1 bin!
Steve Chamaillard

Ich habe eine Bearbeitung für Ihre Antwort angeboten, die jede Zeitzone ignoriert, sodass immer der richtige formatierte Wert angezeigt wird!
Steve Chamaillard

1
@SteveChamaillard Danke, Steve. Sie hatten Recht, toTimeStringarbeiteten nicht gut mit Zeitzonen. Leider wurde Ihre Bearbeitung abgelehnt, bevor ich sie sah. Ich würde jedoch empfehlen, toISOStringstattdessen zu verwenden , da dies toGMTStringveraltet ist und möglicherweise unterschiedliche Ergebnisse auf verschiedenen Plattformen zurückgibt.
VisioN

Noch kürzer mit ES6: let time = s => new Date (s * 1e3) .toISOString (). Slice (-13, -5)
SamGoody

28

Ich würde darüber nachdenken, eine Bibliothek wie momentjs.com zu verwenden , was das wirklich einfach macht:

Basierend auf einem Unix-Zeitstempel:

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

Basierend auf einer MySQL-Datumszeichenfolge:

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

3
Ein weiterer Vorteil von moment.js (oder ähnlichen Bibliotheken) wäre die Unterstützung der relativen Zeit für Nachrichten wie "vor 6 Stunden".
Martin

In Ihren console.logBeispielen war ich aufgrund des Formats verwirrt /, aber es hat mir sehr geholfen.
NetOperator Wibby

Mein Zeitstempel ist im UTC-Format. Muss ich hier etwas ändern? Wie kann ich bin / pm haben?
Codec

moment.js ist ein Overkill für so eine kleine Sache und wird Ihre Leistung beeinträchtigen. Verwenden Sie stattdessen native Methoden, vgl. Dan Alboteanus Antwort
Robin Métral

22

Der UNIX-Zeitstempel ist die Anzahl der Sekunden seit 00:00:00 UTC am 1. Januar 1970 (laut Wikipedia) ).

Das Argument des Datumsobjekts in Javascript ist die Anzahl der Millisekunden seit 00:00:00 UTC am 1. Januar 1970 (gemäß der Javascript-Dokumentation von W3Schools ).

Siehe Code unten zum Beispiel:

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

gibt:

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

kürzeste einzeilige Lösung zum Formatieren von Sekunden als hh: mm: ss: Variante:

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


1
Wenn ich dies mit PHP-Unix-Zeitstempeln verwende, bekomme ich aus irgendeinem Grund + 5h als die tatsächliche Zeit: /
keanu_reeves

2
@keanu_reeves - Klingt so, als ob Sie sich in der Zeitzone im Osten der USA befinden und die Zeitstempel UTC sind. Versuchen Sie, die .slice (0,19) zu entfernen, und ich denke, Sie werden sehen, dass die Zeitzone des Ergebnisses Z (Zulu) ist.
Bitfiddler

17

Mit Moment.js können Sie Uhrzeit und Datum wie folgt abrufen :

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

Und Sie können nur Zeit damit bekommen:

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

Wissen Sie, wie man es rückwärts macht, wie das Konvertieren dieses Formats TT-MM-JJJJ HH: mm: ss in so etwas wie dieses 1439198499?
Kemat Rochi

Hallo Kemat, Sie können dies über diesen Anweisungsmoment ('2009-07-15 00:00:00') tun. Unix ()
Peter T.

Mein Zeitstempel ist im UTC-Format. Gibt es einen Unterschied, den ich hier machen muss? Wie kann ich bin / pm haben?
Codec

Sie können usign momentJS leicht umwandeln Zeitstempel Datum, Check - out Sie diesen coderszine.com/convert-timestamp-to-date-using-javascript
Laeeq

15

Das Problem bei den oben genannten Lösungen ist, dass wenn Stunde, Minute oder Sekunde nur eine Ziffer (dh 0-9) hat, die Zeit falsch wäre, z. B. könnte sie 2: 3: 9 sein, aber es sollte eher 02: sein. 03.09.

Laut dieser Seite scheint es eine bessere Lösung zu sein, die "toLocaleTimeString" -Methode von Date zu verwenden.


5
Für die meisten Weblösungen ist dies die richtigste Antwort, da das Gebietsschema des Clients verwendet wird, z. B. das Format 24h vs. 12h am / pm. Für eine Zeitzeichenfolge würden Sie dann verwenden:date.toLocaleTimeString()
Bachi

1
Mit der toTimeStringMethode wird es nicht passieren . Überprüfen Sie hier: stackoverflow.com/a/35890537/1249581 .
VisioN

14

Ein anderer Weg - ab einem ISO 8601- Datum.

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


Ich bekomme "Objekt ... hat keine Methode 'toISOString'"
Aviram Netanel

Mein Zeitstempel ist im UTC-Format. Gibt es einen Unterschied, den ich hier machen muss? Wie kann ich bin / pm haben?
Codec

13

Im Moment müssen Sie den Unix-Zeitstempel verwenden:

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

10

Basierend auf der Antwort von @ shomrat ist hier ein Ausschnitt, der automatisch die Uhrzeit wie diese schreibt (ein bisschen ähnlich dem Datum für Antworten von StackOverflow :) answered Nov 6 '16 at 11:51:

today, 11:23

oder

yersterday, 11:23

oder (wenn anders, aber im selben Jahr als heute)

6 Nov, 11:23

oder (wenn ein anderes Jahr als heute)

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

Die moderne Lösung, die keine 40-KB-Bibliothek benötigt:

Intl.DateTimeFormat ist die nicht kulturell imperialistische Methode zum Formatieren von Datum und Uhrzeit.

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

In Bezug auf "den nicht-kulturell imperialistischen Weg" : Meinen Sie nicht "den nicht-kulturell und nicht-imperialistischen Weg" ?
Peter Mortensen

Leider ist diese Methode nicht mit Safari kompatibel.
Stephen S.

9

Mein Zeitstempel wird von einem PHP-Backend abgerufen. Ich habe alle oben genannten Methoden ausprobiert und es hat nicht funktioniert. Ich bin dann auf ein Tutorial gestoßen, das funktioniert hat:

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

Die oben genannten Methoden erzeugen diese Ergebnisse

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

Es gibt eine Reihe von Methoden, die perfekt mit Zeitstempeln funktionieren. Ich kann sie nicht alle auflisten


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

Funktioniert gut. Danke
Vlad

6

Achten Sie bei einigen Antworten auf das Null-Problem. Zum Beispiel 1439329773würde der Zeitstempel fälschlicherweise in konvertiert12/08/2015 0:49 .

Ich würde vorschlagen, Folgendes zu verwenden, um dieses Problem zu beheben:

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

Jetzt ergibt sich:

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

Ich glaube nicht, dass Sie eine zusätzliche, separate Funktion benötigen, um eine Zahl mit nachfolgender Null zu erhalten, wann immer dies erforderlich ist - siehe meine Antwort unten.
Trejder

2
@trejder, in Ihrem Beispiel VERDOPPELN Sie die Logik, während Sie sie mit zusätzlicher Funktion an einem Ort haben. Außerdem lösen Sie hier immer zweimal eine Datumsfunktion (z. B. getHours ()) aus - es handelt sich um einen einmaligen Aufruf. Sie können nie wissen, wie schwer eine Bibliotheksfunktion ist, die erneut ausgeführt werden muss (ich glaube jedoch, dass sie für Datumsangaben leicht ist).
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

Siehe Datums- / Epochenkonverter .

Sie müssen ParseInt, sonst würde es nicht funktionieren:


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

Mit der folgenden Funktion können Sie Ihren Zeitstempel in ein HH:MM:SSFormat konvertieren:

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 : ':' );
}

Ohne ein Trennzeichen zu übergeben, wird es :als (Standard-) Trennzeichen verwendet:

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

Wenn Sie /als Trennzeichen verwenden möchten , übergeben Sie es einfach als zweiten Parameter:

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

Demo

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

Siehe auch diese Geige .


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


Dies ist kein Unix-Zeitstempel: 1435986900000 / Dies ist ein Unix-Zeitstempel: 1435986900
Orici

Diese Lösung funktioniert für mich, aber wie kann ich den Monat wie Feb Mar Apr anstelle der Zahl nehmen?
Abidinberkay

2

Wenn Sie die Unix-Zeitdauer in echte Stunden, Minuten und Sekunden konvertieren möchten, können Sie den folgenden Code verwenden:

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

Der folgende Code enthält auch dreistellige Millisekunden, ideal für Konsolenprotokollpräfixe:

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

Die Antwort von @Aron funktioniert, aber sie hat bei mir nicht funktioniert, da ich versucht habe, den Zeitstempel ab 1980 zu konvertieren. Daher habe ich einige Änderungen wie folgt vorgenommen

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

Wenn Sie also einen Zeitstempel ab einem weiteren Jahrzehnt haben, verwenden Sie diesen einfach. Es hat mir viel Kopfschmerzen erspart.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.