无法使用ionic2/angular2在iOS/Safari中正确显示日期时间
嗨,我在这里遇到了一个奇怪的问题,我得到了动态数据,我也得到了日期和时间,我用chrome/android中的日期管道在html中显示,它工作正常,但当我检查ios/Safari时,它显示了时间差 下面是我正在使用的json数据无法使用ionic2/angular2在iOS/Safari中正确显示日期时间,ios,angular,ionic-framework,safari,ionic2,Ios,Angular,Ionic Framework,Safari,Ionic2,嗨,我在这里遇到了一个奇怪的问题,我得到了动态数据,我也得到了日期和时间,我用chrome/android中的日期管道在html中显示,它工作正常,但当我检查ios/Safari时,它显示了时间差 下面是我正在使用的json数据 FromCurrentDate: "2018-01-05T00:00:00" FromPreviousDate: "2018-01-04T00:00:00" ToCurrentDate: "2018-01-05T14:00:53.137" ToPreviousD
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"
我会像这样显示日期,然后
在chrome/android中,它显示如下
在Ios/safari中显示如下
在模板中,我使用下面的代码
Currrent {{singleTable[0].FromCurrentDate|date: 'dd/MM/yyyy,h:mm:ss a'}} to {{singleTable[0].ToCurrentDate|date: 'dd/MM/yyyy,h:mm:ss a'}}
如何解决这个时差问题?在ios/mac中,日期过滤器不起作用,所以请使用矩量.js 我尝试了很多东西,但我能在moment.js中做得最好 比如:我创建了一个管道
<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);
}
}
}
{{ActionDate | dateTimeFormatFilter:“mmmdd,YYYY”}
@管道({name:“dateTimeFormatFilter”})
@可注射()
导出类DateTimeFormatPipe实现PipeTransform{
转换(日期:任意,格式:字符串):任意{
若有(日期){
返回时刻(日期)。格式(格式);
}
}
}
您面临的问题是由Intl
api引起的,因为Angular 2发行版的DatePipe
仅适用于具有自定义格式字符串的FireFox和Chrome。
由于缺少Intl,它在Safari上不起作用。因此,作为一个临时解决方案,需要包含Intl polyfill
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script>
解决方案2
您可以使用moment.js,它可以按如下方式设置所需日期的格式
moment(singleTable[0]。FromCurrentDate)。格式(“dd/MM/yyyy,h:MM:ss a”)
更新1
在最新的angular中,他们删除了Intl api,为此您需要更新到angular 5
更新2
这是一个使用angular风格的MomentJs,我添加了你的日期格式,但没有在safari中测试,在chrome中测试,我在桌面上的safari和iPhone上的safari/chrome上遇到了相同的问题。 当日期对象用作值时,它可以在safari或大多数浏览器上工作。() 我解决了同样的问题,添加了一个自定义管道,将日期时间字符串转换为日期对象,然后日期管道按预期工作 组件
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;
}
}
}
对我来说,这适用于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}`;
}
}
当chrome还可以的时候,我在Safari上渲染视图时遇到了一个错误。调试之后,我发现管道日期有问题。所以我做了一个定制的。所有答案都很好,但导入瞬间库似乎是一个大文件。
只需导出这个类,创建一个模块并在那里声明它(也导出它),并使用以下示例:{{{{u question.created_at|toDateObj:'dd.MM.yyyy'}
希望它能帮助别人你在用Angular 5吗?还是以前的版本?@shadowlauch Angular 4I不确定这是否会导致问题,遗憾的是,我无法检查,因为我现在无法访问Mac,但Angular 4使用intl API,这导致Safari出现一些问题。Angular 5从intl API中切换出来,增加了一致性。有什么区别?AM和PM?@Duanx和它显示AM和它占用达尔文时区如果我选择解决方案2,那么在html方面,我可以利用这一时刻。js@Madpop是的,您可以,您也可以获得这些实现的教程。但是,我如何在{{}中提供solution2矩(singleTable[0]。FromCurrentDate).format(“dd/MM/yyyy,h:MM:ss a”)@Madpop当您使用angular 2时,最好尝试使用支持模块化格式的力矩,例如: