Неправильная дата 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.