在javascript中,如何获取UTC格式的时区值为新日期(2017,05,31).toISOString()?

时间:2017-06-07 15:48:38

标签: javascript date datetime

如何获取新日期(2017,05,31).toISOString()的时区值?当日期传递给Date构造函数时,对于任何日期,它始终为000Z。但是对于新的Date()。toISOString(),它给出了时区值。

new Date(2017,05,31).toISOString() gives "2017-05-30T18:30:00.000Z"

和新的Date()。toISOString()给出" 2017-06-07T15:29:23.692Z"。如何获取过去日期的UTC格式的时区?

3 个答案:

答案 0 :(得分:3)

如果您希望将时间默认为UTC的午夜,则可以使用Date.UTC(year, month, ...)首先创建基于UTC的时间戳。

var utcMay31 = Date.UTC(2017, 4, 31); // note: 4 = May (0 = January)

然后,从该时间戳创建Date

new Date(utcMay31).toUTCString(); // "Wed, 31 May 2017 00:00:00 GMT"

但是,如果您想知道Date对象中存储的时区,它实际上并没有。 Date代表自1970年1月1日00:00:00.000 UTC以来经过的总时间“瞬间”。

new Date().getTime(); // 1496851...

Date可以告诉您该用户在当时的分钟内与UTC的本地偏移量。

new Date().getTimezoneOffset(); // e.g. 0, -480, 300

否则,在创建日期字符串时,时区限制为两个选项,并且选择基于使用的方法 - 用户的本地时区或UTC。

new Date().toString();    // "now" in user's local time
new Date().toUTCString(); // "now" in UTC time
new Date().toISOString(); // "now" also in UTC time, alternate format
// etc.

答案 1 :(得分:2)

你很困惑ISO日期值没有显示"时区"相反,它们显示UTC时间。 Z代表祖鲁(UTC时间)。

2017-06-07T15:29:23的 692Z

粗体部分不是时区。它是毫秒,全部时间是UTC。它在设定日期显​​示000Z的原因是因为你没有'设置毫秒。

如果要显示时区,请使用toUTCString()。但是它会显示GMT,即UTC /格林威治时间。要以日期格式显示本地时区,您可以使用date.toLocaleString(' en-US',{timeZoneName:' short'})例如将显示日期加上美国当地时区。或者您可以使用toString(),它将显示GMT偏移+长本地时区。

答案 2 :(得分:0)

在javascript中,解析,渲染和构建日期始终假定为本地。它将转换为时间戳,即自1-1-1970 00:00:00以来的毫秒数。 JSON.stringify将转换为UTC字符串,但旧版framworks使用本地日期。一定要小心这一点。

var myDate = new Date(); // this is now.

您可以使用myDate.getTimezoneOffset()获取timezoneoffset(以分钟为单位),但这会为每个日期返回相同的偏移量(夏令时除外)

你不应该这样做:

var utcDate = new Date(+d+60000*d.getTimezoneOffset());
// +d convert the date to a timespan.
// getTimezoneOffset() is in minutes
// *60000 makes that in milliseconds, the scale timespans operate upon

日期有一些格式化日期的方法,但始终是本地日期或UTC日期。如果你想要不同的时区,你需要手动完成。

注意:Date.UTC(...)函数返回时间戳。您有时会看到移动日期,因此它们的行为类似于UTC。但这会在以后引起问题。

var date = new Date(2000,1,1,12,0,0);
// DO NOT USE (breaks at start of daylight saving time)
// these are date/times that have the UTC-value,
// but Javascript treats them like local dates with this value.
utcDate1 = (+date-60000*d.getTimeZoneOffset()); // minus!!
utcDate2 = new Date(Date.UTC(2000,1,1,12,0,0));
// DO NOT USE (breaks at start of daylight saving time)

顺便说一句 边缘,Chrome和Firefox在控制台中的显示日期不同:Edge和Firefox始终显示本地日期,Chrome显示UTC。此外,如果您更改时区,Edge将会搞砸。