【问题标题】:js date separator gives different answers when using getDate()js 日期分隔符在使用 getDate() 时给出不同的答案
【发布时间】:2022-08-19 11:27:38
【问题描述】:

在下面的代码中,为什么我们用 getDate() 得到不同的答案

 temp = new Date(\"2022-05-15\")
 temp1 = new Date(\'2022/05/15\')

console.log(temp.getDate())
console.log(temp1.getDate())
  • 允许浏览器(和一般的 JavaScript 环境)对它们识别的日期格式“挑剔”。
  • 打印整个日期,你会看到它们有不同的时间,因为一个是 UTC,另一个是本地时区。
  • 当 UTC 日期转换为当地时区时,日期会发生变化。
  • 你如何转换?
  • 不要使用内置的日期解析器。使用像 moment.js 这样的库,它可以让您获得更多控制权。

标签: javascript date


【解决方案1】:

ECMAScript 标准定义了某些以标准方式解析的日期/时间字符串:https://tc39.es/ecma262/#sec-date-time-string-format

客户端选择接受的任何其他值可能是特定于实现的。 Mozilla 在这里记录了一些常见的行为:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse#fall-back_to_implementation-specific_date_formats

如果您特别打算以跨客户端兼容的方式支持 yyyy/mm/dd,您可能需要自己解析它并将值提供给 new Date(year, month, day)(注意该月是 0-indexed “off by one”)

const [yyyy,mm,dd] = '2022/05/15'.split(/\D/);
new Date(yyyy, mm - 1, dd)

或者干脆new Date('2022/05/15'.replace(/\//g, '-'))

【讨论】:

  • 第一部分可以是let [y, m, d] = '2022/05/15'.split(/\D/)。指某东西的用途解析整数是不必要的。 ;-)
【解决方案2】:

在世界的不同地方,日期以不同的方式描述。

  1. 根据 ISO 的日期是,yyyy-mm-dd
  2. 根据美国等一些国家的日期是,月/日/年
  3. 根据大多数其他国家/地区的日期是,日/月/年

    大多数 Javascript 实现都支持前两种格式。它说,一些javascript的浏览器实现会尝试猜测是否使用第三种格式并进行调整。

    为了安全起见,请使用 ISO 格式 (yyyy-mm-dd)。或者,如果您无法记住 ISO 使用了哪个分隔符,您可以跳过字符串并将日期元素作为逗号分隔值输入。

    temp = new Date(2022, 4, 15);
    // month is indexed from 0, so Jan will be 0, feb will be 1 and so on.
    console.log(temp.getDate());

    此页面包含有关哪种格式有效、哪种无效的信息 (https://www.w3schools.com/js/js_date_formats.asp)。

【讨论】:

  • 不同之处在于 YYYY-MM-DD 被解析为 UTC(根据 ECMA-262),而 YYYY/MM/DD 的解析取决于实现,并且可能被解析为本地或无效的 UTC。 new Date(2022, 5, 15) 创建一个日期为 6 月 15 日,而不是 5 月 15 日。
猜你喜欢
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2015-12-22
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多