Javascript日期/时间解析,UTC到本地时间中断

时间:2017-08-10 10:37:48

标签: javascript parsing datetime

我有一个奇怪的时区/日期格式问题,最近出现了一些新代码,更奇怪的是它只会影响两个月 - 八月和九月。

代码采用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;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

getTimezoneOffset()函数中的时间单位是什么?

你的代码就好像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**);

一切都很好。

感谢您的投入。