JS:new Date()不接受我自己的语言环境中的日期字符串(d / m / y)

时间:2011-08-23 18:01:43

标签: javascript locale date

我的浏览器(即我的操作系统)应该知道我在澳大利亚以及正确的日期格式是什么。在这种情况下,d / m / y,而不是m / d / y。但是,如果我运行以下代码:

alert(new Date("21/11/1968"))

结果是“1969年9月11日星期四”。它认为这个月是第一个并相应调整。

这是为什么?答案总是使用通用格式作为日期函数的输入,还是有办法告诉浏览器期望以我的语言环境格式输入日期?

4 个答案:

答案 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)支持以下日期格式:

  1. MM-DD-YYYY
  2. YYYY / MM / DD
  3. MM / DD / YYYY
  4. MMMM dd,yyyy
  5. MMM dd,yyyy

答案 3 :(得分:0)

你需要使用一个新的日期对象来解析它

const myDate = new Date('Wed Dec 30 2020 00:00:00 GMT-0500 (Eastern Standard Time)')

然后转换它:

const dateFormatted = myDate.toLocaleDateString("en-US")