如何解析 javascript 中的日期?
How to parse dates in javascript?
如何在纯 javascript 中解析此示例格式 7 July 2021 at 1:36:23 AM Z
中的日期?即使使用 moment.js 也尝试了很多东西,但没有成果。我认为日期中间的 at
是问题所在。任何帮助,将不胜感激。提前致谢
编辑:
尝试了评论中提到的 replace()
功能,它对 chrome 非常有效,但 safari 会抛出 Invalid Date
错误。
示例代码:
function convertUTCDateToLocalDate(date) {
let newDate = new Date(date);
let options = {
year: "numeric",
month: "long",
day: "2-digit",
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
};
return newDate.toLocaleDateString("en", options);
}
let dateString = "7 July 2021 at 1:36:23 AM Z"
console.log(convertUTCDateToLocalDate(dateString.replace('at', ''));
您可以为 Safari 使用替换正则表达式 dateString.replace(/at|Z/g, '')
,它适用于 Safari 和 Chrome
最好的选择是从您的字符串的来源请求 ISO 8601 格式的日期时间。也许有一个 API 选项允许您传递格式。如果您使用的是一些自定义输入,则可能还有一个选项可以检索 ISO 8601 格式的字符串。
如果由于某种原因您无法在源代码处更改字符串,您始终可以手动将其转换为正确的格式。
const months = {
january: 1,
february: 2,
march: 3,
april: 4,
may: 5,
june: 6,
july: 7,
august: 8,
september: 9,
october: 10,
november: 11,
december: 12,
};
const meridiems = {
am: 0,
pm: 12,
};
const input = "7 July 2021 at 1:36:23 AM Z";
let [day, month, year, _at, time, meridiem, offset] = input.split(" ");
let [hour, minute, second] = time.split(":");
day = day.padStart(2, "0");
month = months[month.toLowerCase()];
month = month.toString().padStart(2, "0");
hour = hour % 12 + meridiems[meridiem.toLowerCase()];
hour = hour.toString().padStart(2, "0");
const iso8601 = `${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`;
console.log(iso8601);
console.log(new Date(iso8601));
一个简单的解析器,假设偏移量总是 Z:
// Parse timestamp in format "7 July 2021 at 1:36:23 AM Z"
function parseTS(ts) {
ts = ts.toLowerCase();
let months = ['jan','feb','mar','apr','may','jun',
'jul','aug','sep','oct','nov','dec'];
let [D, M, Y, x, h, m, s, ap, os] = ts.split(/\W/);
return new Date(Date.UTC(Y, months.indexOf(M.substr(0,3)), D,
h%12 + (ap == 'pm'? 12 : 0), m, s));
}
['7 July 2021 at 1:36:23 AM Z',
'7 July 2021 at 1:36:23 PM Z'
].forEach(ts => console.log(`${ts} : ${parseTS(ts).toISOString()}`));
如果你想使用 moment.js,你应该总是 provide the format using tokens as for formatting unless it's a supported format。 “at”可以用方括号省略:
// 7 July 2021 at 1:36:23 AM Z
let d = moment('7 July 2021 at 1:36:23 AM Z', 'D MMMM, YYYY [at] h:mm:ss a Z');
console.log(d.toString());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
如何在纯 javascript 中解析此示例格式 7 July 2021 at 1:36:23 AM Z
中的日期?即使使用 moment.js 也尝试了很多东西,但没有成果。我认为日期中间的 at
是问题所在。任何帮助,将不胜感激。提前致谢
编辑:
尝试了评论中提到的 replace()
功能,它对 chrome 非常有效,但 safari 会抛出 Invalid Date
错误。
示例代码:
function convertUTCDateToLocalDate(date) {
let newDate = new Date(date);
let options = {
year: "numeric",
month: "long",
day: "2-digit",
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
};
return newDate.toLocaleDateString("en", options);
}
let dateString = "7 July 2021 at 1:36:23 AM Z"
console.log(convertUTCDateToLocalDate(dateString.replace('at', ''));
您可以为 Safari 使用替换正则表达式 dateString.replace(/at|Z/g, '')
,它适用于 Safari 和 Chrome
最好的选择是从您的字符串的来源请求 ISO 8601 格式的日期时间。也许有一个 API 选项允许您传递格式。如果您使用的是一些自定义输入,则可能还有一个选项可以检索 ISO 8601 格式的字符串。
如果由于某种原因您无法在源代码处更改字符串,您始终可以手动将其转换为正确的格式。
const months = {
january: 1,
february: 2,
march: 3,
april: 4,
may: 5,
june: 6,
july: 7,
august: 8,
september: 9,
october: 10,
november: 11,
december: 12,
};
const meridiems = {
am: 0,
pm: 12,
};
const input = "7 July 2021 at 1:36:23 AM Z";
let [day, month, year, _at, time, meridiem, offset] = input.split(" ");
let [hour, minute, second] = time.split(":");
day = day.padStart(2, "0");
month = months[month.toLowerCase()];
month = month.toString().padStart(2, "0");
hour = hour % 12 + meridiems[meridiem.toLowerCase()];
hour = hour.toString().padStart(2, "0");
const iso8601 = `${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`;
console.log(iso8601);
console.log(new Date(iso8601));
一个简单的解析器,假设偏移量总是 Z:
// Parse timestamp in format "7 July 2021 at 1:36:23 AM Z"
function parseTS(ts) {
ts = ts.toLowerCase();
let months = ['jan','feb','mar','apr','may','jun',
'jul','aug','sep','oct','nov','dec'];
let [D, M, Y, x, h, m, s, ap, os] = ts.split(/\W/);
return new Date(Date.UTC(Y, months.indexOf(M.substr(0,3)), D,
h%12 + (ap == 'pm'? 12 : 0), m, s));
}
['7 July 2021 at 1:36:23 AM Z',
'7 July 2021 at 1:36:23 PM Z'
].forEach(ts => console.log(`${ts} : ${parseTS(ts).toISOString()}`));
如果你想使用 moment.js,你应该总是 provide the format using tokens as for formatting unless it's a supported format。 “at”可以用方括号省略:
// 7 July 2021 at 1:36:23 AM Z
let d = moment('7 July 2021 at 1:36:23 AM Z', 'D MMMM, YYYY [at] h:mm:ss a Z');
console.log(d.toString());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>