奇怪的Chap时间轴日期问题 - 除了FireFox之外,所有浏览器在未来呈现的项目

时间:2014-06-09 18:55:09

标签: javascript json google-visualization chap-links-library

我有一个奇怪的情况发生在这里。我将以下JSON传递给时间线控件:

[
  {
    "UserId": 2,
    "ItemId": 3,
    "ItemText": null,
    "ItemDate": "2014-06-09T18:51:37",
    "ItemDateEnd": null,
    "OutcomeScore": null
  },
...
]

这是一个简单的项目数组,我传递给控件进行渲染。在Firefox中,这完全呈现,没有任何问题。但是,我尝试过的每个其他浏览器都显示+1小时的项目。我已经在Opera,Chrome和IE9中尝试过它们,除了Firefox之外,它们都显示出同样的问题。现在时间在所有浏览器上按预期显示。

有趣的是,我现在正处于格林尼治标准时间夏令时+ 1小时......但为什么这会选择性地影响浏览器呢?

每个浏览器都运行完全相同的查询并获得完全相同的JSON。我很困惑,甚至不知道从哪里开始寻找。

我正在运行v2.5.0的时间线。我已经尝试更新到最新版本并发生了同样的事情,所以我回滚到2.5.0以解决问题,然后再将最新版本集成到页面中。

有人看过这个并有解决方案吗?

2 个答案:

答案 0 :(得分:1)

正如您所观察到的,

从字符串创建Date对象是不可靠的。您应该手动将这些字符串解析为Date对象,如下所示:

// assumes date string is in the format "yyyy-MM-ddTHH:mm:ss"
var dateMatch = dataItem.ItemDate.match(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/);
var year = parseInt(dateMatch[1], 10);
var month = parseInt(dateMatch[2], 10) - 1; // convert to javascript's 0-indexed months
var day = parseInt(dateMatch[3], 10);
var hours = parseInt(dateMatch[4], 10);
var minutes = parseInt(dateMatch[5], 10);
var seconds = parseInt(dateMatch[6], 10);
var date = new Date(year, month, day, hours, minutes, seconds);

答案 1 :(得分:1)

首先,请注意CHAP链接库的时间轴不支持字符串作为日期,您应该提供日期或带有数字的时间戳(请注意,时间轴的后继者vis.js支持字符串作为日期) 。现在,字符串作为日期工作,因为大多数浏览器现在支持从ISO日期字符串创建日期。

您遇到的问题是因为您提供的ISO日期字符串没有时区信息。显然并非所有浏览器在这种情况下都具有相同的默认行为。在Firefox和其他浏览器的JavaScript控制台中输入以下内容:

new Date("2014-06-09T18:51:37").toISOString() 
// output is ambiguous, time zone information missing

您会看到他们以不同的方式添加时区信息。为防止出现这种歧义,您应自行提供时区信息。要以UTC格式指定时间,请在字符串末尾添加Z:

new Date("2014-06-09T18:51:37Z").toISOString()  
// output is unambiguous