Convertir un horodatage Unix en temps en JavaScript


1159

Je stocke du temps dans une base de données MySQL en tant qu'horodatage Unix et qui est envoyé à du code JavaScript. Comment pourrais-je obtenir juste du temps?

Par exemple, au format HH / MM / SS.


5
Multipliez simplement par 1000 car les horodatages JS sont en millisecondes et PHP délivre en quelques secondes.
ankr

Voici un lien très utile avec différents formats de date: timestamp.online/article/… Combinez avec la multiplication par 1000 et le travail sera fait!
Kevin Lemaire

Réponses:


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

Pour plus d'informations sur l'objet Date, reportez-vous à MDN ou à la spécification ECMAScript 5 .


114
Les multiplications @nickf sont triviales sur les processeurs modernes - la concaténation de chaînes nécessitera beaucoup plus de travail!
Alnitak

4
La concaténation devrait consister à lire la mémoire et à écrire la mémoire ... comment quelqu'un pourrait-il concevoir quelque chose qui prend quelque chose de simple, comme l'ajout et le rendre plus compliqué que la multiplication ... demander à un enfant de concaténer et il peut ... la multiplication est plus difficile ... plus la mémoire est conçue pour fonctionner de façon linéaire anyawyas ... Quelqu'un peut-il fournir une référence au commentaire @nickf?

29
En fait, il affichera l'heure au format '10: 2: 2 ', car il n'ajoute pas de 0 supplémentaire avant les valeurs inférieures à 10.
Fireblaze

16
@ user656925 - La multiplication implique des nombres, la concaténation implique des chaînes. Les ordinateurs gèrent les nombres beaucoup plus efficacement que les chaînes. Lorsque la concaténation de chaînes est terminée, il y a beaucoup de gestion de la mémoire en cours en arrière-plan. (Cependant, si vous effectuez déjà une concaténation de chaînes, l'inclusion de quelques caractères supplémentaires dans l'une des chaînes peut en fait être moins coûteuse en moyenne que le seul processeur nécessaire pour multiplier deux nombres ensemble.)
Brilliand

6
Le calcul des nombres @Stallman est la chose la plus fondamentale que les ordinateurs font, et ils sont extrêmement efficaces, à la fois en mémoire et en exécution. Le commentaire de Brilliand ci-dessus est pertinent, bien qu'à mon humble avis la dernière partie de son commentaire soit complètement fausse.
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));


pour HH / MM / SS, utilisez simplement les trois dernières variables et l'heure sera dans votre heure locale, mais si vous voulez obtenir l'heure UTC, utilisez simplement les méthodes getUTC. Voici le code.
shomrat

36
J'ai utilisé cette solution mais je l'ai modifiée pour que les minutes et les secondes apparaissent comme: 03 ou: 09 au lieu de: 3 ou: 9, comme ceci:var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds();
user1985189

3
Bug: getMonth()renvoie un numéro de mois entre 0 et 11, donc a.getMonth() - 1c'est faux.
jcampbell1

195

JavaScript fonctionne en millisecondes, vous devrez donc d'abord convertir l'horodatage UNIX de quelques secondes en millisecondes.

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

80

Je suis amateur de la Date.format()bibliothèque de Jacob Wright , qui implémente le formatage de date JavaScript dans le style de la date()fonction PHP .

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

12
Je sais que c'était une bonne réponse en quelques jours, mais ces jours-ci, étendre des objets natifs js est un anti-modèle.
Peter

3
Cela ne fonctionne plus (plus?) Dans le nœud js format is not a function. Mais cela fonctionne apparemment: stackoverflow.com/a/34015511/7550772
ibodi

71

Utilisation:

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

et pour le temps:

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

voir Date.prototype.toLocaleDateString ()


Il s'agit d'une commande pour obtenir la date (M / D / YYYY), pas l'heure (HH / MM / SS) comme demandé.
Wolfgang

2
juste une note, le nombre "1504095567183" est unix_timestamp * 1000
camillo777

1
De plus, toLocaleStringcomprend à la fois la date et l'heure.
Sean

56

Voici la solution one-liner la plus courte pour formater les secondes en 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"

La méthode Date.prototype.toISOString()renvoie l'heure au format ISO 8601 étendu simplifié , qui est toujours de 24 ou 27 caractères (c'est YYYY-MM-DDTHH:mm:ss.sssZ-à- dire ou ±YYYYYY-MM-DDTHH:mm:ss.sssZrespectivement). Le fuseau horaire est toujours un décalage UTC nul.

NB: Cette solution ne nécessite aucune bibliothèque tierce et est prise en charge dans tous les navigateurs modernes et moteurs JavaScript.


Je colle votre fonction dans la console de Chrome: / Même dans votre violon, ça montre 01:02:00 pour moi! Essayé sur Firefox, mêmes résultats. Très étrange ... Je suis presque sûr que c'est parce que je suis GMT + 1!
Steve Chamaillard

J'ai proposé une modification pour votre réponse qui ignore tout fuseau horaire, donc elle affichera toujours la bonne valeur formatée!
Steve Chamaillard

1
@SteveChamaillard Merci, Steve. Vous aviez raison, toTimeStringne fonctionnait pas bien avec les fuseaux horaires. Malheureusement, votre modification a été rejetée avant que je ne la voie. Cependant, je suggère d'utiliser à la toISOStringplace, car il toGMTStringest obsolète et peut renvoyer des résultats différents sur différentes plates-formes.
VisioN

Encore plus court avec ES6: let time = s => new Date (s * 1e3) .toISOString (). Slice (-13, -5)
SamGoody

28

Je penserais à utiliser une bibliothèque comme momentjs.com , ce qui rend cela très simple:

Basé sur un horodatage Unix:

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

Basé sur une chaîne de date MySQL:

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

3
un autre avantage de moment.js (ou bibliothèques similaires) serait leur prise en charge du temps relatif , pour des messages comme "il y a 6 heures".
martin

Dans vos console.logexemples, j'étais confus au sujet du format en raison du /, mais cela m'a beaucoup aidé.
NetOperator Wibby

Mon horodatage est au format UTC. Y a-t-il un changement à faire ici pour cela? Comment puis-je avoir am / pm?
codec

moment.js est exagéré pour une si petite chose à faire et affectera vos performances. Utilisez plutôt des méthodes natives, cf. Réponse de Dan Alboteanu
Robin Métral

22

L'horodatage UNIX est le nombre de secondes depuis 00:00:00 UTC le 1er janvier 1970 (selon Wikipedia ).

L'argument de l'objet Date en Javascript est le nombre de millisecondes depuis 00:00:00 UTC le 1er janvier 1970 (selon la documentation Javascript de W3Schools ).

Voir le code ci-dessous par exemple:

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

donne:

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

solution à une ligne la plus courte pour formater les secondes en hh: mm: ss: variante:

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


1
en utilisant ceci avec les horodatages PHP unix, j'obtiens + 5h que l'heure réelle pour une raison quelconque: /
keanu_reeves

2
@keanu_reeves - on dirait que vous êtes dans le fuseau horaire de l'est des États-Unis et que les horodatages sont UTC. Essayez de supprimer le .slice (0,19) et je pense que vous verrez le fuseau horaire du résultat est Z (Zulu).
bitfiddler

17

En utilisant Moment.js , vous pouvez obtenir l'heure et la date comme ceci:

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

Et vous ne pouvez obtenir que du temps en utilisant ceci:

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

Savez-vous comment le faire à l'envers, comme convertir ce format DD-MM-YYYY HH: mm: ss en quelque chose comme ceci 1439198499 ??
Kemat Rochi

Salut Kemat, Vous pouvez le faire via ce moment de déclaration ('2009-07-15 00:00:00'). Unix ()
Peter T.

Mon horodatage est au format UTC. Y a-t-il une différence que je dois faire ici pour cela? Comment puis-je avoir am / pm?
codec

Vous pouvez facilement convertir l'horodatage en date usign momentJS, vous consultez
Laeeq

15

Le problème avec les solutions susmentionnées est que si l'heure, la minute ou la seconde n'a qu'un seul chiffre (c'est-à-dire 0-9), l'heure serait erronée, par exemple, elle pourrait être 2: 3: 9, mais elle devrait plutôt être 02: 03:09.

Selon cette page, il semble être une meilleure solution pour utiliser la méthode "toLocaleTimeString" de Date.


5
pour la plupart des solutions Web, c'est la réponse la plus correcte, car elle utilise les paramètres régionaux du client, par exemple 24h contre 12 h / min. Pour une chaîne temporelle, vous utiliseriez alors:date.toLocaleTimeString()
Bachi

1
Cela n'arrivera pas avec la toTimeStringméthode. Vérifiez ici: stackoverflow.com/a/35890537/1249581 .
VisioN

14

Une autre façon - à partir d'une date 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]);


J'obtiens "L'objet ... n'a pas de méthode 'toISOString'"
Aviram Netanel

Mon horodatage est au format UTC. Y a-t-il une différence que je dois faire ici pour cela? Comment puis-je avoir am / pm?
codec

13

Au moment où vous devez utiliser l'horodatage unix:

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

10

Basé sur la réponse de @ shomrat, voici un extrait qui écrit automatiquement datetime comme ceci (un peu similaire à la date de réponse de StackOverflow:) answered Nov 6 '16 at 11:51:

today, 11:23

ou

yersterday, 11:23

ou (si différent mais même année qu'aujourd'hui)

6 Nov, 11:23

ou (si autre année qu'aujourd'hui)

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 solution moderne qui n'a pas besoin d'une bibliothèque de 40 Ko:

Intl.DateTimeFormat est la manière impérialiste non culturellement de formater une date / heure.

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

Concernant "la voie non culturellement impérialiste" : Ne voulez-vous pas dire "la voie non culturellement et non impérialiste" ?
Peter Mortensen

Malheureusement, cette méthode n'est pas compatible avec Safari.
Stephen S.

9

Mon horodatage est récupéré depuis un backend PHP. J'ai essayé toutes les méthodes ci-dessus et cela n'a pas fonctionné. Je suis ensuite tombé sur un tutoriel qui a fonctionné:

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

les méthodes ci-dessus généreront ces résultats

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

Il existe un tas de méthodes qui fonctionnent parfaitement avec les horodatages. Je ne peux pas tous les énumérer


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

Fonctionne bien. Merci
Vlad

6

Faites attention au problème zéro avec certaines des réponses. Par exemple, l'horodatage 1439329773serait converti par erreur en12/08/2015 0:49 .

Je suggère d'utiliser les éléments suivants pour résoudre ce problème:

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

Résultat maintenant:

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

Je ne pense pas que vous ayez besoin d'une fonction supplémentaire et distincte pour obtenir un nombre avec un zéro de fin, chaque fois que cela est nécessaire - voir ma réponse en bas.
trejder

2
@trejder, dans votre exemple, vous DUPLIQUEZ la logique alors qu'avec une fonction supplémentaire vous l'avez en un seul endroit. De plus, vous déclenchez date functon (par exemple getHours ()) toujours deux fois ici - c'est un appel unique. Vous ne pouvez jamais savoir à quel point une fonction de bibliothèque doit être réexécutée (mais je pense que c'est léger pour les dates).
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

Voir Convertisseur date / époque .

Vous devez ParseInt, sinon cela ne fonctionnerait pas:


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

Vous pouvez utiliser la fonction suivante pour convertir votre horodatage au HH:MM:SSformat:

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

Sans passer de séparateur, il utilise :comme séparateur (par défaut):

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

Si vous souhaitez l'utiliser /comme séparateur, passez-le simplement comme deuxième paramètre:

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

Démo

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

Voir aussi ce violon .


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


Ce n'est pas un horodatage Unix: 1435986900000 / Ceci est un horodatage Unix: 1435986900
Orici

cette solution fonctionne pour moi, mais comment puis-je prendre le mois comme Feb Mar Apr au lieu du nombre?
abidinberkay

2

Si vous souhaitez convertir la durée Unix en heures, minutes et secondes réelles, vous pouvez utiliser le code suivant:

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

Le code ci-dessous fournit également des millisecs à 3 chiffres, idéal pour les préfixes de journal de 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 réponse donnée par @Aron fonctionne, mais cela n'a pas fonctionné pour moi car j'essayais de convertir l'horodatage à partir de 1980. J'ai donc apporté quelques modifications comme suit

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

Donc, si vous avez un horodatage à partir d'une autre décennie, utilisez-le. Cela m'a sauvé beaucoup de maux de tête.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.