Angular: Date Timezone 全局参数设置

4 javascript typescript angular angular8 angular9

我正在寻找一种方法

  • 将建造/声明时的全新日期转换为太平洋标准时间。(无需团队中的每个开发人员手动设置时区)

  • 此外,当以 HTMLconsole.log等格式显示时,显示的日期应以太平洋时区显示

    let test = new Date(2019, 3, 5);
    console.log(test);
    
    Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?Angular 中是否有全局参数来设置它,也许在配置文件中?

*我们在代码库中有 500 行日期代码,需要进行这种全局转换。有时当人们在不同的时区工作时,应用程序会呈现不同的时区日期。需要更正以前人的代码。

当前无法将这些行转换为 Moment,在当前代码库中使用 Date。

另外,这会是一个合适的解决方案吗?tzutil /s "Pacific Standard Time",刚刚在谷歌了解到这个

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/hh875624(v=ws.11)

tru*_*k18 5

我完全同意@Adrian Brand。此外,这不是 Angular 问题。它更像是您在应用程序中处理日期时间的方式。

根据我的经验。使用内置的 JavaScript Date 来做这个日期时间的事情总是很棘手。

此外,为了处理太平洋时间,您可能需要处理夏令时。这本身就是另一个问题。

太平洋时区 (PT) 是一个时区,包括加拿大西部、美国西部和墨西哥西部的部分地区。该区域中的地方通过从协调世界时减去八小时来遵守标准时间(UTC?08:00)。在夏令时期间,使用时间偏移量UTC?07:00

我假设您仍然将数据作为ISO格式发送到服务器。


所以我在新加坡,请参阅以下普通日期构造函数的结果。

  1. var date = new Date(2019, 3, 5). //Fri Apr 05 2019 00:00:00 GMT+0800 (Singapore Standard Time)
  2. date.toISOString()// 2019-04-04T16:00:00.000Z. 因为新加坡+08:00比 UTC 早 8 小时。

因此,如果您希望始终执行 new Date 以产生 PST 时间,这意味着

  1. var date = new Date(2019, 3, 5) // Fri Apr 05 2019 00:00:00 GMT-0700 (Pacific Standard Time)
  2. date.toISOString()// 2019-04-05T08:00:00.000Z. 因为 PST-08:00比 UTC 晚 8 小时。夏令时的话题-07:00,我留给你。

你要么需要

  1. 重写 Date 构造函数,这是完全不推荐的。
  2. 向日期构造添加新方法以显示或为您提供正确的 ISO 格式,但请考虑 PST 时区。这涉及一些字符串替换和一些偏移计算的数学。

添加在 PST 中显示字符串的方法

如果您使用确切日期作为构造函数var date = new Date(2019, 3, 5)。您可以添加一个新的方法调用toPSTString()并使用正则表达式替换()toPacific Standard TimeGMT+xxxto里面的文本,GMT-08:00因为日期的值是绝对的。

Date.prototype.toPSTString = function () {
  let date = this.toString();
  //date.replace.... easy part, you could use Regex to do it
  return date;
};
Run Code Online (Sandbox Code Playgroud)

但是,如果您在构造函数中传递了 ISO 字符串格式的日期或毫秒数。处理起来会非常棘手。例如,如果你这样做new Date("2019-04-05T07:00:00.000Z"),你想看到什么?

请参阅下文,了解我如何根据偏移量差异输出 ISO 字符串。它可能会给你一些想法/

添加获取考虑 PST -08:00 时区的 ISO 格式字符串的方法

new Date将始终在您的本地机器时区工作。所以如果我在新加坡,我会的new Date(2019, 3, 5).toISOString(),它总会给我2019-04-04T16:00:00.000Z,而不是2019-04-05T08:00:00.000Z你所期望的。

您还可以覆盖 JS 函数以输出 UTC 日期,但要考虑 PST 时间。

Date.prototype.toPSTString = function () {
  function convertMinuteToMillisecond(mins) {
    return mins * 60 * 1000;
  }
  let localDateOffsetToUtc = this.getTimezoneOffset(); //the offset between the user local timezone with UTC. In my use case of Singapore, it give me -480.
  const offSetBetweenPSTAndUTC = 480;
  let offsetBetweenPSTAndLocal = offSetBetweenPSTAndUTC - localDateOffsetToUtc;
  let newDate = new Date(
    this.getTime() + convertMinuteToMillisecond(offsetBetweenPSTAndLocal)
  );
  return newDate.toISOString();
};

var date = new Date(2019, 3, 5);
date.toISOString(); //"2019-04-04T16:00:00.000Z" Singapore
date.toPSTString(); //"2019-04-05T08:00:00.000Z" PST
Run Code Online (Sandbox Code Playgroud)

输出看起来正确。我还没有真正测试过它,但希望你能明白。


但通常,如果您在新加坡,您希望看到新加坡时区的日期。没有人关心 PST 时区。同样,如果您在伦敦,您不想看到新加坡或 PST 时区的时间。我想你可能想考虑一下。因为如果您的应用程序不断发展壮大,解决此类问题将变得越来越困难。

在我的博客中写了我如何处理时区和语言环境。在我的用例中,我使用moment.js并且服务器端需要在这方面支持我。如果你想有更多的想法,你也可以看看。