Из-за летнего времени дата ISO отправляется неправильно - PullRequest
0 голосов
/ 29 апреля 2019

Компонент в нашем приложении позволяет пользователю ввести свою дату рождения, а затем снова отобразить ее.Это работает в большинстве случаев, но есть проблема для некоторых случаев использования, я подозреваю, из-за перехода на летнее время.

Я отправляю дату на сервер в формате ISO (время UTC) и получаю ее также вФормат ISO, но с относительным временем.Пример (8. 8. 2000):

sending: 2000-08-07T22:00:00.000Z
receiving: 2000-08-08T00:00:00+02:00

Для некоторых дат возвращаемая дата на один день ниже.Пример (8. 8. 1977, становится 7. 8. 1977):

sending: 1977-08-07T23:00:00.000Z
receiving: 1977-08-08T00:00:00+02:00

У меня есть теория, что это потому, что клиент и сервер используют разные локали - которые исторически наблюдали DST по-разному.Я нахожусь в Чешской Республике, и страна не наблюдала DST в 1977 году.

Как я могу решить эту проблему?Если моя теория верна, как мне узнать, какие локали используются и как установить интерфейс клиента / клиента?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

Вы не хотите быть в курсе локалей!Мы говорим о свиданиях.Вам нужно составить и передать ваши даты, чтобы локаль никогда не становилась проблемой.Для этого ваши даты должны соответствовать полуночи UTC.Глядя на ваши примеры, ни ваши даты отправления, ни даты получения не соответствуют этому условию, поэтому я думаю, что вы рискуете сойти с ума.

Надеюсь этот ответ будет иметь для вас полезную информацию.

1 голос
/ 01 мая 2019

Если вы хотите иметь дело только с датами, не используйте компонент времени, только передайте даты, например, 2000-08-07.

К сожалению, TC39 принял неверное решение , решив, что формат даты YYYY-MM-DD только по ISO 8601 следует анализировать как UTC вместо того, чтобы следовать ISO 8601, и рассматривать его как локальный. Похоже, что решение было скорее коммерчески мотивированным, чем следствием здравого смысла.

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

function parseISODate(s) {
  var [y, m, d] = s.split(/\D/);
  return new Date(y, m-1, d);
}
function formatISODate(date) {
  let z = n => (n<10?'0':'')+n;
  return date.getFullYear() + '-' +
         z(date.getMonth()+1) + '-' +
         date.getDate();
}

let s = '2000-08-31';
let d = parseISODate(s);
console.log(d.toLocaleString());
console.log(formatISODate(d));
...