Странное поведение `new Date (Date.UTC)` - PullRequest
0 голосов
/ 01 февраля 2019

Странное поведение new Date(Date.UTC(...)) при преобразовании даты из utc в местное время пользователя

У меня есть метка времени, полученная с сервера, которая похожа на 2019-02-01 14:28:16, и яя пытаюсь преобразовать эту временную метку в локальное время пользователей безопасным способом, чтобы избежать недопустимая дата ошибка.

Но на удивление она конвертирует 1-е февраля в 5-е февраля .Вот сценарий:

const myDate = new Date('2019-02-01 14:28:16');

console.log('Step 1: MyDate: ' + myDate.toString());

const utcFormateOfMyDate = Date.UTC(
  myDate.getFullYear(),
  myDate.getMonth(),
  myDate.getDay(),
  myDate.getHours(),
  myDate.getMinutes(),
  myDate.getSeconds(),
  myDate.getMilliseconds()
);

console.log('Step 2: utcFormateOfMyDate: ' + utcFormateOfMyDate.toString()); // 1549376896000

console.log('Step 3.1 => ' + new Date(utcFormateOfMyDate)); // Tue Feb 05 2019 19:28:16 GMT+0500 (Pakistan Standard Time 

console.log('Step 3.2 => ' + Date(utcFormateOfMyDate)); // Fri Feb 01 2019 19:43:36 GMT+0500 (Pakistan Standard Time)

Единственное изменение, которое я только что добавил, добавило новое ключевое слово и преобразованную метку времени, прыгнул с 1 февраля на 5 февраля (в будущем);см. скриншот

enter image description here

Хотя удаление нового ключевого слова решило проблему, но я не смог найти объяснение этого магического эффекта.Может ли кто-нибудь помочь мне понять это поведение?

1 Ответ

0 голосов
/ 01 февраля 2019

Как отмечается в комментариях, проблема, с которой вы сталкиваетесь, заключается в том, что вы сравниваете яблоки и апельсины, случайно передав значение Date.getDay (вместо Date.getDate) в Date.UTC и сравнив результат с результатами анализаметка времени напрямую.Тем не менее, вам не следует полагаться на new Date() или Date() для анализа метки времени, поскольку реализации браузера различаются, и вы можете получить противоречивые результаты.

Вместо этого вы можете сделать что-то вроде следующего с форматом метки времени, который вы используете.получают с сервера:

const timestamp = '2019-02-01 14:28:16';

let [y, m, d, hh, mm, ss] = timestamp.match(/\d+/g);
let date = new Date(Date.UTC(y, m - 1, d, hh, mm, ss));

console.log(JSON.stringify(date));

// date as UTC string
console.log(date.toUTCString());

// date as local string
console.log(date.toString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...