在javascript中获取没有时间的日期ISO字符串

Max*_*mus 10 javascript time date isodate

有没有办法在没有用日期部分重建新日期或格式化它的情况下在 javascript 中获取新日期类型的 ISO 字符串和午夜时间?

我一直在尝试这个

var date = new Date();
date.setHours(0, 0, 0, 0);
document.write(date.toISOString());
Run Code Online (Sandbox Code Playgroud)

我得到了这个

2017-04-20T04:00:00.000Z
Run Code Online (Sandbox Code Playgroud)

我想得到这个

2017-04-20T00:00:00.000Z
Run Code Online (Sandbox Code Playgroud)

是否有我一直在尝试的内置函数或方法来获得所需的输出(使用日期部分重建日期对象)?

小智 15

var isoDate = new Date().toISOString().substring(0,10);
console.log(isoDate);
Run Code Online (Sandbox Code Playgroud)

  • 根据 MDN (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString),此解决方案不会返回 0000-9999 范围之外的年份的预期结果。 (6认同)
  • 此解决方案无法纠正时区问题并会产生意外结果。当您的用户错误报告是“为什么一天输出错误?”时,这就是原因。 (4认同)

Ale*_*urt 13

如果您希望代码在逻辑上持久,那么基于硬编码索引的子字符串永远不安全:

var iso = date.toISOString();
iso = iso.substring(0, iso.indexOf('T'));
Run Code Online (Sandbox Code Playgroud)


Ped*_*lho 7

只需使用setUTCHours代替setHours并补偿时区:

    var date = new Date();
    var timezoneOffset = date.getMinutes() + date.getTimezoneOffset();
    var timestamp = date.getTime() + timezoneOffset * 1000;
    var correctDate = new Date(timestamp);
    
    correctDate.setUTCHours(0, 0, 0, 0);
    document.write(correctDate.toISOString())
Run Code Online (Sandbox Code Playgroud)

setHours将在您的本地时区设置时间,但是当您显示它时,它将以 UTC 显示时间。如果您从一开始就将其设置为 UTC,您将得到您想要的结果。

编辑

请注意,如果您于 UTC,您的日期将存储为前一天的 UTC 日期,因此运行setUTCHours将无法按预期工作,将您的日期更改为前一天的午夜。因此,您首先需要将时区偏移量添加到日期。


Gug*_*upf 7

一个衬垫,没有第三方库:

const date = new Date().toLocaleString('sv').split(' ')[0]; // Ex: '2023-01-17'
Run Code Online (Sandbox Code Playgroud)

这是利用瑞典的日期格式

编辑:下面的旧答案,在乔恩关于考虑时区的评论之前

const date = new Date().toISOString().split('T')[0]; // Ex: '2023-01-17'
Run Code Online (Sandbox Code Playgroud)