【问题标题】:Wrong Safari date using Typescript Angular 4使用 Typescript Angular 4 的 Safari 日期错误
【发布时间】:2018-04-09 04:40:39
【问题描述】:

我已经阅读了许多与此问题相关的问题。但是,大多数解决方案都包括添加第三方库,如果可能的话,我真的希望保持简单。

基本上,我正在使用 Angular 4 并尝试以一种很好的方式向用户显示日期。这是我如何从 API 获取日期的示例:

2018-04-12T18:00:00

我正在使用 Angular 的默认 DatePipe 以一种很好的方式显示它:

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

每个浏览器(Edge、Mozilla 和 Chrome)都能正确显示(下午 6 点)。唯一的问题是 iPhone 用户。 Safari 显示(下午 3 点)。我住在巴西,我的用户将永远来自巴西 (GMT -3)

有没有不使用任何第三方库的简单方法来解决这个问题?

任何帮助将不胜感激。

【问题讨论】:

  • 什么iphone?什么操作系统版本?
  • 您确定您正在测试的 iPhone 没有设置为不同的时区吗?
  • @Zze iOS 11.2.6 iPhone 6s
  • @kshetline 我想强制它并在 18:00 或下午 6 点为大家展示。我从未更改过与 iPhone 时区相关的任何内容。我什至不知道在哪里改变它

标签: angular typescript datetime date-pipe


【解决方案1】:

根据这个:Invalid date in safari Safari 讨厌日期时间中的-。所以这里有一种方法可以把它们换掉。

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') 返回无效,所以我必须先获取所有时间,然后在最后将其删除。

【讨论】:

  • 由于某种原因,您的答案仍然显示 3PM 而不是 6PM。
【解决方案2】:

这似乎过分了,但是由于 Safari 在您使用 2018-04-12T18:00:00 格式时假定使用 UTC 而不是本地时间,并且不了解如何解析添加到该格式的 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 中的解析是一致的。

【讨论】:

  • 我试过这个。 -0300 破坏了 Safari(没有显示任何日期)。我会试试下面的答案。谢谢
  • 你是对的。我只是对桌面版 Safari 的 web 控制台进行了实验,它也不喜欢在时间上添加 UTC 偏移量。多么烦人的限制!
  • 也许 .0000-03:00 可以解决问题。我不确定其他浏览器是否愿意。或者也许只是 -03:00
  • 请检查,用moment.js格式化日期,而不是用管道。
  • 在本地时区(将 Chrome 与 Safari 进行比较)中似乎始终如一地解析为日期/时间的是“2018 年 4 月 12 日 18:00:00”。如果其他发帖人的建议不起作用,您可以尝试转换为该格式。
猜你喜欢
  • 2018-12-13
  • 1970-01-01
  • 2018-09-02
  • 2012-09-12
  • 2019-08-28
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
相关资源
最近更新 更多