假设我有一个ISO字符串日期; JS或MomentJS中是否有任何简单的API可以提取原始时区中的小时(不是本地时区,不是UTC):
//eg
2020-04-01T05:00:00+02:00 -> 7
您的示例没有道理。对于表示时区+0200中的时间“上午5点”的时间戳,“原始时区中的小时”为5。因为那是您的时间戳记表示的时间。以UTC表示的小时应为[[3,因为在时区+0200的时间为凌晨5点,在UTC的时间是凌晨3点。
const tz = moment('2020-04-01T05:00:00+02:00');
console.log(tz.hour());
console.log(tz.utc().hour());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.25.3/moment.min.js"></script>
要获得7,您需要将时间戳转换为+0400时区。在+0200的凌晨5点,在+0400的凌晨7点。但这完全是任意的,与任何“原始时区”都没有关系。
字符串被解析为时间值,该时间值是相对1970-01-01T00:00:00Z(ECMAScript时期)的偏移量,因此有效地是UTC。创建的日期实例不知道其创建方式,因此无法使用Date实例从用于生成日期实例的原始字符串中恢复任何信息。
[您必须自己解析该字符串以从中获取任何值(库可能会有所帮助,我认为Luxon可能会点它),例如获取原始时间:
['2020-05-12T08:23:15.000+05:30',
'2020-05-12T08:23:15.000-0400',
'2020-05-12T08:23:15.000Z'].forEach(ts => {
let [year, month, day, hour, minute, second, millisecond, offset] = ts.match(/^\d+|\d\d\d|\d\d|Z$|[+-]\d\d:?\d\d$/g);
console.log(
`year : ${year}
month : ${month}
day : ${day}
hour : ${hour}
minute : ${minute}
second : ${second}
millsecond: ${millisecond}
offset : ${offset}
`);
});
如果偏移量是按照ISO 8601表示的(例如+07:00或+0700),则它是固定的偏移量,不会反映历史或夏时制更改,该更改可能适用于生成该偏移量的系统,因此仅应应用到特定的日期和时间。