如何将日期的时区设置为UTC
how to make the timezone of date to UTC
我有一个过滤器,用于将日期转换为 UTC 日期。
.filter('utc', function(){
return function(val){
var date = new Date(val);
return new Date(date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds(),date.getTimezoneOffset());
};
})
所以当我给出日期 2016-06-18
它 return 是这样的日期 2016 年 6 月 18 日星期六 00:00:00 GMT-0400(东部夏令时)
日期正确,但未反映正确的时区。
我希望它在 UTC 时区中 return,例如最后的 Z
您可以使用 Date.prototype.toISOString() 来实现。
你可以修改你的函数为return
return new Date(date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds(),date.getTimezoneOffset()).toISOString();
一些事情:
Date
构造函数没有接受时区偏移量的参数。 seconds
后面的参数是milliseconds
。 Refer to the MDN reference.
您不应将基于 UTC 的值传递到需要基于本地值的 Date
构造函数中。这样做会产生跟踪完全不同的时间点的效果。你可能认为你正在调整时区偏移,但你不是。
Date
对象总是具有以下行为:
它跟踪单个值,由 .valueOf()
(继承自 Object.valueOf
)或 .getTime()
返回。该值是从 1970 年 1 月 1 日午夜开始经过的毫秒数,采用 UTC(忽略闰秒)。
绝大多数输入和输出函数使用 local 时区 - 即代码所在计算机设置的时区是 运行。使用 UTC 的函数通常在其名称中包含 "UTC
"。
无法使 Date
对象使用不同的时区。任何其他声明的解决方案都没有考虑边缘情况。特别是,"epoch-shifting" 是一种常见的方法,当单独使用时,它从根本上是错误的。 (将 UTC 值传递到本地时间参数是纪元偏移的一种实现。)
如果您正在寻找快速解决方案,请考虑 .toUTCString()
或 .toISOString()
。
- 一些浏览器可能还支持 ECMAScript 国际化 API 让你做:
.toLocaleString(undefined, { timeZone: 'UTC'})
Moment.js 是处理此类问题的非常常用的库,它填补了 Date
对象所具有的许多空白。 Local-to-UTC 是这样完成的:
moment(input, inputFormat).utc().format(outputFormat)
- 请注意,moment 通过时代转变发挥了很多魔力,但它通过 public API 和新对象类型(
moment
对象)隐藏了这一点,这提供了单独使用 Date
对象无法获得的安全层。
请注意,在您的问题中,您根本没有说明 val
变量中的内容。根据它是数字还是字符串,以及字符串的格式,Date
对象的解析行为可能会发生很大变化。
我有一个过滤器,用于将日期转换为 UTC 日期。
.filter('utc', function(){
return function(val){
var date = new Date(val);
return new Date(date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds(),date.getTimezoneOffset());
};
})
所以当我给出日期 2016-06-18
它 return 是这样的日期 2016 年 6 月 18 日星期六 00:00:00 GMT-0400(东部夏令时)
日期正确,但未反映正确的时区。
我希望它在 UTC 时区中 return,例如最后的 Z
您可以使用 Date.prototype.toISOString() 来实现。
你可以修改你的函数为return
return new Date(date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds(),date.getTimezoneOffset()).toISOString();
一些事情:
Date
构造函数没有接受时区偏移量的参数。seconds
后面的参数是milliseconds
。 Refer to the MDN reference.您不应将基于 UTC 的值传递到需要基于本地值的
Date
构造函数中。这样做会产生跟踪完全不同的时间点的效果。你可能认为你正在调整时区偏移,但你不是。Date
对象总是具有以下行为:它跟踪单个值,由
.valueOf()
(继承自Object.valueOf
)或.getTime()
返回。该值是从 1970 年 1 月 1 日午夜开始经过的毫秒数,采用 UTC(忽略闰秒)。绝大多数输入和输出函数使用 local 时区 - 即代码所在计算机设置的时区是 运行。使用 UTC 的函数通常在其名称中包含
"UTC
"。无法使
Date
对象使用不同的时区。任何其他声明的解决方案都没有考虑边缘情况。特别是,"epoch-shifting" 是一种常见的方法,当单独使用时,它从根本上是错误的。 (将 UTC 值传递到本地时间参数是纪元偏移的一种实现。)
如果您正在寻找快速解决方案,请考虑
.toUTCString()
或.toISOString()
。- 一些浏览器可能还支持 ECMAScript 国际化 API 让你做:
.toLocaleString(undefined, { timeZone: 'UTC'})
- 一些浏览器可能还支持 ECMAScript 国际化 API 让你做:
Moment.js 是处理此类问题的非常常用的库,它填补了
Date
对象所具有的许多空白。 Local-to-UTC 是这样完成的:moment(input, inputFormat).utc().format(outputFormat)
- 请注意,moment 通过时代转变发挥了很多魔力,但它通过 public API 和新对象类型(
moment
对象)隐藏了这一点,这提供了单独使用Date
对象无法获得的安全层。
- 请注意,moment 通过时代转变发挥了很多魔力,但它通过 public API 和新对象类型(
请注意,在您的问题中,您根本没有说明
val
变量中的内容。根据它是数字还是字符串,以及字符串的格式,Date
对象的解析行为可能会发生很大变化。