Невозможно правильно отобразить дату и время в iOS/Safari с помощью ionic2/angular2
Привет, я сталкиваюсь с странной проблемой здесь, получая динамические данные в том, что im также получает дату и время, а im отображает его в html, используя протокол даты в chrome/android, он работает хорошо, но когда я проверяю ios/Safari, он показывает разница во времени
ниже приведены мои json-данные, потребляющие
FromCurrentDate: "2018-01-05T00:00:00"
FromPreviousDate: "2018-01-04T00:00:00"
ToCurrentDate: "2018-01-05T14:00:53.137"
ToPreviousDate: "2018-01-04T14:00:53.137"
im, отображающий дату, подобную этой и
в chrome/android он отображается следующим образом ![]()
![]()
в Ios/safari отображается так:
в шаблоне im, используя код ниже
Currrent {{singleTable[0].FromCurrentDate|date: 'dd/MM/yyyy,h:mm:ss a'}} to {{singleTable[0].ToCurrentDate|date: 'dd/MM/yyyy,h:mm:ss a'}}
как я могу решить эту проблему с разницей времени?
Ответы
Ответ 1
В ios/mac фильтр даты не работает, поэтому используйте для этого moment.js.
Я перепробовал много вещей, но я смог сделать лучше всего в moment.js
как: я создал pipeу
<span>{{ActionDate | dateTimeFormatFilter : "MMM DD, YYYY"}}</span>
@Pipe({name: "dateTimeFormatFilter"})
@Injectable()
export class DateTimeFormatPipe implements PipeTransform {
transform(date: any, format: string): any {
if (date) {
return moment(date).format(format);
}
}
}
Ответ 2
Проблема, с которой вы сталкиваетесь, вызвана API Intl
, потому что DatePipe
для Angular 2 Release работает нормально только для FireFox и Chrome со строками нестандартного формата.
он не работает в Safari из-за отсутствия Intl. так что временный обходной путь заключается в том, чтобы включить Intl polyfill
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script>
Решение 2
Вы можете использовать moment.js, который может отформатировать необходимую дату следующим образом:
moment(singleTable[0].FromCurrentDate).format("dd/MM/yyyy,h:mm:ss a")
Обновление 1
В последних версиях angular они удалили API-интерфейс Intl, и для этого вам необходимо обновить версию 5, ,
Обновление 2
Вот плункер, использующий MomentJs в угловом формате, я добавил ваш формат даты, но не тестировал в сафари, протестированном в Chrome,
Ответ 3
Я столкнулся с той же проблемой на сафари на рабочем столе и сафари/хром на iPhone.
Он работает в сафари или в большинстве браузеров, когда в качестве значения используется объект даты. (DatePipe)
Я решил ту же проблему, добавив пользовательский канал для преобразования строки даты и времени в объект даты, а затем канал данных работает, как и ожидалось.
Компонент
someDate1 = "2019-09-01 12:02:14";
someDate2 = "2019-09-01";
someDate3 = "2019-09-01 00:00:00";
Шаблон
{{ someDate1 | toDateObj | date:'MM-dd-yyyy h:mm a' }}
Вот пользовательский канал toDateObj
, который я добавил.
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'toDateObj'
})
export class ToDateObjPipe implements PipeTransform {
transform(value: any): any {
if (value) {
if (value.toString().indexOf(' ') === -1) {
value = value + ' 00:00:00';
}
const temp = value.toString().replace(' ', 'T');
return new Date(temp);
} else {
return null;
}
}
}
Ответ 4
Для меня это работает в Safari и Chrome:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'customDate'
})
export class DatePipe implements PipeTransform {
transform(value: string): string {
let dd = value.substr(8, 2);
let MM = value.substr(5, 2);
let yyyy = value.substr(0, 4);
let date = '${dd}.${MM}.${yyyy}';
return '${date}';
}
}
У меня была ошибка рендеринга просмотров в Safari, когда Chrome был в порядке. Позже после отладки я обнаружил, что pipe | дата была проблемой. Поэтому я сделал заказной. Все ответы хороши, но импортируемая библиотека моментов кажется большим файлом IMHO.
Просто сделайте экспорт этого класса, сделайте модуль и объявите его там (также экспортируйте его) и используйте в качестве примера: {{_question.created_at | toDateObj: 'dd.MM.yyyy'}}
Надеюсь, это поможет кому-то