Преобразовать время устройства в unix отметку времени на основе часового пояса устройства - PullRequest
0 голосов
/ 22 февраля 2020

Я могу получить правильную дату в зависимости от часового пояса устройства. Но когда я конвертирую это время в метку времени, я получаю метку времени локального часового пояса (проверено в epochconverter ), а не метку времени, основанную на устройстве.

Я попробовал приведенный ниже код, чтобы получить метку времени из дата:

1. new Date().valueOf()

2. var tzt = moment
          .unix(Date.now())
          .tz(DeviceInfo.getTimezone())
          .toDate()
          .getTime()

3. +new Date(Moment(new Date().toISOString()))

4. Moment(new Date().toISOString()).unix()

5. Date.now()

6. var forDate = Moment(new Date()).format('DD/MM/YYYY hh:mm a');
   var forDateTime = Moment(forDate, "DD/MM/YYYY hh:mm a").toDate().getTime();

Например, я установил часовой пояс America / Chica go в устройстве. Я получаю дату как Пт 21 февраля 2020 23:59:12 GMT-0600 (CST), которая является правильной для chica go, но отметка времени как 1582351152244, которая является местной отметкой времени Индии. Мой ожидаемый результат: 1582329552000

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Вы, похоже, неправильно понимаете значение, возвращаемое методом valueOf экземпляра Date: это смещение в миллисекундах от 1970-01-01 00:00:00 UT C (эпоха ECMAScript, которая является общим для ряда компьютерных языков и систем, таких как Java и UNIX). У него нет часового пояса, и вы не должны делать вывод, что он есть. valueOf эквивалентно методу getTime .

ECMAScript Объекты Date представляют собой просто значение времени, смещение от эпохи ECMAScript, а также некоторые базовые c методы для получить и установить значения даты и времени на основе локальных (смещение хоста) или UT C значений и правил. Они не имеют часового пояса и по своей сути UT C. Информация о часовом поясе получена от хост-системы (или любого другого API, который может реализовать реализация, которая удовлетворяет требованиям ECMA-262).

Я получаю дату как Пт 21 февраля 2020 23:59:12 GMT-0600 ( CST), который является правильным для Чикаго [sic], но отметка времени как 1582351152244, которая является локальной отметкой времени Индии

1582351152244, равна , а не «отметкой времени Индии», это смещение в миллисекундах от эпоха ECMAScript и представляет 2020-02-22T05: 59: 12.244Z, 2020-02-21T23: 59: 12GMT-06: 00 (Chica go) и 2020-02-22T11: 29: 12.244GMT + 05: 30 Стандартное время Индии. Он представляет все эти временные метки в одно и то же время, так как все они представляют один и тот же момент времени в разных часовых поясах.

Когда вы регулируете значение смещением часового пояса хоста, результатом является значение времени, которое представляет другое момент времени. Код в вашем ответе эквивалентен:

// OP code
var currentTime = new Date().getTime();
var localOffset = (-1) * new Date().getTimezoneOffset() * 60000;
var stamp = Math.round(new Date(currentTime + localOffset).getTime());
console.log(stamp)

// Concise equivalent, might be 1 ms different sometimes
let d = new Date();
let stamp2 = d.getTime() - d.getTimezoneOffset() * 6e4;
console.log(stamp2);

Не зная, почему вы чувствуете необходимость скорректировать значение времени или результат, которого вы пытаетесь достичь, невозможно предложить лучший способ добиться этого.

0 голосов
/ 22 февраля 2020

Я нашел ответ на свой вопрос. Я использовал приведенный ниже код для преобразования временной метки в соответствии с часовым поясом устройства.

var currentTime = new Date().getTime();

var localOffset = (-1) * new Date().getTimezoneOffset() * 60000;

var stamp = Math.round(new Date(currentTime + localOffset).getTime());
...