如何在node.js中设置默认时区?
答案 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 ,您可以执行以下操作:
如果安装了full-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
对于作为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
答案 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