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

Olu*_*Olu 128 timezone node.js

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

web*_*rgm 111

根据这个谷歌组线程,您可以在调用任何日期函数之前设置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)'
Run Code Online (Sandbox Code Playgroud)

之后您无法更改时区,因为那时Node已经读取了环境变量.

  • 很好的答案.不幸的是,每次我看到像'process.env.TZ ='Europe/Amsterdam'这样的东西'我认为'很好,现在我在哪里可以找到我可以设置的所有有效值的列表?" 我每次都找不到它. (8认同)
  • @RafaelEyng:正如JohannesB提到的iana.org/time-zones是官方消息来源,但他们的数据格式难以使用.我发现从https://en.wikipedia.org/wiki/List_of_tz_database_time_zones开始工作要容易得多,它是根据IANA数据集(目前为2017c版本)构建的. (7认同)
  • 可悲的是,它在Windows中不起作用.适用于mac os-x和unix (5认同)
  • @ RafaelEyng IANA(国际指定号码协会)通常用于提供最新的时区配置.您可以在此处找到最新的时区设置:ftp://ftp.iana.org/tz/tzdata-latest.tar.gz有关可能的时区字符串的概述,请检查该存档中的`zone.tab`文件. (5认同)
  • 那很有意思.错误讨论表明它是线程的一些问题.但是这个例子正在多次改变process.env.TZ.它看起来像在开始时设置它一次并让它独自工作.感谢lorancou对节点时间的引用,以获得更灵活和更强大的处理. (3认同)

小智 51

至少在Linux环境中似乎对我有用的另一种方法是运行你的Node.js应用程序,如下所示:

env TZ='Europe/Amsterdam' node server.js
Run Code Online (Sandbox Code Playgroud)

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


Lau*_*dou 28

不幸的是,设置process.env.TZ不能很好地工作 - 基本上,当改变有效时,它是不确定的.

因此,在启动节点之前设置系统的时区是唯一合适的选择.

但是,如果您不能这样做,则应该可以使用节点时间作为解决方法:在本地或UTC时间获取您的时间,并将它们转换为所需的时区.请参阅如何在Nodejs中使用时区偏移量?详情.


小智 25

以下是在不使用任何外部模块的情况下在NodeJ中获取自定义时区日期时间的100%工作示例

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

console.log(nDate);
Run Code Online (Sandbox Code Playgroud)


Mar*_*uiz 14

env TZ='Europe/Amsterdam' node server.js来自@uhef 的解决方案适用于您的应用程序无法使用分叉进程,但是当您使用分叉进程时,特别是当您使用gulp等构建工具启动应用程序时,该命令gulp将采用env值,但是由gulp not(你的应用程序)创建的过程.

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

$ export TZ="Europe/Amsterdam"; gulp myTask
Run Code Online (Sandbox Code Playgroud)

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


Ali*_*aei 11

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

process.env.TZ = "Asia/Tehran";
Run Code Online (Sandbox Code Playgroud)

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


Pra*_*kar 9

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

列出时区

timedatectl list-timezones
Run Code Online (Sandbox Code Playgroud)

设置时区

sudo timedatectl set-timezone America/New_York
Run Code Online (Sandbox Code Playgroud)

验证时区

timedatectl
Run Code Online (Sandbox Code Playgroud)

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

维护很多实例也很容易,

  • 虽然moment.js在当时是一个很棒的库,但目前有很多替代方案(例如[date-fns](https://date-fns.org/))。[瞬间是巨大的](https://github.com/moment/moment/issues/3376); 请不要将其推荐给客户端应用程序。 (2认同)

Nic*_*ick 7

从 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)'
Run Code Online (Sandbox Code Playgroud)

  • 这在 Linux/Mac 上工作得很好,但在 Windows 上不起作用。 (2认同)

use*_*501 6

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

因此所有时间均以 UTC+00:00 测量

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

示例 package.json:

{
  "scripts": {
    "start": "TZ='UTC' node index.js"
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这在 Windows 上不起作用。您不能以这种方式设置 TZ 环境变量。如果您确实设置了 TZ,它将不会被识别为 Node 的默认时区。 (4认同)

ElB*_*rto 5

我知道这个帖子很旧,但我认为这会帮助像我这样从谷歌登陆这里的任何人。

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

应用程序.yaml

# [START env]
env_variables:
  # Timezone
  TZ: America/Argentina/Buenos_Aires
Run Code Online (Sandbox Code Playgroud)


psc*_*scl 5

以下是将Node.js应用程序部署到Amazon AWS Elastic Beanstalk的答案.我还没有在其他任何地方看到这个记录:

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

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


Sir*_*iey 5

您只需在启动应用程序时进行设置即可。

{
  "scripts": {
    "start:timezone": "TZ='utc' node index.js",
    "start": "TC=$tz node index.js"
  }
}
Run Code Online (Sandbox Code Playgroud)

在您的 CI 中或您想要启动应用程序的任何地方,您可以像这样静态运行它,npm run start:timezone或者动态地将您的时区传递给进程,像npm run start utc

另一种方法可能是将其设置在应用程序的入口点中,如下所示:

process.env.TZ = "UTC";
Run Code Online (Sandbox Code Playgroud)