【问题标题】:Getting Invalid Date for date string as "19-02-2020" and date format "DD-MM-YYYY" [duplicate]获取日期字符串的无效日期为“19-02-2020”和日期格式“DD-MM-YYYY”[重复]
【发布时间】:2021-07-26 01:08:09
【问题描述】:

加载页面时,我的输入框会自动填充日期时间。此日期时间可以是任何有效格式,例如 DD-MMM-YYYY - HH:mmMMM DD, YYYY - HH:mm 等,我想获取此日期,对其进行解析并添加一些小时。
但是当我尝试解析类似于19-02-2020 - 00:00 (DD-MM-YYYY - HH:mm) 的日期时,它给了我一个无效的日期。 我试过了

new Date('19-02-2020 - 23:00')
// output - Invalid Date

还尝试使用moment JS来格式化日期

moment("19-02-2021 - 23:00","DD-MM-YYYY - HH:mm").toDate();
// output - Fri Feb 19 2021 23:00:00 GMT+0530 (India Standard Time)

但是现在所有其他日期都会像这个一样被解析错误

moment("19-02-2021 - 23:00","DD-MMM-YYYY - HH:mm").toDate();
// output - Tue Jan 19 2021 23:00:00 GMT+0530 (India Standard Time)

有没有正确可靠的方法来做到这一点?

【问题讨论】:

  • 可以是任何有效的格式 - 你需要知道它是什么格式才能正确解析它。如果我输入 -895-8-FSSsd-#8893 并声称这是我的秘密编码日期格式怎么办?
  • 为什么在第二个例子中使用-MMM-
  • 另外,什么进程在“自动填充”输入框?如果您对此有一定的了解,那会让您的工作更轻松。
  • 保证格式有效。我必须以不同的方式处理所有格式吗?还是有一种通用的方法来解析任何格式?
  • 您有一个“自动输入日期”的脚本似乎很奇怪,但除了“它是一种有效的格式”之外,您不能说更具体的关于该日期的内容。为什么脚本不是每次都使用相同的格式?

标签: javascript html jquery date datetime


【解决方案1】:

Date constructor accepts ISO 8601 和 RFC 2822 日期/时间格式:

let dates = [
  new Date('2020-02-19T23:00Z'),
  new Date('2020-02-19 23:00Z'),
  new Date('Wed Feb 19 2020 23:00:00 UTC'),
]
console.log(dates)

当您的日期/时间信息具有固定的非标准格式时,您可以使用正则表达式将其转换为 RFC 3339 格式,然后对其进行解析:

let rfc3339 = "19-02-2020 - 00:00".replace(/(\d*)-(\d*)-(\d*) - (\d*):(\d*)/, (_, d, m, y, h, min) => `${y}-${m}-${d}T${h}:${min}Z`);
let date = new Date(rfc3339);
console.log(date)

你可以把它组合成一个函数:

function parseDate(dateStr) {
  const re = /(\d\d)(, |-)(\d\d)\2(\d\d\d\d) - (\d\d):(\d\d)/;

  let groups = re.exec(dateStr);

  if (groups == null) {
    return null; // on invalid input
  }

  let rfc3339Str;
  if (groups[2] == '-') {
    rfc3339Str = `${groups[4]}-${groups[3]}-${groups[1]}T${groups[5]}:${groups[6]}Z`;
  } else {
    rfc3339Str = `${groups[4]}-${groups[1]}-${groups[3]}T${groups[5]}:${groups[6]}Z`;
  }

  let date = new Date(rfc3339Str);
  return date;
}

for (dateStr of [
    '04, 23, 2020 - 12:34',
    '23-04-2020 - 12:34',
  ]) {
  console.log(parseDate(dateStr));
}

【讨论】:

  • Dates 构造函数为我提供了 new Date("19-02-2021 - 23:22") 的无效日期。当我的日期字符串为"19-02-2021 - 23:22" 时如何解析
  • 您可能需要自定义解析例程。请稍等,我将其添加到答案中。
  • ECMA-262 不支持第二个示例格式,并且在某些实现中会产生无效的日期。
【解决方案2】:

日期字符串格式为YYYY-MM-DDTHH:mm:ss.sssZ,其中T 是分隔符,Z 表示时区(可选)。

HH:mm:ss.sss 等价于:小时、分钟、秒和毫秒。

const date = new Date( Date.parse('2021-02-19T00:05:00.000') );
console.log(date)

了解有关日期对象的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

【讨论】:

  • 我也试过这个,但它无法解析我的日期字符串。 new Date(Date.parse("19-02-2021 - 23:22"))
  • 因为您以错误的格式传递日期字符串。试试new Date(Date.parse("19-02-2021T23:22:00"))
  • 你提到的那个也给出了无效的日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 2013-03-18
  • 2016-01-02
  • 1970-01-01
相关资源
最近更新 更多