【问题标题】:Trouble converting time to UTC for highstocks无法将高库存的时间转换为 UTC
【发布时间】:2012-08-29 16:48:21
【问题描述】:

我很难将这个日期从 API 转换为 UTC 毫秒。截至目前,我正在显示日期,但它会提前 7 小时显示,并持续到第二天,我什至没有数据。这是示例格式:

2012 年 8 月 31 日上午 9:00:00

我目前有这个代码

var formattedDate = new Date(data[i].Time);
formattedDate = formattedDate.getTime();

这似乎返回了正确的值类型,但日期是错误的。我也试过 getUTCMilliseconds() 并返回 0。

编辑:jsfiddle 示例:http://jsfiddle.net/b2NK6/

【问题讨论】:

  • 你试过 getUTCMilliseconds() 吗?
  • 是的,我不认为日期对象是 UTC 并且提前一个小时.. 编辑:它返回 0

标签: javascript jquery date timezone highcharts


【解决方案1】:

所以你想要 UTC 时间的原始时间戳,而不是本地时间?

比较:

(new Date(Date.UTC(2012, 7, 31, 9, 0, 0, 0))).getTime(); /* month 7 is August */

(new Date(Date.parse("8/31/2012 9:00:00 AM"))).getTime();

当您解析字符串(第二个示例)时,它会在创建日期对象时应用您的本地时区信息。如果您在 -0700 时区,则创建的日期实际上对应于 UTC 下午 4:00。

但是,如果您通过明确说明您指定 UTC 值来创建日期对象,它将为您提供 UTC 上午 9:00,对应于时区 -0700 的凌晨 2:00。

已编辑以提供更清晰、更正确的代码示例。

【讨论】:

  • 这只是将时间转换为“Fri Aug 31 2012 09:00:00 GMT-0700 (Pacific Daylight Time)”
  • 啊,好吧,我明白你在说什么,我怎样才能让它更有活力并使用这个jsfiddle.net/ecHpX
  • 让它工作,只是事先创建了一个日期,以便从 UTC 内部调用,这样我就可以执行 t.getFullYear()、t.getMonth() 等
  • 如果使用 get 方法,请务必使用 getUTCFullYear()、getUTCMonth() 等。想想“Dec 31 2012 11:00:00 pm -0700”的情况就明白为什么了!
  • 作为替代方案,您还可以将 UTC 时区 ("+0000") 显式添加到日期字符串中,例如 "8/31/2012 9:00:00 AM +0000",然后通过它到 Date.parse().
【解决方案2】:
var dateString = "8/31/2012 9:00:00 AM";  // assuming this is expressed in local time

var millisecondsSinceTheEpoch = (new Date(dateString)).valueOf();  // 1346418000000

var isoString = (new Date(millisecondsSinceTheEpoch)).toISOString();  // 2012-08-31T13:00:00.000Z

// Note: example return values from a computer on U.S. Eastern Daylight Time (-4:00).

来自W3Schools

valueOf() 方法返回 Date 对象的原始值。

注意:原始值返回为自 UTC 1970 年 1 月 1 日午夜以来的毫秒数。

另请参阅 W3Schools 以获取 comprehensive overview of the Date object

【讨论】:

  • 嗯,我收到了1346418000000...你收到了什么?
  • 对我来说,它转换为 ISO 字符串 2012-08-31T16:00:00.000Z。你的电脑是太平洋夏令时间吗?
  • 你能告诉我一个 jsfiddle 的例子吗?然后我可以在单独的修订版中发布我的一些代码
【解决方案3】:

HighStocks 希望其日期与 UTC 午夜日期边界对齐。

假设您的图表仅处理日期(没有时间组件),您可以使用以下技巧:

  1. 执行 originalDate.getTime() 以获取自 UTC 1/1/1970 午夜以来的毫秒数,例如1362286800000
  2. 将毫秒数除以 (1000*60*60*24) 得到自 1970 年 1 月 1 日午夜 UTC 以来的 天数,例如15767.208333333334
  3. Math.round() 将数字四舍五入到最接近的 UTC 午夜,例如15767
  4. 将数字乘以 (1000*60*60*24) 以使其回到毫秒刻度,例如1362268800000

这是最终的公式:

var utcMidnight=new Date(Math.round(anyZoneMidnight.getTime()/86400000)*86400000)

【讨论】:

    猜你喜欢
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2013-02-03
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多