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

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

315517 次浏览

根据这个谷歌组线程,您可以在调用任何日期函数之前设置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并不是很好 -基本上不确定更改何时生效)。

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

然而,如果你不能这样做,应该可以使用节点时间作为变通方法:获取本地时间或UTC时间,并将它们转换为所需的时区。详见如何在Nodejs中使用时区偏移?

你可以用时刻时区。它可以让你设置你的位置,也照顾到日光节约时间。

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

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

这至少可以确保从一开始就正确地设置了时区。

来自@uhef的解决方案env TZ='Europe/Amsterdam' node server.js适用于应用程序不能使用fork进程的情况,但当你使用fork进程时,特别是当你使用像狼吞虎咽地吃这样的构建工具启动应用程序时,命令gulp将接受env值,但由狼吞虎咽地吃创建的进程不(你的应用程序)。

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

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

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

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

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

app.yaml

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

这里是一个100%工作的例子,在NodeJs中获得自定义时区日期时间,而不使用任何外部模块:

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


console.log(nDate);

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

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

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

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

列出时区

timedatectl list-timezones

设置时区

sudo timedatectl set-timezone America/New_York

确认时区

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

维护多个实例也很容易,

更新node.js v13版本

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

对于Windows上的node.js,你可以做以下事情:

  1. 如果已经安装full-icu,将正确应用日期区域设置

    < p > 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应用程序,除了WEBSITE_TIME_ZONE的应用程序设置,你还需要将NODE_ICU_DATA设置为例如<your project>\node_modules\full-icu,当然是在你完成npm i full-icu之后。不建议在Azure上全局安装包,因为该目录是临时的,可能会被删除。

< p >参考: 1. NodeJS没有正确应用日期区域设置 < / p >
  1. 你也可以用intl选项构建node.js,更多信息在这里

有时你可能在其他地方的虚拟服务器上运行代码——当运行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');

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

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

npm install tzdata -y

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

在你的项目中测试:

new Date()

希望能帮到你

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

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

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

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

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

这个作品< p >; https://stackoverflow.com/a/53282481/17700714 < / p >
var date = new Date('2016-08-25T00:00:00')
var userTimezoneOffset = date.getTimezoneOffset() * 60000;
new Date(date.getTime() - userTimezoneOffset);

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


console.log(nDate);