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

时间:2011-11-10 17:04:40

标签: node.js timezone

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

17 个答案:

答案 0 :(得分:97)

根据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已经读取了环境变量。

答案 1 :(得分:41)

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

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

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

答案 2 :(得分:28)

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

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

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

答案 3 :(得分:14)

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

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

console.log(nDate);

答案 4 :(得分:13)

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

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

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

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

答案 5 :(得分:5)

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

列出时区

timedatectl list-timezones

设置时区

sudo timedatectl set-timezone America/New_York

验证时区

timedatectl

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

维护很多实例也很容易,

答案 6 :(得分:5)

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

答案 7 :(得分:5)

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

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

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

答案 8 :(得分:3)

我知道这个帖子已经很老了,但我认为这样可以帮助像我这样来谷歌的人。

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

<强>的app.yaml

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

答案 9 :(得分:2)

您可以moment timezone。它可以让您设置您的位置,并负责夏令时。

答案 10 :(得分:2)

您可以通过将环境变量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"
  }
}

答案 11 :(得分:2)

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

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

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

答案 12 :(得分:1)

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

参考: 1. NodeJS not applying date locales properly

  1. 您还可以使用intl选项构建node.js,更多信息here

答案 13 :(得分:1)

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

npm install tzdata -y

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

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

new Date()

希望对您有帮助

答案 14 :(得分:0)

moment.js 中,您可以将默认时区设置为

const moment = require("moment");
moment.tz.setDefault("Asia/Kolkata");

或者您可以将分钟数加减到UTC

 // if your time zone is 330 minutes ahead of UTC
 const currentTimeInIndia = moment().utc().add(330,'minutes')

答案 15 :(得分:0)

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

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

Check here for list of timezones

只需将您的时区短语放在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');

答案 16 :(得分:0)

我使用此npm软件包unix-system-timezone