web-dev-qa-db-fra.com

Conversion période UTC en date locale

Je me bats avec cela depuis un moment maintenant. J'essaie de convertir Epoch en un objet de date. L'époque m'a été envoyée en UTC. Chaque fois que vous passez new Date() une époque, cela suppose qu’il s’agit d’une époque locale. J’ai essayé de créer un objet UTC, puis d’utiliser setTime() pour l’ajuster à la bonne époque, mais la seule méthode qui semble utile est toUTCString() et les chaînes ne m’aident pas. Si je passe cette chaîne à une nouvelle date, il devrait remarquer qu’il s’agit du temps UTC, mais ce n’est pas le cas.

new Date( new Date().toUTCString() ).toLocaleString()

Ma tentative suivante consistait à essayer de faire la différence entre Epoch actuel local et Epoch actuel, mais je n’ai pas pu l’obtenir non plus.

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()

Cela ne me donne que de très petites différences, moins de 1000, ce qui est en millisecondes.

Aucune suggestion?

219
Shane Reustle

Je pense avoir une solution plus simple: réglez la date initiale sur Epoch et ajoutez des unités UTC. Supposons que vous ayez une var Epoch UTC stockée en quelques secondes. Que diriez-vous de 1234567890. Pour convertir cela en une date appropriée dans le fuseau horaire local:

var utcSeconds = 1234567890;
var d = new Date(0); // The 0 there is the key, which sets the date to the Epoch
d.setUTCSeconds(utcSeconds);

d est maintenant une date (dans mon fuseau horaire) définie sur Fri Feb 13 2009 18:31:30 GMT-0500 (EST)

395
user1030503

C'est simple, new Date() ne prend que quelques millisecondes, par exemple. 

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)
150
djechlin

Et juste pour les journaux, je l’ai fait en utilisant Moment.js library, que j’utilisais quand même pour le formatage.

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
29
Gus
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}
16
chris

L’époque est exprimée en secondes à partir du 1er janvier 1970. date.getTime() renvoie millisecondes à partir du 1er janvier 1970, donc .. si vous avez un horodatage de période, convertissez-le en un horodatage JavaScript en le multipliant par 1000 .

   function epochToJsDate(ts){
        // ts = Epoch timestamp
        // returns date obj
        return new Date(ts*1000);
   }

   function jsDateToEpoch(d){
        // d = javascript date obj
        // returns Epoch timestamp
        return (d.getTime()-d.getMilliseconds())/1000;
   }
15
logic8

Voulez-vous simplement convertir une chaîne UTC en chaîne "locale"? Vous pourriez faire:

var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
    var t0 = new Date(dtstr);
    var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
    var t2 = (2 * t0) - t1;
    return new Date(t2).toString();
})(utc_string);
3
ZagNut

Convertir l'heure actuelle en [ms] en 24 heures. Vous devrez peut-être spécifier l'option au format désactiver 12 heures .

$ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"

2/7/2018, 19:35:24

ou comme JS:

var date = new Date(Date.now()); 
console.log(date.toLocaleString('en-GB', { hour12:false } ));
// 2/7/2018, 19:35:24

console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } ));
// 19:35:24

Note: L'utilisation de en-GB ici, n'est qu'un choix (aléatoire) d'un lieu au format 24 heures, ce n'est pas votre fuseau horaire!

2
not2qubit

Ajout à la réponse ci-dessus par @djechlin

d = '1394104654000';
new Date(parseInt(d));

convertit l’époque en date lisible par l’homme. N'oubliez pas que ce type d'époque est un nombre entier. 

1
Sarvar Nishonboev

Si vous préférez résoudre les conversions d'horodatages et de dates à partir de et vers UTC et l'heure locale sans bibliothèques telles que moment.js, consultez l'option ci-dessous.

Pour les applications qui utilisent les horodatages UTC, vous devrez peut-être afficher la date dans le navigateur en tenant compte du fuseau horaire local et de l'heure avancée, le cas échéant. Éditer une date à une heure d'été différente même si dans le même fuseau horaire peut s'avérer délicat.

Les extensions Number et Date ci-dessous vous permettent d'afficher et d'obtenir des dates dans le fuseau horaire des horodatages. Par exemple, supposons que vous soyez à Vancouver. Si vous modifiez une date en juillet ou en décembre, cela peut vouloir dire que vous modifiez une date au format PST ou PDT.

Je vous recommande de vérifier l'extrait de code ci-dessous pour tester cette solution.

Conversions en millisecondes

Number.prototype.toLocalDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));

    return value;
};

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

Conversions à partir de dates

Date.prototype.getUTCTime = function () {
    return this.getTime() - (this.getTimezoneOffset() * 60000);
};

Utilisation

// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();

// Eliminates the timezone and daylight savings if applicable
new Date(2017, 6, 10).getUTCTime();

Voyez par vous-même

// Extending Number

Number.prototype.toLocalDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));

    return value;
};

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

// Extending Date

Date.prototype.getUTCTime = function () {
    return this.getTime() - (this.getTimezoneOffset() * 60000);
};

// Getting the demo to work
document.getElementById('m-to-local-button').addEventListener('click', function () {
  var displayElement = document.getElementById('m-to-local-display'),
      value = document.getElementById('m-to-local').value,
      milliseconds = parseInt(value);
  
  if (typeof milliseconds === 'number')
    displayElement.innerText = (milliseconds).toLocalDate().toISOString();
  else
    displayElement.innerText = 'Set a value';
}, false);

document.getElementById('m-to-utc-button').addEventListener('click', function () {
  var displayElement = document.getElementById('m-to-utc-display'),
      value = document.getElementById('m-to-utc').value,
      milliseconds = parseInt(value);
  
  if (typeof milliseconds === 'number')
    displayElement.innerText = (milliseconds).toUTCDate().toISOString();
  else
    displayElement.innerText = 'Set a value';
}, false);

document.getElementById('date-to-utc-button').addEventListener('click', function () {
  var displayElement = document.getElementById('date-to-utc-display'),
      yearValue = document.getElementById('date-to-utc-year').value || '1970',
      monthValue = document.getElementById('date-to-utc-month').value || '0',
      dayValue = document.getElementById('date-to-utc-day').value || '1',
      hourValue = document.getElementById('date-to-utc-hour').value || '0',
      minuteValue = document.getElementById('date-to-utc-minute').value || '0',
      secondValue = document.getElementById('date-to-utc-second').value || '0',
      year = parseInt(yearValue),
      month = parseInt(monthValue),
      day = parseInt(dayValue),
      hour = parseInt(hourValue),
      minute = parseInt(minuteValue),
      second = parseInt(secondValue);
  
  displayElement.innerText = new Date(year, month, day, hour, minute, second).getUTCTime();
}, false);
<link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.11/semantic.css" rel="stylesheet"/>

<div class="ui container">
  <p></p>
  
  <h3>Milliseconds to local date</h3>
  <input id="m-to-local" placeholder="Timestamp" value="0" /> <button id="m-to-local-button">Convert</button>
  <em id="m-to-local-display">Set a value</em>

  <h3>Milliseconds to UTC date</h3>
  <input id="m-to-utc" placeholder="Timestamp" value="0" /> <button id="m-to-utc-button">Convert</button>
  <em id="m-to-utc-display">Set a value</em>
  
  <h3>Date to milliseconds in UTC</h3>
  <input id="date-to-utc-year" placeholder="Year" style="width: 4em;" />
  <input id="date-to-utc-month" placeholder="Month" style="width: 4em;" />
  <input id="date-to-utc-day" placeholder="Day" style="width: 4em;" />
  <input id="date-to-utc-hour" placeholder="Hour" style="width: 4em;" />
  <input id="date-to-utc-minute" placeholder="Minute" style="width: 4em;" />
  <input id="date-to-utc-second" placeholder="Second" style="width: 4em;" />
  <button id="date-to-utc-button">Convert</button>
  <em id="date-to-utc-display">Set the values</em>
  
</div>

1
Darlesson

MODIFIER

var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());

EDITcorrigé

1
Amjad Masad

@ Amjad, bonne idée, mais mal mise en œuvre. Essayer

Date.prototype.setUTCTime = function(UTCTimestamp) {
    var UTCDate = new Date(UTCTimestamp);
    this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
    this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
    return this.getTime();
}
0
Walf

Considérant que vous avez Epoch_time disponible, 

// for eg. Epoch_time = 1487086694.213
var date = new Date(Epoch_time * 1000); // multiply by 1000 for milliseconds
var date_string = date.toLocaleString('en-GB');  // 24 hour format
0
apurva.nandan

La solution la plus simple que j'ai trouvée à ceci est:

var timestamp = Date.Now()    
var normalisedTime = new Date(timestamp)

Notez que cela n’a pas le * 1000 à la fin de la déclaration new Date(timestamp) car cela (pour moi en tout cas!) Semble toujours donner la mauvaise date, c’est-à-dire que, au lieu de donner l’année 2019, il donne l’année 51015, alors tenez-en compte. esprit.

0
Rob P

Le temps d’une époque (c’est-à-dire le temps d’époque Unix) est presque toujours le nombre de secondes qui ont expiré depuis le 1er janvier 1970 à 00:00:00 (heure UTC), et non le nombre de millisecondes auquel certaines réponses ici ont impliqué.

https://en.wikipedia.org/wiki/Unix_time

Par conséquent, si vous avez reçu une valeur temporelle Unix Epoch, celle-ci sera probablement exprimée en secondes et ressemblera à quelque chose comme 1547035195. Si vous voulez rendre cette image lisible par l'homme en JavaScript, vous devez convertir la valeur en millisecondes et la transmettre au constructeur Date(value), par exemple:

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();

Vous n'avez pas besoin d'effectuer l'étape d.setUTCMilliseconds(0) dans la réponse acceptée, car le constructeur JavaScript Date(value) prend une valeur UTC en millisecondes (pas une heure locale).

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax

Notez également que vous devriez éviter d'utiliser le constructeur Date(...) qui prend une représentation chaîne datetime, ceci n'est pas recommandé (voir le lien ci-dessus).

0
garryp