我有一个奇怪的时区/日期格式问题,最近出现了一些新代码,更奇怪的是它只会影响两个月 - 八月和九月。
代码采用UTC时间的日期字符串格式如下:
10-06-2017 09:29:15
并将其转换为具有相同格式但具有本地时间的新字符串。 zeroPad功能可确保格式保持不变。
我们在三月实施了它,一切正常。它位于IIS9 / Server 2012上的Classic ASP中。
一旦我们到了八月,它就破了。 08-10-2017 09:33:06成为12-09-2016 20:33:06。
任何人都可以看到我做错了吗?
function jsConvert(dateString) {
var patterns = dateString.split(/[\-\s:]/g);
var date = new Date(parseInt(patterns[2]),
parseInt(patterns[0]) - 1,
parseInt(patterns[1]),
parseInt(patterns[3]),
parseInt(patterns[4]),
parseInt(patterns[5]));
date.setTime(date.getTime() - getTimezoneOffset() * 60 * 1000);
var result = zeroPad(date.getMonth() + 1);
result += '-' + zeroPad(date.getDate());
result += '-' + date.getFullYear();
result += ' ' + zeroPad(date.getHours());
result += ':' + zeroPad(date.getMinutes());
result += ':' + zeroPad(date.getSeconds());
return result;
}
function zeroPad(number) {
return (number < 10) ? '0' + number : number;
}
&#13;
答案 0 :(得分:0)
你的代码就好像getTimezoneOffset()函数返回几分钟一样,因为你乘以60然后乘以1000,得到毫秒。
但是如果你的getTimezoneOffset返回秒数,那么你将过多地进行乘法运算,因此会跳回太多时间。
我认为要跳回你所获得的距离必须是毫秒。 @CBroe上面提到,也许你的意思是内置的getTimezoneOffset函数,这确实在几分钟内完成。也许您在其他地方的代码中定义了一个单独的getTimezoneOffset函数,它以毫秒为单位返回一个答案?在这种情况下,CBroe的答案修复了它。
例如,您可以添加以下内容吗?
首先,添加console.log("A",dateString)
。
在var patterns = dateString.split(/[\-\s:]/g);
之后添加一行console.log("B",patterns);
。
在var date = ...(patterns[5]));
之后添加一行console.log("C",date);
。
在date.setTime...1000);
之后添加一行console.log("D",date); console.log("E",getTimezoneOffset());
。
如果您向我们展示这些线的输出,我们应该能够轻松查明问题。我已经包含了项目E,因为我只是想知道你的系统中是否还有另一个getTimezoneOffset()函数,我们不知道,或者其他什么。看到它的价值将有助于让每个人放心。
同时您能确认运行代码的时区吗?我猜这是在美国而不是欧洲,因为你喜欢在一天之前放一个月?
答案 1 :(得分:0)
事实证明,这是一个已知但虽然模糊不清的问题。这与parseInt假设带有前导零的数字不是基数10,而是基数的事实有关。这里有详细记录:Javascript parseInt() with leading zeros
我做了更改后:
parseInt(patterns[2]**, 10**);
一切都很好。
感谢您的投入。