【问题标题】:How can I set the default timezone in node.js?如何在 node.js 中设置默认时区?
【发布时间】:2011-12-26 08:56:39
【问题描述】:

如何在 node.js 中设置默认时区?

【问题讨论】:

  • 很确定你不能真正做到这一点。更改系统时区设置。
  • thejh 是对的,您不能更改时区。使用 JS 时间库(如 moment.js)并添加/减去小时数。
  • 最简单且正确的方法是更改​​系统的时区。
  • 这些是有用的 cmets,但大多数时候你不是系统管理员 ;)

标签: node.js timezone


【解决方案1】:

根据this google group thread,您可以在调用任何日期函数之前设置 TZ 环境变量。刚刚测试过,它可以工作。

> process.env.TZ = 'Europe/Amsterdam' 
'Europe/Amsterdam'
> d = new Date()
Sat, 24 Mar 2012 05:50:39 GMT
> d.toLocaleTimeString()
'06:50:39'
> ""+d
'Sat Mar 24 2012 06:50:39 GMT+0100 (CET)'

但您不能稍后更改时区,因为此时 Node 已经读取了环境变量。

【讨论】:

  • 这很有趣。错误讨论表明这是线程的一些问题。但该示例多次更改 process.env.TZ。看起来就像在开始时设置一次然后不理会它一样有效。不过,感谢 lorancou 对节点时间的引用,以便更灵活和健壮的处理。
  • 遗憾的是,它在 Windows 中不起作用。在 mac os-x 和 unix 中运行良好
  • 不错的答案。不幸的是,每次我看到像process.env.TZ = 'Europe/Amsterdam' 这样的东西时,我都会想“很好,现在在哪里可以找到我可以设置的所有有效值的列表?”而且我每次都找不到。
  • @RafaelEyng IANA(国际号码分配协会)通常用于提供最新的时区配置。您可以在此处找到最新的时区设置:ftp.iana.org/tz/tzdata-latest.tar.gz 有关可能的时区字符串的概述,请查看该存档中的 zone.tab 文件。
  • @RafaelEyng:正如 JohannesB 提到的那样,iana.org/time-zones 是官方来源,但它们的数据格式很难使用。我发现使用 en.wikipedia.org/wiki/List_of_tz_database_time_zones 工作要容易得多,它是从 IANA 数据集(目前是 2017c 版本)构建的。
【解决方案2】:

至少在 Linux 环境中似乎对我有用的另一种方法是像这样运行您的 Node.js 应用程序:

env TZ='Europe/Amsterdam' node server.js

这至少应该确保从一开始就正确设置了时区。

【讨论】:

  • 不错!为我工作
  • 你可以对文化做同样的事情吗?
  • 这使得强制时区比trying to do so in code 更简单。
【解决方案3】:

这是一个 100% 工作示例,用于在不使用任何外部模块的情况下在 NodeJs 中获取自定义时区日期时间:

const nDate = new Date().toLocaleString('en-US', {
  timeZone: 'Asia/Calcutta'
});

console.log(nDate);

【讨论】:

  • 我很困惑 - 这是非常受欢迎的,但它有一个严重的问题 IMO。节点版本
  • 我看到下面@Marshall 的回答提出了一种在某些情况下解决此问题的方法(不适用于 Lambda 和其他 FaaS)。
【解决方案4】:

不幸的是,setting process.env.TZ doesn't work really well - 基本上不确定更改何时生效)。

所以在启动节点之前设置系统的时区是你唯一合适的选择。

但是,如果您不能这样做,应该可以使用node-time 作为解决方法:获取本地时间或 UTC 时间,并将它们转换为所需的时区。详情请见How to use timezone offset in Nodejs?

【讨论】:

  • npm 模块时间对我来说非常有用。我设置为 utc,然后使用 utc 设置所有时间,因此代码可以在具有不同时区的不同机器之间移植。
  • 这个已经没有问题了,是吗?
  • @Bloke 它似乎已在 Node 13 (stackoverflow.com/a/60771964/399105) 中修复,但是在启动 Node.js 之前设置 TZ 可能仍然是最安全的。例如,Jest 还不能正确处理 TZSetting process.env.TZ does not affect Dates
【解决方案5】:

@uhef 的解决方案 env TZ='Europe/Amsterdam' node server.js 适用于您的应用程序无法使用分叉进程,但是当您使用分叉进程时,特别是当您使用 gulp ,命令 gulp 将采用 env 值,但 gulp 创建的进程不是(您的应用程序)。

要解决这个问题,你必须这样做:

$ export TZ="Europe/Amsterdam"; gulp myTask

这将为您正在处理的控制台中启动的所有进程设置TZ环境变量,包括在同一控制台中执行gulp命令后执行的所有后续进程,而无需使用前缀@987654325执行它们再次@。

【讨论】:

  • 由于阿姆斯特丹有 DST,这仍然是在 GMT +1 实现“​​午夜 UTC”的理想时间吗?
  • @FlavorScape 我使用Etc/UTCEtc 中也有特定的偏移量,但偏移量与预期相反。 Etc/GMT-1 是 UTC + 1 小时。见https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
【解决方案6】:

只需在您的主文件中设置环境变量,例如 index.js 或 app.js 或 main.js 或任何您的文件名:

process.env.TZ = "Asia/Tehran";

这将设置将在您的整个节点应用程序中使用的时区

【讨论】:

    【解决方案7】:

    As of Node 13,您现在可以重复设置process.env.TZ,它将反映在新的 Date 对象的时区中。我不知道我是否会在生产代码中使用它,但它肯定会在单元测试中有用。

    > process.env.TZ = 'Europe/London';
    'Europe/London'
    > (new Date().toString())
    'Fri Mar 20 2020 09:39:59 GMT+0000 (Greenwich Mean Time)'
    
    > process.env.TZ = 'Europe/Amsterdam';
    'Europe/Amsterdam'
    > (new Date().toString())
    'Fri Mar 20 2020 10:40:07 GMT+0100 (Central European Standard Time)'
    

    【讨论】:

    • 这在 Linux/Mac 上运行良好,但在 Windows 上不起作用。
    • 不,它也适用于 Windows,请使用 set TZ='UTC' node index.js
    • @user3896501 不,该语法为整个过程设置 env var - 而不是 在运行时 就像在 OP 的示例中那样。
    • 将 TZ 设置为 undefined 会使 GMT 成为时区。要恢复到系统默认值,您必须执行delete process.env.TZ;
    【解决方案8】:

    设置服务器时区并使用 NTP 同步。 这是更改服务器时间的一种更好的解决方案。

    列出时区

    timedatectl list-timezones
    

    设置时区

    sudo timedatectl set-timezone America/New_York
    

    验证时区

    timedatectl
    

    我更喜欢为我的服务器和数据库使用 UTC 时区。任何转换都必须在客户端处理。 我们可以在客户端使用 moment.js。

    维护多个实例也很容易,

    【讨论】:

    • 虽然 moment.js 在当时是一个很棒的库,但目前还有更小的替代品(例如date-fns)。 Moment is huge;请不要将它推荐给客户端应用程序。
    【解决方案9】:

    我知道这个帖子很老了,但我认为这会对像我这样从谷歌登陆这里的人有所帮助。

    在 GAE Flex (NodeJs) 中,您可以在 app.yaml 文件中设置环境变量 TZ(管理应用程序中所有日期时区的变量),我给您举个例子:

    app.yaml

    # [START env]
    env_variables:
      # Timezone
      TZ: America/Argentina/Buenos_Aires
    

    【讨论】:

      【解决方案10】:

      这是为那些将 Node.js 应用程序部署到 Amazon AWS Elastic Beanstalk 的人的答案。我在其他任何地方都没有看到这个记录:

      Configuration -> Software -> Environment Properties 下,只需设置键值对TZ 和您的时区,例如America/Los Angeles,然后应用更改。

      你可以通过在你的Node应用中输出new Date().toString()并注意时区后缀来验证效果。

      【讨论】:

        【解决方案11】:

        您可以通过将环境变量 TZ 设置为 UTC 来强制执行 Node.js 进程时区

        所以所有时间都将以 UTC+00:00 衡量

        完整列表:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

        示例 package.json:

        {
          "scripts": {
            "start": "TZ='UTC' node index.js"
          }
        }
        

        【讨论】:

        • 这在 Windows 上不起作用。您不能以这种方式设置 TZ 环境变量。如果你设置了 TZ,它不会被识别为 Node 的默认时区。
        【解决方案12】:

        您可以使用moment timezone。它可以让您设置您的位置,还可以处理夏令时。

        【讨论】:

        • moment 对于这样的任务来说非常重要,除非您想要的行为无法通过 Date 或其他内置模块实现,否则我不会推荐它。
        【解决方案13】:

        有时您可能在其他地方的虚拟服务器上运行代码 - 在运行 NODEJS 或其他风格时会变得很混乱。

        这是一个修复程序,可让您轻松使用任何时区。

        Check here for list of timezones

        只需将您的时区短语放在 FORMAT 行的括号内即可。

        在这种情况下 - 我将 EPOCH 转换为东部。

        //RE: https://www.npmjs.com/package/date-and-time
        const date = require('date-and-time');
        
        let unixEpochTime = (seconds * 1000);
        const dd=new Date(unixEpochTime);
        let myFormattedDateTime = date.format(dd, 'YYYY/MM/DD HH:mm:ss A [America/New_York]Z');
        let myFormattedDateTime24 = date.format(dd, 'YYYY/MM/DD HH:mm:ss [America/New_York]Z');
        

        【讨论】:

          【解决方案14】:

          node.js v13 更新

          正如@Tom 所指出的,现在 v13 中内置了完整的 icu 支持。因此可以省略设置步骤。您仍然可以自定义在运行时构建或使用 icu 的方式:https://nodejs.org/api/intl.html

          对于 Windows 上的 node.js,您可以执行以下操作:

          1. 如果已安装完整的icu,则安装它,这会正确应用日期语言环境

            npm i full-icu 或全球:npm i -g full-icu

          2. 在您的代码中使用 toLocaleString(),例如:

            new Date().toLocaleString('en-AU', { timeZone: 'Australia/Melbourne' })

            这将产生类似:25/02/2019, 3:19:22 pm。如果您更喜欢 24 小时,'en-GB' 将产生:25/02/2019, 15:19:22

          node.js作为Azure web app,除了WEBSITE_TIME_ZONE的应用设置,还需要设置NODE_ICU_DATA为e.g. <your project>\node_modules\full-icu,当然是在你完成 npm i full-icu 之后。不建议在 Azure 上全局安装包,因为该目录是临时目录,可能会被清除。

          参考: 1.NodeJS not applying date locales properly

          1. 你也可以用intl选项构建node.js,更多信息here

          【讨论】:

          • full-icu 包含在 Node v13 的标准/官方版本中,因此不再需要上述步骤。
          【解决方案15】:

          我使用这个 npm 包 unix-system-timezone

          【讨论】:

            【解决方案16】:

            您可以使用库 tzdata 配置全球时区:

            npm install tzdata -y
            

            使用变量设置环境后,例如:TZ=America/Bogota

            并在您的项目中进行测试:

            new Date()
            

            希望对你有帮助

            【讨论】:

              【解决方案17】:

              这行得通; https://stackoverflow.com/a/53282481/17700714

              var date = new Date('2016-08-25T00:00:00')
              var userTimezoneOffset = date.getTimezoneOffset() * 60000;
              new Date(date.getTime() - userTimezoneOffset);
              

              【讨论】:

                猜你喜欢
                • 2020-12-17
                • 1970-01-01
                • 2018-07-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-08-09
                • 1970-01-01
                相关资源
                最近更新 更多