Javascript中新Date()输出的差异



我尝试了两种方法来生成Date,第一种方法是传递整个日期字符串,第二种方法是年、月、日的组合。但是,在提供相同日期的同时,我得到了不同的输出。这一天不合适。第一天也应该是6月30日。

const oldDate = new Date('2020-06-30');
const newDate = new Date('2020', '05', '30');
console.log(oldDate.toString(), newDate.toString());

当您通过传递字符串来实例化Date时,它应该是指定时区的完整ISO 8601字符串。由于您没有具体说明,它需要GMT+0,并且您似乎位于GMT-7。你应该改为这样写:

console.log(new Date('2020-06-30T00:00:00-07:00').toString());

接受多个参数的Date构造函数希望它们是数字,并接受月份数字作为基于0的值(0=January(。这些值应在本地时间内。

接受单个字符串参数Date构造函数根据指定的规则(适用于您的示例(以及JavaScript引擎实现者选择添加的可能未指定的回退规则来解析字符串(不过,在您的示例中,回退不是必需的(。如果字符串中没有时区指示器,则会以UTC格式解析像您这样的仅限日期的表单(以本地时间解析日期/时间表单(。

(接受单个数字Date构造函数预计该数字自大纪元【1970年1月1日,UTC午夜】以来为毫秒。(

以下格式被视为GMT时间,它试图转换为您的本地时区。这就是为什么你会注意到减去了7个小时。

新日期('2020-06-30'(

以下格式被视为本地时区,不会发生进一步的转换。

新日期("2020"、"05"、"30"(;

根据MDN文档:

  • 日期字符串表示日期的字符串值,以date.parse((方法识别的格式指定。(这些格式是符合IETF的RFC 2822时间戳,也是ISO8601版本中的字符串。(

注意:由于浏览器的差异和不一致,强烈建议使用date构造函数(和date.parse((,其工作方式相同(解析日期字符串。对RFC 2822格式字符串的支持只是按照惯例。对ISO 8601格式的支持不同之处在于,仅日期字符串(例如"1970-01-01"(被视为UTC,而不是本地字符串。

因此,当您通过new Date("2020-06-30")创建日期时,它会在0时区中创建日期对象,并调整时间以使其显示为与您的时区相等。

最新更新