【问题标题】:how to make the timezone of date to UTC如何将日期的时区设置为 UTC
【发布时间】:2016-06-20 16:52:20
【问题描述】:

我有一个过滤器,用于将日期转换为 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

它返回这样的日期 2016 年 6 月 18 日星期六 00:00:00 GMT-0400(东部夏令时间)

日期正确,但未反映正确的时区。

我希望它以 UTC 时区返回,比如最后的 Z

【问题讨论】:

  • 为什么不使用像 MomentJS 和 MomentJS 时区这样的东西?会让你的生活更轻松。
  • 可能duplicate
  • 不,我只想快速解决

标签: javascript angularjs timezone date-format utc


【解决方案1】:

一些事情:

  • Date 构造函数没有接受时区偏移的参数。 seconds 后面的参数是millisecondsRefer to the MDN reference

  • 您不应将基于 UTC 的值传递到需要基于本地值的 Date 构造函数中。这样做将具有跟踪完全不同的时间点的效果。您可能认为您正在调整时区偏移,但事实并非如此。

  • Date 对象总是具有以下行为:

    • 它跟踪由.valueOf()(继承自Object.valueOf)或.getTime() 返回的单个值。该值是自 1970 年 1 月 1 日午夜以来经过的毫秒数,以 UTC 表示(忽略闰秒)。

    • 绝大多数输入和输出函数都使用 本地 时区 - 即由运行代码的计算机设置的时区。与 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 通过 epoch-shifting 发挥了很多魔力,但它通过公共 API 和新对象类型(moment 对象)隐藏了这一点,它提供了您无法获得的安全层单独使用 Date 对象。
  • 请注意,在您的问题中,您根本没有说明 val 变量中的内容。根据是数字还是字符串,以及该字符串的格式,Date 对象的解析行为可能会发生很大变化。

【讨论】:

    【解决方案2】:

    您可以为此使用Date.prototype.toISOString()

    你可以修改你的函数来返回

    return new Date(date.getUTCFullYear(),
                    date.getUTCMonth(),
                    date.getUTCDate(),
                    date.getUTCHours(),
                    date.getUTCMinutes(),
                    date.getUTCSeconds(),date.getTimezoneOffset()).toISOString();
    

    【讨论】:

    • 但是比它转换成字符串,我想要一个日期对象
    猜你喜欢
    • 2020-07-08
    • 2017-10-10
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2020-05-10
    • 2022-12-17
    • 2021-11-19
    相关资源
    最近更新 更多