如何在node.js中设置默认时区?
根据这个谷歌群组线程,您可以在调用任何日期函数之前设置 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 已经读取了环境变量。
至少在 Linux 环境中似乎对我有用的另一种方法是像这样运行您的 Node.js 应用程序:
env TZ='Europe/Amsterdam' node server.js
这至少应该确保从一开始就正确设置时区。
这是一个 100% 的工作示例,用于在 NodeJs 中获取自定义时区日期时间,而无需使用任何外部模块:
const nDate = new Date().toLocaleString('en-US', {
timeZone: 'Asia/Calcutta'
});
console.log(nDate);
不幸的是,设置process.env.TZ
效果不佳 - 基本上不确定更改何时生效(。
因此,在启动节点之前设置系统的时区是您唯一正确的选择。
但是,如果您无法做到这一点,应该可以使用节点时间作为解决方法:以本地或 UTC 时间获取时间,并将其转换为所需的时区。请参阅如何在 Nodejs 中使用时区偏移量?了解详情。
只需在主文件中设置环境变量,如索引.js或应用程序.js或主文件.js或任何文件名:
process.env.TZ = "Asia/Tehran";
这将设置将在整个节点应用程序中使用的时区
从节点 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)'
env TZ='Europe/Amsterdam' node server.js
> @uhef 的解决方案适用于您的应用程序无法使用分叉进程的情况,但当您使用分叉进程时,特别是当您使用构建工具(如 gulp (启动应用程序时,命令gulp
将采用 env 值,但由 gulp 创建的进程不是(您的应用程序(。
要解决此问题,您必须执行以下操作:
$ export TZ="Europe/Amsterdam"; gulp myTask
这将为您正在处理的控制台中启动的所有进程设置 TZ
环境变量,包括在同一控制台中执行 gulp 命令后执行的所有后续进程,而无需再次使用前缀 export TZ="Europe/Amsterdam";
执行它们。
设置服务器时区并使用 NTP 同步。这是更改服务器时间的一种更好的解决方案。
列出时区
timedatectl list-timezones
设置时区
sudo timedatectl set-timezone America/New_York
验证时区
timedatectl
我更喜欢为我的服务器和数据库使用 UTC 时区。任何转换都必须在客户端上处理。我们可以利用时刻.js在客户端。
维护许多实例也很容易,
我知道这个线程很旧,但我认为这将帮助像我这样的从谷歌登陆这里的人。
在 GAE Flex (NodeJs( 中,您可以在 app.yaml 文件中设置环境变量 TZ(管理应用程序中所有日期时区的变量(,我在这里给你举一个例子:
app.yaml
# [START env]
env_variables:
# Timezone
TZ: America/Argentina/Buenos_Aires
以下是将 Node.js 应用程序部署到 Amazon AWS Elastic Beanstalk 的用户的答案。我还没有在其他任何地方看到这个记录:
在 Configuration -> Software -> Environment Properties
下,只需设置键值对TZ
和您的时区,例如 America/Los Angeles
,然后应用更改。
您可以通过在 Node 应用程序中输出new Date().toString()
并注意时区后缀来验证效果。
您可以通过将环境变量TZ
设置为 UTC
来强制执行 Node.js 流程时区
所以所有时间都将以 UTC+00:00 为单位进行测量
完整列表: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
示例包.json:
{
"scripts": {
"start": "TZ='UTC' node index.js"
}
}
.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
对于节点.js作为 Azure Web 应用,除了 WEBSITE_TIME_ZONE 的应用程序设置外,还需要将NODE_ICU_DATA设置为 例如 <your project>node_modulesfull-icu
,当然是在你完成 npm i 全重症监护室之后。不建议在 Azure 上全局安装包,因为该目录是临时的,可以清除。
裁判:1. NodeJS 未正确应用日期语言环境
- 您还可以使用intl选项构建节点.js更多信息
您只需要在启动应用时设置它。
{
"scripts": {
"start:timezone": "TZ='utc' node index.js",
"start": "TC=$tz node index.js"
}
}
在 CI 或要启动应用的任何位置,可以像npm run start:timezone
一样静态运行它,也可以像 npm run start utc
一样动态地将时区传递给进程
另一种方法是在应用的入口点中设置它,如下所示:
process.env.TZ = "UTC";
你可以采取时刻时区。它可以让您设置位置,还可以处理夏令时。
有时您可能在其他地方的虚拟服务器上运行代码 - 当运行 NODEJS 或其他风格时,这可能会变得混乱。
这是一个修复程序,可让您轻松使用任何时区。
在此处查看时区列表
只需将您的时区短语放在 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');
我使用这个 npm 包 Unix-system-timezone
您可以使用库 tzdata 配置全局时区:
npm install tzdata -y
使用变量设置环境后,例如:TZ=美国/波哥大
并在项目中进行测试:
new Date()
希望对您有所帮助
const nDate = new Date().toLocaleString('en-US', {
timeZone: 'Asia/Seoul'
});
console.log(nDate);
只需在应用程序上process.env.TZ = "Asia/Dhaka"; //SET Default Timezone
.js导入模块后,它将适用于您的整个项目。
这有效;https://stackoverflow.com/a/53282481/17700714
var date = new Date('2016-08-25T00:00:00')
var userTimezoneOffset = date.getTimezoneOffset() * 60000;
new Date(date.getTime() - userTimezoneOffset);