【问题标题】:new Date(year, month, date) in node js is automatically getting converted to UTC timezone节点 js 中的新日期(年、月、日)自动转换为 UTC 时区
【发布时间】:2017-07-26 15:23:15
【问题描述】:
    var dateInCST; //Getting CST date as input.

    /*Triming the time part and retaining only the date.*/
    var onlyDateInCST = new Date(dateInCST.getUTCFullYear(), dateInCST.getUTCMonth(), dateInCST.getUTCDate()); 

    console.log(onlyDateInCST);

我在 +5:30 即 IST 时区。

在通过提供年月日创建日期的过程中,节点js将其视为IST并自动扣除-5:30。

Node js 通过将日期视为服务器时区来自动将日期转换为 UTC。 但在浏览器中,我得到了正确的 CST 日期而没有时间。

例子:

var today = new Date(2017, 2, 7);
console.log(today);

日期应该是 2017-03-07T00:00:00.000Z。 但是节点 js 会扣除 UTC 之间的服务器时区差异,即从该日期起 +5:30 和 日期对象变为 2017-03-06T18:30:00.000Z

为什么上述代码在 Node js 中的行为与浏览器不同。有什么解决方法吗?

编辑:

var date = new Date();
function createDateAsUTC(date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}
console.log(date);
console.log(createDateAsUTC(date));

NodeJs 输出

2017-03-08T12:28:16.381Z

2017-03-08T17:58:16.000Z

浏览器输出

2017 年 3 月 8 日星期三 17:58:17 GMT+0530(印度标准时间)

2017 年 3 月 8 日星期三 23:28:17 GMT+0530(印度标准时间)

Node js 行为和浏览器之间存在差异。 服务器(本地)时间是17:58。

new Date(?,?,?,?,?,?) 和 new Date(Date.UTC(?,?,?,?,?,?)) 有什么区别?

【问题讨论】:

  • 如果你做console.log(dateInCST);,你会得到什么?您收到的日期与您发送的日期相同吗?
  • 这取决于服务器时区,如果设置为 UTC,它将始终以 UTC 时区的日期和时间显示,同样浏览器的行为方式也相同(从操作系统获取时区)
  • @PavanKumarJorrigala 我在本地系统中运行它。我系统的时区是 IST,即 +5:30。我在问题中提供了更多细节。
  • 你可能想看看Date.UTC()
  • 不能单独使用Date 对象创建像dateInCST 这样的变量。 Date 对象在内部始终为 UTC,并使用本地时区进行转换...您可以使用 moment.js 执行此操作,但不能使用原始 Date

标签: javascript node.js date iso8601


【解决方案1】:

Nodejs 以ISO 8601 格式表示

Z 是零 UTC 偏移的区域指示符。 “09:30 UTC”是 因此表示为“09:30Z”或“0930Z”

你的情况

var today = new Date(2017, 2, 7);

2017-03-06T18:30:00.000Z 有效,因为它以 UTC 表示。

nodejs 中的默认日期格式可能是yyyy-mm-ddThh:mm:ss.fffZ,如果你将它更改为yyyy-mm-ddThh:mm:ss.fffZ+|-hh:mm,它将显示为2017-03-07T00:00:00.000+05:30


更新

我运行的日期和时区与您的相同,在我的机器上它没有显示 ISO 8601 格式,它只显示 toISOString() 方法

var today = new Date(2017, 2, 7);
console.log(today); --> Tue Mar 07 2017 00:00:00 GMT+0530 (India Standard Time)
console.log(today.toISOString()); --> 2017-03-06T18:30:00.000Z

为了复制我添加了moment.js

var today = new Date(2017, 2, 7);
console.log(moment(today).format()); --------> 2017-03-07T00:00:00+05:30
console.log(moment(today).utc().format()); --> 2017-03-06T18:30:00Z

【讨论】:

  • 如何将Node js中的默认格式改为“yyyy-mm-ddThh:mm:ss.fffZ+|-hh:mm”?
【解决方案2】:

如果您想要与浏览器中的完全相同,只需通过调用 toString 方法将其转换为字符串,如下所示。然后你会得到你所期望的正确日期。

(new Date()).toString();

【讨论】:

    【解决方案3】:

    当您创建 Date 对象时(无论是在浏览器中还是在 Node.js 中),都会创建实例,并将日期解释为当前时区的本地日期。请参阅second note in MDN docs

    如果您想立即以 UTC 格式创建日期,则必须使用

    new Date(Date.UTC(...))
    

    Date.UTC()new Date() 具有相同的输入语义。

    这里要注意的另一件事是,将日期实例打印到控制台将导致日期表示为始终以 UTC 表示的 ISO 时间戳。您可能希望通过打印 date.toString()date.toLocaleString() 来检查日期对象,这将显示当前时区的日期。

    【讨论】:

    • 为什么我的 NodeJS 在我执行 new Date() 时总是返回 UTC?
    • 很可能是因为您的 Node.js 认为它​​在 UTC 时区。也许你的电脑就是这样设置的?
    【解决方案4】:
    const test = new Date();
    const test1 = new Date(test.setUTCHours(0,0,0,0));
    

    【讨论】:

      【解决方案5】:

      您可以在 new Date() 中传递的日期字符串末尾附加字符串“UTC” 例如:

      var date= new Date("2019-2-21 UTC")
      

      现在 var 日期将是本地时间

      var d = new Date();
      var date = new Date(d + 'UTC');
      console.log(d)// date in UTC 
      console.log(date)// date in localtime
      

      `

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-30
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2019-09-07
      • 1970-01-01
      相关资源
      最近更新 更多