如何在node.js中设置默认时区?
如何在node.js中设置默认时区?
Answers:
根据此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已经读取了环境变量。
process.env.TZ = 'Europe/Amsterdam'
我很高兴,现在在哪里可以找到我可以设置的所有有效值的列表”这样的内容。但我每次都找不到。
zone.tab
档案中的文件。
这是一个在不使用任何外部模块的情况下获取NodeJ中的自定义时区日期时间的100%工作示例:
const nDate = new Date().toLocaleString('en-US', {
timeZone: 'Asia/Calcutta'
});
console.log(nDate);
不幸的是,设置process.env.TZ
并不能很好地起作用 -基本上,更改何时生效尚不确定。
因此,在启动节点之前设置系统的时区是您唯一的正确选择。
但是,如果您不能这样做,则可以使用节点时间作为一种解决方法:以本地时间或UTC时间获取时间,然后将其转换为所需的时区。请参阅如何在Node.js中使用时区偏移量?有关详细信息。
env TZ='Europe/Amsterdam' node server.js
@uhef 的解决方案适用于您的应用程序无法用于分支进程的情况,但是当您使用分支进程时,特别是当您使用诸如gulp的构建工具启动应用程序时,该命令gulp
将使用env值,但是不是由gulp创建的过程(您的应用)。
要解决此问题,您必须执行以下操作:
$ export TZ="Europe/Amsterdam"; gulp myTask
这将为TZ
您正在使用的控制台中启动的所有进程设置环境变量,包括在同一控制台中gulp命令之后执行的所有后续进程,而无需export TZ="Europe/Amsterdam";
再次使用前缀执行它们。
Etc/UTC
在中也有特定的偏移量Etc
,但是该偏移量与预期的相反。 Etc/GMT-1
是UTC + 1小时。请参阅https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
设置服务器时区并使用NTP同步。这是更改服务器时间的一种更好的解决方案。
列出时区
timedatectl list-timezones
设定时区
sudo timedatectl set-timezone America/New_York
验证时区
timedatectl
我更喜欢对服务器和数据库使用UTC时区。任何转换都必须在客户端上进行。我们可以在客户端使用moment.js。
同样,维护许多实例也很容易,
从节点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)'
set TZ='UTC' node index.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');
更新node.js v13
正如@Tom指出的那样,现在v13中已内置了完整的icu支持。因此可以省略设置步骤。您仍然可以自定义在运行时中如何构建或使用icu的方式:https : //nodejs.org/api/intl.html
对于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的应用程序设置外,您还需要<your project>\node_modules\full-icu
在完成npm i full-icu之后将NODE_ICU_DATA设置为例如。不建议在Azure上全局安装该软件包,因为该目录是临时目录,可以清除掉。
参考:1. NodeJS无法正确应用日期语言环境
您可以通过环境变量设置执行Node.js的过程时区TZ
以UTC
因此,所有时间都将以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 = "Aisa/Tehran";
这将设置将在整个节点应用程序中使用的时区