如何从 Javascript 中没有破折号 (-) 和冒号 (:) 的 ISO 日期字符串获取日期对象
How to get Date object from ISO Date string without dash(-) and colon(:) in Javascript
我正在将 ICS 转换为 JSON,但它给了我 "20190103T073640Z"
格式的日期,如何从 Javascript 中的此字符串获取日期对象?
我知道 "how to convert ISO string to date object" 有很多答案,但这个字符串缺少破折号和冒号。
例如
当我添加破折号和冒号时,它会正确给出输出
new Date("2019-01-03T07:36:40Z");
但是如何从像这样没有破折号和冒号的日期字符串中获取 javascript 中的日期对象 "20190103T073640Z"
?
为认为重复的人编辑 -
我有 ICalendar 文件,我正在使用在线转换器将其转换为 JSON,因此我使用的转换器给出的日期格式不是我可以直接传递给 new Date()
的格式从中获取日期对象。那么有没有什么方法可以像这样解析“20190103T073640Z”字符串。
谢谢。
提取每个日期组件,并使用普通构造函数创建一个新的 Date 对象怎么样?
function parseIcsDate(icsDate) {
if (!/^[0-9]{8}T[0-9]{6}Z$/.test(icsDate))
throw new Error("ICS Date is wrongly formatted: " + icsDate);
var year = icsDate.substr(0, 4);
var month = icsDate.substr(4, 2);
var day = icsDate.substr(6, 2);
var hour = icsDate.substr(9, 2);
var minute = icsDate.substr(11, 2);
var second = icsDate.substr(13, 2);
return new Date(Date.UTC(year, month - 1, day, hour, minute, second));
}
var date = parseIcsDate("20190103T073640Z");
console.log(date);
如果使用库是合理的(在其他日期操作的情况下),Luxon 是一个很好的选择:
https://moment.github.io/luxon/
import { DateTime } from 'luxon';
// Creates a DateTime instance from an ISO 8601-compliant string
const date = DateTime.fromISO('2019-01-03T07:36:40Z');
// Format date to ISO 8601 string
// -> '2019-01-03T08:36:40.000+01:00'
date.toISO();
// Set format to 'basic'
// -> '20190103T083640.000+0100'
date.toISO({format: 'basic'});
// We don't need milliseconds
// -> '20190103T083640+0100'
date.toISO({format: 'basic', suppressMilliseconds: true});
// My system uses a time zone with an offset of +01:00, which is used by Luxon as default.
// So I have to convert the date to UTC (offset +00:00).
// -> '20190103T073640Z'
date.toUTC(0).toISO({format: 'basic', suppressMilliseconds: true});
// As an one-liner
DateTime
.fromISO('2019-01-03T07:36:40Z')
.toUTC(0)
.toISO({ format: 'basic', suppressMilliseconds: true })
我正在将 ICS 转换为 JSON,但它给了我 "20190103T073640Z"
格式的日期,如何从 Javascript 中的此字符串获取日期对象?
我知道 "how to convert ISO string to date object" 有很多答案,但这个字符串缺少破折号和冒号。
例如 当我添加破折号和冒号时,它会正确给出输出
new Date("2019-01-03T07:36:40Z");
但是如何从像这样没有破折号和冒号的日期字符串中获取 javascript 中的日期对象 "20190103T073640Z"
?
为认为重复的人编辑 -
我有 ICalendar 文件,我正在使用在线转换器将其转换为 JSON,因此我使用的转换器给出的日期格式不是我可以直接传递给 new Date()
的格式从中获取日期对象。那么有没有什么方法可以像这样解析“20190103T073640Z”字符串。
谢谢。
提取每个日期组件,并使用普通构造函数创建一个新的 Date 对象怎么样?
function parseIcsDate(icsDate) {
if (!/^[0-9]{8}T[0-9]{6}Z$/.test(icsDate))
throw new Error("ICS Date is wrongly formatted: " + icsDate);
var year = icsDate.substr(0, 4);
var month = icsDate.substr(4, 2);
var day = icsDate.substr(6, 2);
var hour = icsDate.substr(9, 2);
var minute = icsDate.substr(11, 2);
var second = icsDate.substr(13, 2);
return new Date(Date.UTC(year, month - 1, day, hour, minute, second));
}
var date = parseIcsDate("20190103T073640Z");
console.log(date);
如果使用库是合理的(在其他日期操作的情况下),Luxon 是一个很好的选择: https://moment.github.io/luxon/
import { DateTime } from 'luxon';
// Creates a DateTime instance from an ISO 8601-compliant string
const date = DateTime.fromISO('2019-01-03T07:36:40Z');
// Format date to ISO 8601 string
// -> '2019-01-03T08:36:40.000+01:00'
date.toISO();
// Set format to 'basic'
// -> '20190103T083640.000+0100'
date.toISO({format: 'basic'});
// We don't need milliseconds
// -> '20190103T083640+0100'
date.toISO({format: 'basic', suppressMilliseconds: true});
// My system uses a time zone with an offset of +01:00, which is used by Luxon as default.
// So I have to convert the date to UTC (offset +00:00).
// -> '20190103T073640Z'
date.toUTC(0).toISO({format: 'basic', suppressMilliseconds: true});
// As an one-liner
DateTime
.fromISO('2019-01-03T07:36:40Z')
.toUTC(0)
.toISO({ format: 'basic', suppressMilliseconds: true })