Создать date.js дату из миллисекунд в местном часовом поясе - PullRequest
0 голосов
/ 24 сентября 2018

Ответ, который я получаю от сервера, является «локальной» отметкой времени.Что означало бы мое местное время, выраженное в миллисекундах UTC, но без смещения UTC.

Например: 1537747200000 равно Mon Sep 24 2018 00:00:00 UTC Mon Sep 24 2018 03:00:00 EEST (my local time), но в моем контексте эта дата на самом деле Mon Sep 24 2018 00:00:00 EEST,поэтому значение utc с моим часовым поясом.

Теперь я хотел бы отобразить это, используя момент и момент-время, если это необходимо.

Итак, я хотел бы знать, как создать новый моментобъект, который принимает "LOCAL milliseconds"?, поэтому я должен передать 1537747200000 и свой местный часовой пояс, если это необходимо, и я мог бы отобразить его как Mon Sep 24 2018 00:00:00 EEST


Я обнаружил, что использование моментного времени timezone + utcOffset помогает, но я не знаю, насколько это хороший подход. utc offset docs говорит об этом:

Установка смещения UTC путем указания минут.Обратите внимание, что после установки смещения оно фиксируется и не изменится само по себе (т. Е. Нет правил DST).Если вам нужен фактический часовой пояс - время в определенном месте, например, America / Los_Angeles, рассмотрите часовой пояс-момент.


Другой подход - форматирование момента в ISOString moment(1537747200000).toISOString()и затем проанализируйте полученную строку без информации о часовом поясе ('z').При разборе строки вы можете проанализировать ее в другом часовом поясе.moment.tz(moment(1537747200000).toISOString().slice(0, -1), tz).Но для этого необходимо, чтобы я анализировал-> формат-> синтаксический разбор значения, поэтому для этого требуется много дополнительных операций.


const [one, two, thr] = ["exp","tr","appr"];
const display = (toAdd, id) => document.getElementById(id).innerHTML += `<br/> ${toAdd}`;


const formatString = "MMM D, YYYY HH:mm z";
const tz = moment.tz.guess();
const millis_24_sep_00_00_utc = moment.utc("24-09-2018", "DD-MM-YYYY", true).valueOf(); //1537747200000
const isoString = moment(millis_24_sep_00_00_utc).toISOString();

//exp
display(tz, one);
display(millis_24_sep_00_00_utc, one);
const ex = moment.tz(millis_24_sep_00_00_utc, tz).utc().format("MMM D, YYYY HH:mm")
display(`${ex} ${moment().tz(tz).zoneAbbr()} <- local tz`, one);

//tr
[
  moment(millis_24_sep_00_00_utc).tz(tz),
  moment.utc(new Date(millis_24_sep_00_00_utc)).tz(tz),
  moment.tz(millis_24_sep_00_00_utc, tz).utc(),
  moment.tz(isoString, tz),
]
.forEach(mom => display(mom.format(formatString), two));

//some approaches
[
//setting utcOffset to 0
  moment.tz(millis_24_sep_00_00_utc, tz).utcOffset(0),
//iso string to transform millis -> string -> parse the string in another tz
  moment.tz(isoString.slice(0, -1), tz),
]
.forEach(mom => display(mom.format(formatString), thr));
<!DOCTYPE html>
<html>

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.21/moment-timezone-with-data.js"></script>
  <title>Test</title>
</head>
<body>
 <div id="exp">EXPECTED</div>
 <hr/>
 <div id="tr">TRIES</div>
 <hr/>
 <div id="appr">APPROACHES</div>
</body>

</html>

1 Ответ

0 голосов
/ 24 сентября 2018

Необычно указывать смещение в миллисекундах.Но если ваши значения времени смещены на +3 часа, то вы можете вычесть 3 часа из миллисекунд (1.08e7) и использовать его как значение времени UTC.

Например, значение времени 1537747200000 обычно представляет 2018-09-24T00: 00: 00.000Z.Если это значение времени фактически представляет 2018-09-24T00: 00: 00.000 + 0300, то эквивалентное значение времени UTC составляет:

1537747200000 - 1.08e7 = 1537736400000;

Рабочий пример:

var d = new Date(1537747200000 - 1.08e7);
console.log(`Zulu: ${d.toISOString()}\nLocal: ${d.toString()}`);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...