将时间转换为UTC时出现故障

Trouble converting time to UTC for highstocks

本文关键字:故障 UTC 时间 转换      更新时间:2023-09-26

我最难尝试将此日期从API转换为UTC毫秒。截至目前,我正在显示日期,但它显示的是7个小时后的第二天,我甚至没有数据。以下是示例格式:

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

我现在有这个代码

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

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

EDIT:jsfiddle示例:http://jsfiddle.net/b2NK6/

所以您想要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。

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

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对象的基元值。

注意:基元值返回为自1970 UTC 1月1日午夜以来的毫秒数[s]。

另请参阅W3Schools以获取Date对象的全面概述。

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

假设你的图表只涉及日期(没有时间成分),这里有一个你可以使用的技巧:

  1. 执行originalDate.getTime()以获取自UTC 1970年1月1日午夜以来的毫秒数,例如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)