【问题标题】:Date.getTime returns differents values on IOs and WindowsDate.getTime 在 IO 和 Windows 上返回不同的值
【发布时间】:2015-10-20 08:16:55
【问题描述】:

我有一个自定义绑定处理程序,它返回给定日期的时间:

var item = allBindings().data;

var dateInit = new Date(item.Fecha());

var timezone = 0; //dateInit.getTimezoneOffset() * 60000;

var ticksInit = dateInit.getTime() + timezone;
var duration = item.Duracion() * 60 * 1000;
var ticksEnd = ticksInit + duration;

var hourInit = getShortTime(new Date(ticksInit));
var hourEnd = getShortTime(new Date(ticksEnd));

item.Fecha() 是一个 observable,包含 JSON 格式的日期:在这种情况下为 '2015-10-20T12:00:00'

在 Windows 浏览器上,ticksInit 的值为 1445335200000,但在 Ipad 上,它的值为 1445342400000。

相差只有两个小时,似乎 Ipad 正在应用时区校正器。

【问题讨论】:

  • 您应该从不使用 Date 构造函数解析字符串,使用 your own parser 或维护良好的库手动解析它。在 ES5 中,没有时区的类 ISO 格式被视为 UTC,在 ECMAScript 2015 中,它们被视为本地(并且在以前的版本中依赖于实现)。这可以解释差异等于时区偏移量。此外,IE8 将返回 NaN(它不会原生解析 ISO 格式)。
  • 使用moment.js 会容易得多。此外,您最好将时区注释掉,因为在日期中添加刻度并不是补偿时区偏移的正确方法。

标签: javascript ios ipad datetime knockout.js


【解决方案1】:

根据@RobG 的评论,这里是解决问题的代码:

var item = allBindings().data;

var aDate = item.Fecha().split("T")[0].split("-");
var aTime = item.Fecha().split("T")[1].split(":");

var dateInit = new Date(aDate[0],aDate[1]-1,aDate[2],aTime[0],aTime[1]);

//var timezone = 0; //dateInit.getTimezoneOffset() * 60000;

var ticksInit = dateInit.getTime();
var duration = item.Duracion() * 60 * 1000;
var ticksEnd = ticksInit + duration;

var hourInit = getShortTime(new Date(ticksInit));
var hourEnd = getShortTime(new Date(ticksEnd));

$(element).html(hourInit + "-" + hourEnd);

【讨论】:

  • item.Fecha().split(/\D+/)item.Fecha().match(/\d+/g) 的形式获取零件更简单。您似乎忽略了部分时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2015-05-04
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
相关资源
最近更新 更多