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

Posted

技术标签:

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

【问题讨论】:

很确定你不能真正做到这一点。更改系统时区设置。 thejh 是对的,您不能更改时区。使用 JS 时间库(如 moment.js)并添加/减去小时数。 最简单且正确的方法是更改​​系统的时区。 这些是有用的 cmets,但大多数时候你不是系统管理员 ;) 【参考方案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 (***.com/a/60771964/399105) 中修复,但是在启动 Node.js 之前设置 TZ 可能仍然是最安全的。例如,Jest 还不能正确处理 TZ:Setting 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,您可以执行以下操作:

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

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

    在您的代码中使用 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

    你也可以用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://***.com/a/53282481/17700714

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

【讨论】:

以上是关于如何在 node.js 中设置默认时区?的主要内容,如果未能解决你的问题,请参考以下文章

如何在流明 5.2 中设置时区?

如何在 Dockerfile 中设置 Node 环境变量以运行 node.js 应用程序?

如何在 Winston/Node.js 中设置日志级别

如何在 Node.js 中设置 dotenv 文件?

如何使用 swig node js 在变量中设置 JSON 对象?

运行 cron 作业 (Node.js) 时如何在 Amazon Elastic Beanstalk 中设置环境变量?