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


153

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


2
可以肯定,您不能真正做到这一点。更改系统时区设置。
thejh 2011年

1
thejh是正确的,您不能更改时区。使用JS时间库(例如moment.js),并增加/减去小时数。
alessioalex 2011年

2
最简单,正确的方法是更改​​系统的时区。
Munim

1
这些是有用的评论,但是大多数时候您不是系统管理员;)
MáriodeSáVera

Answers:


135

根据此google group线程,您可以在调用任何日期函数之前设置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已经读取了环境变量。


3
那很有意思。错误讨论表明,这与线程有关。但是该示例多次更改了process.env.TZ。看起来像在开始时设置一次,然后不理会它。但是,感谢lorancou对节点时间的引用,以提供更灵活,更强大的处理。
webjprgm 2012年

6
可悲的是,它在Windows中不起作用。在Mac OS X和Unix中运作良好
Ritesh Kumar Gupta

14
好答案。不幸的是,每一次我看到类似“ process.env.TZ = 'Europe/Amsterdam' 我很高兴,现在在哪里可以找到我可以设置的所有有效值的列表”这样的内容。但我每次都找不到。
拉斐尔·伊恩

5
@RafaelEyng IANA(国际号码分配协会)通常用于提供最新的时区配置。您可以在这里找到最新的时区设置:ftp.iana.org/tz/tzdata-latest.tar.gz有关可能的时区字符串的概述,请检查该zone.tab档案中的文件。
JohannesB

8
@RafaelEyng:正如JohannesB提到的iana.org/time-zones是官方来源,但是它们的数据格式很难使用。我发现en.wikipedia.org/wiki/List_of_tz_database_time_zones的工作更加轻松,该文件是基于IANA数据集(当前为2017c版本)构建的。
彼得·鲁斯特

66

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

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

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


真好!为我工作
Rotem

您能为文化做同样的事情吗?
Jim Aho

这比强制在代码中强制时区更简单。
Dan Dascalescu

33

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

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

console.log(nDate);


我很困惑-这是非常令人讨厌的,但是它是IMO的关键问题。节点版本<13仅具有“ en-us”的语言环境数据,这意味着它会抛出(在某些情况下)或为每个其他国家/地区提供错误的日期格式。而且在许多情况下,日期看起来正确无误,但日期和月份却互换了!而且Node 13才在几周前发布,因此这个问题几乎适用于所有人。
汤姆

我看到以下@Marshall的回答提出了一种在某些情况下解决此问题的方法(不适用于Lambda和其他FaaS)。
汤姆

31

不幸的是,设置process.env.TZ并不能很好地起作用 -基本上,更改何时生效尚不确定。

因此,在启动节点之前设置系统的时区是您唯一的正确选择。

但是,如果您不能这样做,则可以使用节点时间作为一种解决方法:以本地时间或UTC时间获取时间,然后将其转换为所需的时区。请参阅如何在Node.js中使用时区偏移量?有关详细信息。


1
npm模块时间对我来说很棒。我设置为utc,然后使用utc进行所有设置,因此代码可在具有不同时区的不同机器之间移植。
2014年

不再有这个问题了吗?
Bloke 2015年

16

env TZ='Europe/Amsterdam' node server.js@uhef 的解决方案适用于您的应用程序无法用于分支进程的情况,但是当您使用分支进程时,特别是当您使用诸如gulp的构建工具启动应用程序时,该命令gulp将使用env值,但是不是由gulp创建的过程(您的应用)。

要解决此问题,您必须执行以下操作:

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

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


由于阿姆斯特丹具有DST,这是否仍是在格林尼治标准时间+1达到“午夜UTC”的理想频率?
FlavorScape

1
我使用的@FlavorScape Etc/UTC 在中也有特定的偏移量Etc,但是该偏移量与预期的相反。 Etc/GMT-1是UTC + 1小时。请参阅https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
–npskirk,

9

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

列出时区

timedatectl list-timezones

设定时区

sudo timedatectl set-timezone America/New_York

验证时区

timedatectl

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

同样,维护许多实例也很容易,


2
虽然moment.js在当时是一个很棒的库,但是目前有更小的替代方案(例如date-fns)。瞬间是巨大的 ; 请不要将其推荐给客户端应用程序。
Dan Dascalescu

5

我知道这个线程很旧,但是我认为这会对像我这样从Google登陆到这里的人有所帮助。

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

app.yaml

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

5

这是将Node.js应用程序部署到Amazon AWS Elastic Beanstalk的答案。我在其他任何地方都没有看到此文档:

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

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


3

从节点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)'

1
这在Linux / Mac上很好用,但在Windows上不起作用。
内特

不,它也适用于Windows,请使用set TZ='UTC' node index.js
user3896501

@ user3896501不,该语法为整个过程设置env var- 不是像OP示例中那样运行
Ian Grainger

2

您可以抽出时区。它使您可以设置位置,还可以节省夏令时。


2
对于这样的任务,矩是非常重要的,除非您无法通过Date或其他内置模块实现所需的行为,否则我不建议您这样做。
克里斯·威廉姆森

2

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

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

在此处查看时区列表

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

在这种情况下-我正在将EPOCH转换为Eastern。

//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');


1

更新node.js v13

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

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

  1. 如果安装了full-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

对于作为Azure Web应用程序的node.js,除了WEBSITE_TIME_ZONE的应用程序设置外,您还需要<your project>\node_modules\full-icu在完成npm i full-icu之后将NODE_ICU_DATA设置为例如。不建议在Azure上全局安装该软件包,因为该目录是临时目录,可以清除掉。

参考:1. NodeJS无法正确应用日期语言环境

  1. 您还可以使用intl选项构建node.js,有关更多信息,请参见此处

1
从v13开始,full-icu包含在Node的标准/官方构建中,因此不再需要上述步骤。
汤姆

1

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

npm install tzdata -y

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

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

new Date()

希望对您有帮助


1

您可以通过环境变量设置执行Node.js的过程时区TZUTC

因此,所有时间都将以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的默认时区。
内特

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.