如何检查数据时间是否有时区偏移?

How to check if the data time has the timezone offset or not?

我正在使用 Javascript 开发应用程序。在代码中,我收到 Datetime。此日期时间可以有或没有时区偏移。我想检查时区偏移是否存在,我需要根据它做出一些决定。

以下是将进入我的 Javascript 函数的数据类型:

const dateWithoutOffset = "2022-03-01T16:23:19"
const dateWithOffset = "2022-03-01T16:23:19+01:00"

//Perform something to check for offset
if(dateWithOffset.contains(offset)){
  console.log("OFFSET is PRESENT")
}

//Perform something to check offset is not present
if(dateWithoutOffset.contains(offset)){
  console.log("OFFSET IS NOT PRESENT")
}

我知道我可以检查长度,但我觉得这不是正确的方法,所以想在这里询问并找到找到偏移量的正确方法。

我尝试了 Whosebug 中提供的许多方法和答案,但似乎没有一个能给我正确的答案,所以在此处发帖以获得正确的工作答案。

您可以使用正则表达式来解析这些 ISO 日期字符串的偏移量。

创建一些方便的函数,例如 hasOffset()getUTCOffsetMinutes() 应该会使问题更容易解决。

如果日期有偏移,您可以继续解析它(如下所示)或做其他事情,例如显示不同。

const isoDatePattern = /(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})(\.\d+)?([+-]\d{2}:?\d{2}|Z)$/

function getOffsetStr(input) {
    const groups = input.match(isoDatePattern);
    return groups ? groups[4]: null;
}

function hasOffset(input) {
    return (!!getOffsetStr(input));
}

function getUTCOffsetMinutes(input) {
    const offset = getOffsetStr(input);
    return offset ? parseUTCOffset(offset): null;
}

function parseUTCOffset(offsetStr) {
    if (offsetStr.toUpperCase() === 'Z') {
        return 0;
    }
    const sign = offsetStr.startsWith('-') ? -1: 1;
    const hour = +offsetStr.slice(1,3);
    const min = +offsetStr.slice(-2);
    return sign * hour * 60 + min;
}

const testInputs = [
     "2010-11-06T02:19:00.250",
     "2022-03-01T16:23:19",
     "2025-04-20T17:02:03.401+0200",
     "2022-03-01T16:23:19+01:00",
     "2022-03-01T16:23:19Z",
     "2022-03-01T16:23:19-0500",
     "2022-03-01T16:23:19+12:00"
]

console.log('Input'.padEnd(28, ' '), 'Has Offset ' ,'UTC Offset (minutes)')
testInputs.forEach(input => { 
    console.log(input.padEnd(28, ' '), hasOffset(input), '\t', getUTCOffsetMinutes(input));
})
.as-console-wrapper { max-height: 100% !important; }