如何检查数据时间是否有时区偏移?
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; }
我正在使用 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; }