【问题标题】:Javascript Date wrong when Created from string [duplicate]从字符串创建时Javascript日期错误[重复]
【发布时间】:2016-03-08 20:19:24
【问题描述】:

当我在 javascript 中从字符串创建新数据时遇到了一个非常奇怪的错误。 我的字符串看起来像这样2015-12-04T01:42:13 代码如下

date = new Date(2015-12-04T01:42:13)
console.log(date);

console.log 的结果是2015-12-04T02:42:13,但为什么呢?我现在 UTC 在我的时区是 +1。但我将值从数据库中取出,并将其与实际日期进行比较,以查看已经过去了多少时间。我不希望它被纠正,因为它已经在这个时区获得了。为什么会这样?逻辑是什么? 如何从字符串创建确切的日期?

这实际上似乎是 node.js 的一个问题。我不能到处复制它。

【问题讨论】:

  • 我的猜测是,如果没有提供偏移量,ISO 8601 格式假定为 UTC
  • 它不是重复的。我的输入是从数据库中获取的日期字符串。
  • 那么日期字符串应该在哪个时区呢? JavaScript 将您的字符串解释为 UTC,因此如果您只想将其与另一个日期进行比较,也请使用 UTC
  • "已经使用 UTC +1" --- DB 和 JS 怎么知道呢?如果它是 +01:00 时区 - 它应该被表示。
  • 您当前的字符串在UTC 中指定时间,因此它被解释为这样。如果您希望在考虑特定时区的情况下对其进行解释 - 明确地将其放入该日期时间字符串。

标签: javascript node.js timestamp


【解决方案1】:

感谢@zerkms,我找到了一种正确获取数据的方法。我写了 2 个函数来确保数据以正确的方式保存在数据库中。它以以下格式向我提供字符串 YYYY-MM-DDTHH:MM:SS+GMT(2015-12-05T13:11:59+01:00)。这个字符串可以用 'new Date("2015-12-05T13:11:59+01:00")' 正确解释

var helper = new function(){
    //getting the timezone in correct format
    this.getTimeZone = function(){
        var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
        return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}

    this.dateString = function(date){
        var year = date.getFullYear();
        month = date.getMonth() + 1; // months are zero indexed
        month = ("0" + month).slice(-2);
        day = date.getDate();
        day = ("0" + day).slice(-2);
        hour = date.getHours();
        hour = ("0" + hour).slice(-2);
        minute = date.getMinutes();
        minute = ("0" + minute).slice(-2);
        second = date.getSeconds();
        second = ("0" + second).slice(-2);
        timezone = helper.getTimeZone();

        return year + "-" + month + "-" + day + "T" + hour + ":" +
        minute + ":" + second + timezone;
    }
}

【讨论】:

  • 当机器切换到夏季/冬季时间时,它将打破之前的所有日期。因此,这不是“答案”,而是此时偶然发生的一种解决方法。
  • 好点谢谢。但是,我还能如何将一小时前拍摄并保存到数据库中的日期与实际日期进行比较?
  • 其实我不同意你的意见。 Tha 数据在没有 GMT 的情况下写入数据库。这就是它被误解为新日期的原因。我的解决方案解决了它
  • "没有 GMT,数据被写入数据库。" --- 没错。实际时区丢失。这意味着如果您的当地时区由于冬季/夏季时间而发生变化 - 较早的日期将是正确的或偏移 1 小时。这意味着数据将不正确。 “我的解决方案解决了它” --- 它没有。
  • “但我还能如何将一小时前拍摄并保存到数据库中的日期与实际日期进行比较呢?” --- 您必须以带有时区的格式保存它。如果时区数据丢失 - 您无法*可靠地恢复它。
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
相关资源
最近更新 更多