【问题标题】:Fetch UTC Date offset based on date format根据日期格式获取 UTC 日期偏移量
【发布时间】:2021-09-02 10:41:15
【问题描述】:

我的日期格式为“2021-05-01T23:59:59.999-05:00”

需要获取 utc 偏移值,如 300、330 等。

有人可以在这里提供帮助吗?感谢任何不使用 moment.js 的答案。

所以从 '2021-05-01T23:59:59.999-05:00' 中提取值 -05:00

【问题讨论】:

  • 喜欢new Date('2021-05-01T23:59:59.999-05:00').getTimezoneOffset()?不是很可靠,但仍然......
  • 它给出了相同的 offsetnew Date('2021-05-01T23:59:59.999-05:00').getTimezoneOffset() -330 new Date('2021-05-01T23:59:59.999- 06:00').getTimezoneOffset() -330
  • 基本上我需要不同的值 '2021-05-01T23:59:59.999-05:00' 是 330 和 '2021-05-01T23:59:59.999-06:00' 是 390跨度>
  • @YevgenGorbunkov — 返回该日期和时间的系统偏移量,而不是时间戳中的偏移量。

标签: javascript arrays date datetime javascript-objects


【解决方案1】:

Date.getTimezoneOffset() 函数只会为您提供客户端机器时区与 UTC 之间的偏移量,它不会为您提供 ISO 日期字符串中指定的 UTC 偏移量。

鉴于日期为ISO-8601 格式,我们可以从数据中解析UTC 偏移量,格式为±[hh]:[mm]、±[hh][mm]、±[hh ] 或 'Z' 表示 UTC / Zulu 时间。

负 UTC 偏移描述了 UTC±00:00 以西的时区,其中民用时间晚于(或早于)UTC,因此时区指示符看起来像“-03:00”、“-0300”,或“-03”。

正 UTC 偏移量描述了位于 UTC±00:00 或以东的时区,其中民用时间与 UTC 相同或早(或更晚),因此区域指示符看起来像“+02:00”, “+0200”或“+02”。

我们将使用正则表达式来解析时区偏移,这也适用于 IE 11。

function getUTCOffsetMinutes(isoDate) {
    // The pattern will be ±[hh]:[mm], ±[hh][mm], or ±[hh], or 'Z'
    const offsetPattern = /([+-]\d{2}|Z):?(\d{2})?\s*$/;
    if (!offsetPattern.test(isoDate)) {
        throw new Error("Cannot parse UTC offset.")
    }
    const result = offsetPattern.exec(isoDate);
    return (+result[1] || 0) * 60 + (+result[2] || 0);
}

const inputs = [
    '2021-05-01T23:59:59.999+12:00',
    '2021-05-01T23:59:59.999+10',
    '2021-05-01T23:59:59.999+0530',
    '2021-05-01T23:59:59.999+0300',
    '2021-05-01T23:59:59.999Z',
    '2021-05-01T23:59:59.999-05:00',
    '2021-05-01T23:59:59.999-07:00',
];

for(var i = 0; i < inputs.length; i++) {
    console.log('input:', inputs[i], 'offsetMinutes:', getUTCOffsetMinutes(inputs[i]));
}

【讨论】:

  • 对于像 GMT+0:53:28(欧洲/柏林大约 1800 年)这样的偏移量? ;-)
  • 这是否适用于包括 IE11 在内的所有浏览器
  • 这是 RegExp 的兼容性矩阵:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。不幸的是,命名组不适用于 IE,但它应该适用于 Edge 79+。可以使用 babel 来解决这个问题,或者我们可以简单地使用基本的组功能来支持早期版本的 IE。
  • 最初发布此内容是否有任何问题。 getUTCOffsetMinutes = (dateObj) => { 常量输入 = ${dateObj}.trim(); if (/Z$/.test(input)) { return 0; } if (/[+-]\d​​{2}:\d{2}$/.test(input)) { const [hour, min] = input.slice(-6).split(':')。地图(数字);返回小时 * 60 + 分钟; } if (/[+-]\d​​{4}$/.test(input)) { const [hour, min] = [input.slice(-4, -2), input.slice(-2)]。地图(数字);返回小时 * 60 + 分钟; } 返回 ''; };
  • 非常感谢! @TerryLennox
【解决方案2】:

@TerryLennox 几乎相同,但处理的是:

  1. 偏移量中的秒数 - 在 1900 年之前相当常见,添加为分钟的小数部分
  2. 缺少偏移量—本地,返回未定义

function parseOffset(ts) {
  let [all,hr,min,sec] = (''+ts).match(/([+-]\d{2}|Z):?(\d{2})?:?(\d{2})?$/) || [];
  let sign = hr < 0 ? -1 : 1;
  return !all ? all :     // No match, return undefined
         hr == 'Z' ? 0 :
         hr * 60 + (min? sign * min : 0) + (sec? sign * sec / 60 : 0);
}

['2021-05-01T23:59:59.999-05:30',
 '2021-05-01T23:59:59.999+05:30',
 '2021-05-01T23:59:59.999-0530',
 '2021-05-01T23:59:59.999+0530',
 '2021-05-01T23:59:59.999-05',
 '2021-05-01T23:59:59.999+05',
 '2021-05-01T23:59:59.999+053012',
 '2021-05-01T23:59:59.999+05:30:12',
 '2021-05-01T23:59:59.999Z',
 '2021-05-01T23:59:59.999',
 'blah'
].forEach(ts => console.log(ts + ' -> ' + parseOffset(ts)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 2017-08-30
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多