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

ing*_*939 11 javascript locale date

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

alert(new Date("21/11/1968"))
Run Code Online (Sandbox Code Playgroud)

结果是"1969年9月11日星期四".它认为月份是第一位并相应调整.

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

Koo*_*Inc 16

将日期字符串转换为可提供预期结果的格式('yyyy/mm/dd'或'yyyy-mm-dd')非常简单:

new Date("21/11/1968".split('/').reverse().join('/'));
Run Code Online (Sandbox Code Playgroud)

[ edit ]你可能会喜欢这个更通用的方法(npm PureHelpers库的一部分):

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;
}
Run Code Online (Sandbox Code Playgroud)
<pre id="result"></pre>
Run Code Online (Sandbox Code Playgroud)

  • 这有点像黑客,而不是普遍适用的解决方案.我正在寻找一种可以在所有情况下一致使用的方法,基于Date对象的工作方式. (3认同)
  • @vandersondf:这就是Date构造函数的工作方式.Dixit MDN:`其中Date被称为具有多个参数的构造函数,如果值大于其逻辑范围(例如,13为月值或70为微小值),则相邻值将被调整.所以2014年2月30日成为02/03/214.请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date (3认同)

Joe*_*Joe 11

Date对象非常弱.你不能告诉它期望什么格式.你可以用你所说的m/d/y字符串创建它,或者new Date(year, month, day[, hours, seconds, milliseconds]);


Ark*_*ski 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