Поведение дат в JS и конструктор new Date()


#1

Вопрос по поводу кода - работаю с датой. Изначальный формат подставляю в Date через конструктор.

var a = “2019-03-12T10:00”
d = new Date(a)
console.log(d);
VM2484:4 Tue Mar 12 2019 12:00:00 GMT+0200 (EET)

  • получаю + 2 часа для своего часового пояса т.к. согласно описанию на javascript.ru время берется в GMT+0, соответственно при выводе будет +2 часа (для моего времени)

но уже если Т заменить на пробел, получаю это:

a = “2019-03-12 10:00”;
d= new Date(a);
console.log(d);
VM2375:4 Tue Mar 12 2019 10:00:00 GMT+0200 (EET)

как видно +2 часа не добавляется. И еще интересней - на скрине - выполнил на ПК соседа. Формат изначальной даты с Т, но результат как без Т на моем компе.

Как так? Кому верить и почему браузер/JS/интерпритатор/конструктор даты или console.log так себя ведет. Кому верить :) Заранее спасибо! Скрины ниже

!


#2

В стандарте не прописано поведение для случая когда дата-время разделены пробелом. Поэтому каждый браузер интерпретирует пробел по-своему, и поведение получается разным.

Нужно форматировать строковое представление даты согласно стандарту, тогда поведение будет одинаковым. https://en.wikipedia.org/wiki/ISO_8601

Или по возможности вообще отказываться от строкового представления в пользу unix timestamp в миллисекундах.


#3

Cпасибо. На входе я получаю искомое представление даты в таком виде “2019-03-04T09:30”
(это приходит извне) - я так понимаю это не совсем по формату т.к. отсутствуют секунды либо же буква Z (в документации так:
2019-03-01T14:16:20+00:00
2019-03-01T14:16:20Z
20190301T141620Z
)

и в этом причина необычного поведения ?

  1. я прочитал сейчас про getUTCHours() , getUTCMinutes() - с этими методами получаю то что мне нужно. Т.е. время из “2019-03-04T09:30” без добавления +2 на разницу часовых поясов.

Можно ли обойтись этим как костылем, если разработчику который отдает “2019-03-04T09:30” поменять тяжелее из-за dependencies или же он вообще отсутствует?


#4

Это строка валидна согласно стандарту. Вот тут описание как может быть описано время https://en.wikipedia.org/wiki/ISO_8601#Times

Нет. Проблема из-за убирания T из строки.

Если изначальные строки одинаковые и содержат T, а не пробел, то дело в том какой часовой пояс выбран на каждом из компьютеров. При попытке привести дату к строковому виду, js будет смотреть на настройки компьютера.


#5

Часовой пояс GMT + 2.

Нет. Проблема из-за убирания T из строки.

  • в моем случае без Т это как раз ожидаемое поведение. То есть мне нужно получить ровно то, что в строке пришло, а не +2 часа.

пример: “2019-03-05T15:00”
мне нужно получить “15”, получаю “17”

В этом случае getUTCHours() - правильный инструмент для решения?


#6

убирание Т из строки я рассматривал как костыльный вариант решения )


#7

А, наверное не ясно что когда дата приводится к строке, то она приводится согласно часовому поясу владельца браузера (если настроено корректно). Строка которая заходит аргументом в Date считается датой в UTC.

Значит тебе нужно строковое представление даты в UTC формате (скорее всего в UTC дата и приходит).

Сойдут любые методы которые работают с датой в контексте UTC. Например getUTCHours или toUTCString().


#8

спасибо большое!


#9

Хорошая библиотека для работы с датами momentjs. Посмотри на неё если хочешь делать продвинутое форматирование или математику с датами