Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字符串创建时Javascript日期错误_Javascript_Node.js_Timestamp - Fatal编程技术网

从字符串创建时Javascript日期错误

从字符串创建时Javascript日期错误,javascript,node.js,timestamp,Javascript,Node.js,Timestamp,当用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。但我从数据库中取出值,并将其与实际日期进行比较,以查看经过了多少时间。我不希望它被更正,因为它已经在这个时区获得。为什么会这

当用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的一个问题。我不能到处责备它

多亏了@zerkms,我找到了正确获取数据的方法。我编写了2个函数来确保数据以正确的方式保存在数据库中。它以YYYY-MM-DDTHH:MM:SS+GMT(2015-12-05T13:11:59+01:00)的格式向我传递字符串。此字符串可以用“新日期(“2015-12-05T13:11:59+01:00”)正确解释

var helper=新函数(){
//以正确的格式获取时区
this.getTimeZone=函数(){
var offset=new Date().getTimezoneOffset(),o=Math.abs(offset);
返回(偏移量<0?+”:“-”+(“00”+数学层(o/60)).slice(-2)+:“+(“00”+(o%60)).slice(-2);
}
this.dateString=函数(日期){
var year=date.getFullYear();
month=date.getMonth()+1;//月份的索引为零
月=(“0”+月).slice(-2);
day=date.getDate();
日=(“0”+日)。切片(-2);
hour=date.getHours();
小时=(“0”+小时).slice(-2);
分钟=日期。getMinutes();
分钟=(“0”+分钟)。切片(-2);
秒=date.getSeconds();
秒=(“0”+秒).slice(-2);
时区=helper.getTimeZone();
返回年份+“-”+月份+“-”+天+“T”+小时+”:“+
分钟+“:”+秒+时区;
}
}

我的猜测是,如果没有偏移量供应,ISO 8601格式假定UTC,但它不是重复的。我的输入是从数据库中获取的日期字符串。那么日期字符串应该在哪个时区?JavaScript将您的字符串解释为UTC,因此,如果您只想将其与另一个日期进行比较,也可以使用UTC“已经使用UTC+1”——DB和JS如何知道这一点?如果它是
+01:00
时区,则应该表示它。您当前的字符串以
UTC
指定时间,因此它被解释为时间。如果你想用一个特定的时区来解释它,把它显式地放在datetime字符串中。当机器切换到夏季/冬季时,它将中断所有以前的日期。所以这不是“答案”,这是一个解决办法,在这一刻偶然发生的工作。好的一点,谢谢。但我还能如何将一小时前拍摄并保存到数据库中的日期与实际日期进行比较呢?事实上,我不同意你的观点。数据在没有GMT的情况下写入数据库。这就是它被错误地解释为新日期的原因。我的解决方案修复了“数据在没有GMT的情况下写入数据库”——这是正确的。实际时区丢失。这意味着,如果您的当地时区因冬季/夏季时间而发生变化,则较旧的日期将是正确的,或将移动1小时。这意味着数据将不正确。“我的解决方案解决了这个问题”-它没有解决。“但是,还有什么方法可以将保存到数据库中的一小时前的日期与实际日期进行比较?”--您必须将其保存为带有时区的格式。如果时区数据丢失-您无法*可靠地恢复它。
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;
    }
}