0

我在 DST 转换期间将日期时间字符串转换为 unix ms 时间戳时遇到了 iOS 8.2 Safari 的一种奇怪行为。假设我们有 js 代码

function date2unix(dates){
  var len = dates.length;
  var result = [], arr;
  while(len--) {
    arr = dates[len].split(/[- :]/);
    result[len]= (new Date(arr[0], arr[1]-1, arr[2], arr[3],arr[4],arr[5]).getTime());
  }
  return result;
}

var dates =
["2015-03-29 00:00:00","2015-03-29 00:15:00","2015-03-29 00:30:00","2015-03-29 00:45:00","2015-03-29 01:00:00","2015-03-29 01:15:00","2015-03-29 01:30:00","2015-03-29 01:45:00","2015-03-29 03:00:00","2015-03-29 03:15:00","2015-03-29 03:30:00","2015-03-29 03:45:00"];

alert(date2unix(dates))

iOS 8.2 Safari 给出了模棱两可的值(1st == 5th, 2nd == 6th, ...),而 chrome 41.0.2272.101 行为正确。请注意,数组日期中省略了有争议的第 2 小时。有人可以帮我找到解决方法吗?

试试:http: //jsfiddle.net/q6vd0fos/

问候

4

1 回答 1

0

有问题的时间在您的时区中是无效的,因为它们落入了春季夏令时转换所造成的差距。

当你在 JavaScript 中这样做时,实现是未定义的。每个浏览器都会做不同的事情。有些浏览器会向前跳,有些会向后跳。您对此无能为力,因为它是不确定的行为。

另一种思考方式是 JavaScript 可能应该为这些值返回undefinedundefined它不能这样做的唯一原因是因为调用有效对象的构造函数而无法获得 an 。但从逻辑上讲,该值是未定义的。

下图来自DST 标签 wiki说明了差距。此特定图表属于美国太平洋时区,但同样的想法适用于所有使用 DST 的区域(但日期和时间会有所不同)。此图中从 2:00 到 3:00 的本地时间值未定义。例如,如果您指定这一天的 2:30,则某些实现会给您 1:30,而某些实现会给您 3:30。

春季向前 DST 过渡

正确的做法是不要尝试转换无效的时间。

另见:垃圾进,垃圾出

于 2015-04-05T02:44:09.590 回答