Node.js的新日期并不反映.ENV时区TZ变种

问题描述 投票:1回答:2

在Node.js的和Mac系统在一个有趣的问题只是偶然 - 基本上,如果你在.ENV文件,变量TZ运行与集时区VAR节点的实例,并且本机是在不同的时区,日期创建为f **卯起来在麦汁可能的方式,使:

时区设置正确

但是当你创建一个新的日期,时区并没有反映


看到这个例子中,(我的机器是在CET,时区欧洲/布拉格):

~/
11:13 (CET) $ node
new Date()
2019-02-04T10:30:23.053Z # Europe/Prague
new Date().getTimezoneOffset()
-60 # Europe/Prague
.exit

主场迎战TZ ENV集时区

✔ ~/
11:30 (CET) $ TZ=America/New_York node
new Date()
2019-02-04T10:31:40.968Z # 10:31! :D
new Date().getTimezoneOffset()
300 # America/New_York!

因此,它是不可能创建一个正确的日期,那么,因为所有的JS库就像时刻在结束日期对象使用。我的观点是,你永远也不会设置TZ变种运行Node.js的服务器,同时,我错过了什么?

node.js macos timezone-offset
2个回答
1
投票

你可以解决moment-timezone节点包您的问题。下面的代码可以帮助你解决你的问题。

const moment = require('moment-timezone')

function convertDate(dateInUTCFormat) { 
    return new Promise((resolve, reject) => { 
        var dec = moment(dateInUTCFormat);
        var normalDate = dec.tz('Asia/Kolkata').format('YYYY-MM-DD');  // GMT +5:30 (India)
        resolve(normalDate);
    }) 
}

另外你需要通过你在如2019-02-04T10:30:23.053Z UTC格式得到convertDate功能,并通过您的时区,我通过我的时区Asia/Kolkata日期格式。也许这将帮助你找到你的解决方案。


1
投票

你的例子看起来是正确的我。我怀疑您的计算机跟踪和显示方式的概念,时间是颠倒的。您的意见意味着你认为TZ用于从计算机的内部时钟获得UTC。这不是它的工作原理。

在内部,你的Mac使用UTC时间。您的Mac是不是“CET”。这是“与TZ的默认设置CET UTC”。 TZ控制如何需要偏移的本地时间戳或时区时的本地时间是从底层UTC的。如果更改TZ然后本地时间戳将在新的时区显示,但在UTC计算机内部计时不受影响。

特别是对于你的榜样,new Date()让你代表当前时间的Date对象。一个Date对象的默认字符串表示UTC时间。在您的例子中,你可以看到,这一次,显示为new Date()调用的结果:

    2019-02-04T10:30:23.053Z # Europe/Prague

是因为它的时区被示出为Z,指示UTC UTC时间。 (要记住,意义的一种方式是,“Z”是“零UTC的偏移量。”这种格式有时被称为“祖鲁”时间,因为“祖鲁”是国际民航组织拼音字母的码字为“Z”。)如果您的评论声称这是一个当地的欧洲/布拉格时间戳则评论是不正确。

第二new Date()的结果:

    2019-02-04T10:31:40.968Z # 10:31! :D

也示于UTC和为约一分钟后比所述第一结果。这不要紧,TZ这个过程是不同的,因为TZ不影响UTC时间戳。

看的本地时间,它是通过将TZ设置可以从计算机的时钟得到的UTC时间计算,使用toLocaleString对象上的Date方法。如果您在使用该方法重复你的测试,你会看到这样的内容:

    $ env TZ=Europe/Prague node 
    > now = new Date()
    2019-02-04T20:26:40.408Z
    > now.toLocaleString()
    'Mon Feb 04 2019 21:26:40 GMT+0100 (CET)'

    $ env TZ=America/New_York node 
    > now = new Date()
    2019-02-04T20:27:12.438Z
    > now.toLocaleString()
    'Mon Feb 04 2019 15:27:12 GMT-0500 (EST)'

这看起来非常合理。

BTW,节点,或JavaScript,是不是做什么不寻常这里。这是它的工作原理一切的方式。例如,date命令:

    $ env TZ=Europe/Prague date
    Mon Feb  4 21:54:49 CET 2019

    $ env TZ=America/New_York date
    Mon Feb  4 15:54:51 EST 2019
© www.soinside.com 2019 - 2024. All rights reserved.