我的浏览器(即我的操作系统)应该知道我在澳大利亚以及正确的日期格式是什么。在这种情况下,d / m / y,而不是m / d / y。但是,如果我运行以下代码:
alert(new Date("21/11/1968"))
结果是“1969年9月11日星期四”。它认为这个月是第一个并相应调整。
这是为什么?答案总是使用通用格式作为日期函数的输入,还是有办法告诉浏览器期望以我的语言环境格式输入日期?
答案 0 :(得分:16)
将日期字符串转换为可提供预期结果的格式('yyyy / mm / dd'或'yyyy-mm-dd')非常简单:
new Date("21/11/1968".split('/').reverse().join('/'));
[编辑]您可能会喜欢这种更通用的方法(npm PureHelpers library的一部分):
document.querySelector("#result").textContent = `
tryParseDate("2017/03/22", "ymd"); // ${tryParseDate("2017/03/22", "ymd")}
tryParseDate("03/22/2017", "mdy"); // ${tryParseDate("03/22/2017", "mdy")}
tryParseDate("22-03-2017", "dmy"); // ${tryParseDate("22-03-2017", "dmy")}
`;
function tryParseDate(dateStringCandidateValue, format = "dmy") {
if (!dateStringCandidateValue) {
return null;
}
const mapFormat = format.split("").reduce(function(a, b, i) {
a[b] = i;
return a;
}, {});
const dateStr2Array = dateStringCandidateValue.split(/[ :\-\/]/g);
const datePart = dateStr2Array.slice(0, 3);
const datePartFormatted = [
+datePart[mapFormat.y],
+datePart[mapFormat.m] - 1,
+datePart[mapFormat.d]
];
if (dateStr2Array.length > 3) {
dateStr2Array.slice(3).forEach(t => datePartFormatted.push(+t));
}
const dateTrial = new Date(Date.UTC.apply(null, datePartFormatted));
return dateTrial && dateTrial.getFullYear() === datePartFormatted[0] &&
dateTrial.getMonth() === datePartFormatted[1] &&
dateTrial.getDate() === datePartFormatted[2]
? dateTrial
: null;
}
<pre id="result"></pre>
答案 1 :(得分:10)
Date对象非常弱。您无法告诉它预期的格式。你可以像你所说的那样用m / d / y的字符串创建它,或者new Date(year, month, day[, hours, seconds, milliseconds]);
答案 2 :(得分:8)
new Date(string_date)支持以下日期格式:
答案 3 :(得分:0)
你需要使用一个新的日期对象来解析它
const myDate = new Date('Wed Dec 30 2020 00:00:00 GMT-0500 (Eastern Standard Time)')
然后转换它:
const dateFormatted = myDate.toLocaleDateString("en-US")