1

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

基本上,我正在使用 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)

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

任何帮助将不胜感激。

4

2 回答 2

1

那么根据这个: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')返回无效,所以我必须先得到所有的时间,然后在最后把它去掉。

于 2018-04-09T04:56:12.167 回答
0

这似乎过分了,但是由于 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 中的解析是一致的。

于 2018-04-09T04:56:13.447 回答