Неправильная дата Safari с использованием Typescript Angular 4

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

В основном, я использую Angular 4 и пытаюсь показать дату хорошим способом для пользователя. Это пример того, как я получаю дату из API:

2018-04-12T18:00:00

Я использую стандартную DatePipe от Angular, чтобы отобразить ее:

model.event.startDate | date : "h:mm a”  (OUTPUT SHOULD BE 6PM)

Каждый браузер (Edge, Mozilla и Chrome) отображает его правильно (6 вечера). Единственная проблема для пользователей iPhone. Safari показывает (3 вечера). Я живу в Бразилии, и мои пользователи всегда будут из Бразилии (GMT -3)

Есть ли простой способ решить эту проблему без использования сторонних библиотек?

Любая помощь будет принята с благодарностью.

2 ответа

Ну, согласно этому: недопустимая дата в сафари Сафари ненавидит - в дату и время Так что вот метод, чтобы поменять их.

private timeAsString = '2018-04-12T18:00:00';

var date = this.timeAsString.split('T')[0].replace(/-/g, "/");
var time = this.timeAsString.split('T')[1];
var brokenTime = new Date(this.timeAsString);
var hours = brokenTime.getHours();
var minutes = brokenTime.getMinutes();
var seconds = brokenTime.getSeconds();

this.displayDate = new Date(date);
this.displayDate.setHours(hours);
this.displayDate.setMinutes(minutes);
this.displayDate.setSeconds(seconds);

https://stackblitz.com/edit/angular-pfxdws

Это похоже на очень окольный метод, который я знаю, однако new Date('2018/04/12T18:00:00') возвращает недействительным, поэтому мне пришлось сначала получить все время, а затем удалить его в конце.

Это кажется чрезмерным, но так как Safari использует UTC вместо местного времени, когда вы используете 2018-04-12T18:00:00 формат, и не понимает, как анализировать смещения UTC, добавленные к этому формату, немного более жесткие манипуляции с датой / временем кажутся в порядке:

let ds = '2018-04-12T18:00:00';
let match = /(\d{4})-(\d\d)-(\d\d)T(.+)/.exec(ds);

if (match) {
  ds = 'JanFebMarAprMayJunJulAugSepOctNovDec'.substr(Number(match[2]) * 3 - 3, 3) + ' ' + match[3] + ' ' + match[1] + ' ' + match[4];
}

Это превращает вышеуказанную дату в Apr 12 2018 18:00:00, который последовательно анализирует в Chrome, Safari и Firefox.

Другие вопросы по тегам