【问题标题】:Get date ISO string without time in javascript在javascript中获取没有时间的日期ISO字符串
【发布时间】:2017-09-17 15:11:54
【问题描述】:

有没有办法在 javascript 中获取具有午夜时间的新日期类型的 ISO 字符串,而无需使用日期部分重建新日期或格式化它?

我一直在尝试this

var date = new Date();
date.setHours(0, 0, 0, 0);
document.write(date.toISOString());

我得到了这个

2017-04-20T04:00:00.000Z

我想要这个

2017-04-20T00:00:00.000Z

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

【问题讨论】:

    标签: javascript date time isodate


    【解决方案1】:

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

    var iso = date.toISOString();
    iso = iso.substring(0, iso.indexOf('T'));
    

    【讨论】:

    • 提防未来的千年虫问题
    【解决方案2】:

    var isoDate = new Date().toISOString().substring(0,10);
    console.log(isoDate);

    【讨论】:

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

    如果您可以依赖于伟大的momentjs.com 库,它会像这样简单:

    moment().format('YYYY-MM-DD');
    

    moment().toISOString();
    

    【讨论】:

    • 我不是在批评这个答案,但现在值得注意的是,MomentJS 已经声明自己 +deprecated+ done,并且在遗留模式下,支持使日期对象不可变的替代方案。 momentjs.com/docs/#/-project-status
    【解决方案4】:

    只需使用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())

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

    编辑

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

    【讨论】:

    • 如此盲目地看到它。非常感谢。
    • 嗯。我认为这仅在您处于或落后于 UTC 时才有效。我在 +1030,当我在上午 10:30 之前执行此操作时,它仍然给我前一天。
    • 你确实是对的。有必要检查更改时间是否会导致日期更改(如果您早于 UTC,可能会发生这种情况)
    • 我编辑了我的代码,使其适用于任何时区。欢迎进一步更正,因为我仅通过模拟 +10 时区对此进行了测试! :)
    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多