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.

roflwaffle
la source
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 .

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

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

Dan Alboteanu
la source
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.

Vision
la source
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") );
homtg
la source
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)
Grzegorz Gierlik
la source
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"

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

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

impasse
la source
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");
Valix85
la source
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;
}
Basj
la source
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 ) ) );
Adria
la source
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

James ace
la source
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
la source
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
TechWisdom
la source
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());
Fireblaze
la source
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;
 }
shomrat
la source
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;
simulacre
la source
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 .

John Slegers
la source
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
la source
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;
milkovsky
la source
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
la source
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);

tivoni
la source
1

moment.js

convertir les horodatages en chaîne de date 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
la source
choix alternatif day.js github.com/iamkun/dayjs
xgqfrms
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.

Amey Vartak
la source