Angular:将时间戳转换为特定时区,尊重夏令时

Posted

技术标签:

【中文标题】Angular:将时间戳转换为特定时区,尊重夏令时【英文标题】:Angular: convert timestamps to specific timezone, respecting daylight saving time 【发布时间】:2021-11-27 12:36:04 【问题描述】:

在我的 Angular 应用程序中,我需要显示东欧时间的时间戳(以 Unix 纪元毫秒数给出)。以下几乎是正确的,但忽略了夏令时:

 timestamp | date:'dd.MM.yyyy HH:mm:ss':'UTC+2' 

我尝试将UTC+2 替换为EET,但这只会导致所有时间都转换为用户的本地时区(例如省略参数时)。时间戳可以来自任何日期,因此它应该考虑 DST 在那个时候是否有效,而不仅仅是在代码运行时。欧洲的夏令时从 3 月的最后一个星期日持续到 10 月的最后一个星期日。

【问题讨论】:

timestampalways UTC 吗? 是的,以毫秒为单位的 Unix 时间。 【参考方案1】:

如果给定日期在 CEST(中欧夏令时)期间,此功能将为您提供信息:

lastSunday(year, month) 
    var date = new Date(year, month, 1, 12);
    let weekday = date.getDay();
    let dayDiff = weekday===0 ? 7 : weekday;
    let lastSunday = date.setDate(date.getDate() - dayDiff);
    return date;


isCEST(d: Date): boolean 
  let year = d.getFullYear();
    
  let startCET: Date = this.lastSunday(year, 3);
  let endCET: Date = this.lastSunday(year, 10);

  return !(startCET < d && d < endCET);


offset(d: Date): string 
  return isCEST(d) ? 'UTC+2' : 'UTC+1'

现在您可以将管道更改为:

 timestamp | date:'dd.MM.yyyy HH:mm:ss': offset(timestamp) 

【讨论】:

谢谢!不过,您似乎忘记包含 lastSunday 函数。 @laurt 很抱歉。刚刚包含它...

以上是关于Angular:将时间戳转换为特定时区,尊重夏令时的主要内容,如果未能解决你的问题,请参考以下文章

Spark:考虑夏令时将 GMT 时间戳转换为东部时间

在 php 中从 EDT 转换为 GMT+05.30 时区以在 mysql 数据库中输入时间戳

特定时区的vue时间戳

Redshift:将时间戳转换为特定时区的日期

将时间戳转换为特定时区然后在 bigquery 中将其转换为日期时出现问题

将特定时区中的日期转换为 Python 中的时间戳