【问题标题】:How do I get the next day's date in JS in YYYY-MM-DD format?如何在 JS 中以 YYYY-MM-DD 格式获取第二天的日期?
【发布时间】:2020-06-02 23:33:12
【问题描述】:

似乎是一个简单的问题,但 JS 中的所有时区进出都让我很头疼。

基本上,如果我有如下日期:

2018-04-06

我希望能够得到第二天的日期:

2018-04-07

我在 SO 上找到了以下 sn-p 用于执行此操作(有点):

var date = new Date('2018-04-06');
date.setDate(date + 1);

问题是我正在使用调整后的时区返回日期,并且因为我在美国东部时区,所以它给我的日期减去了五个小时,这实际上是我开始的同一天。

我通过无数的 SO 帖子试图找到这个看似简单的问题的答案,但是对于任何给定的日期,无论用户所在的时区如何,我如何在 YYYY-MM- 中获得第二天的日期DD格式?谢谢。

【问题讨论】:

    标签: javascript date timezone timezone-offset


    【解决方案1】:

    格式为 YYYY-MM-DD 的字符串被解析为 UTC,因此在这种情况下,请以 UTC 执行所有操作(请参阅 Why does Date.parse give incorrect results?How can I add 1 day to current date?)。

    toISOString 方法将返回所需格式的字符串,只需修剪多余的时间部分,例如

    let s = '2018-04-06';
    let d = new Date(s);
    d.setUTCDate(d.getUTCDate() + 1);
    console.log(d.toISOString().substr(0,10));

    【讨论】:

      【解决方案2】:

      您是否尝试过使用 UTC 日期?

      var date = new Date('2018-04-06');
      console.log(date.toUTCString());
      
      date.setDate(date.getDate() + 1);
      console.log(date.toUTCString());

      【讨论】:

      • 感谢您的快速回复。这似乎确实解决了时区问题,但我以以下格式返回字符串:Sat, 07 Apr 2018 00:00:00 GMT。然后如何将其转换为 YYYY-MM-DD 格式?谢谢。
      • 您可以使用Date methods 获取不同的部分,然后按照您喜欢的方式重新格式化日期。
      • displacedtexan,我现在尝试了几种不同的方法,但我不知道如何。 toUTCString() 生成一个字符串,您不能在该字符串上使用日期方法来获取各个部分,并且将 UTC 日期返回到 Date 函数(例如,new Date(date.toUTCString()))只会再次创建时区问题。您能否更详细地解释一下您的意思?谢谢。
      • UTC日期需要加1,否则每年夏令时过渡期间会有一小段时间日期不会递增。此外,toISOString 提供了所需的格式。
      【解决方案3】:

      正如@chrisbyte 所建议的那样,您是否尝试过使用toUTCString 方法代替 toString() 方法?

      提醒一下,toString 是您在控制台中显示 date 对象时使用的默认值

      我认为您假设的“问题”只是对Date.toString() 方法的行为方式的不完全理解:此方法似乎返回代表Date 对象的字符串 似乎使用时区正如提到的here(在第一个示例中的评论)

      在这里我的 sn-p 了解更多:

        const originalDate = new Date('2018-04-06');
          // retrieving the original timestamp
          const originalTimestamp = originalDate.valueOf()
          
          // displaying the original date (non UTC / UTC)
          console.log(`original date (timezone dependent): ${originalDate.toString()}`)
              console.log(`original date (timezone independent): ${originalDate.toUTCString()}`)
      
          // we add one more day
          originalDate.setDate(originalDate.getDate() +1)
          const dayAfterTimestamp = originalDate.valueOf()
          
         // displaying the original date (non UTC / UTC)
          console.log(`updated date (timezone dependent): ${originalDate.toString()}`)
              console.log(`updated date (timezone independent): ${originalDate.toUTCString()}`)
      
          // check the differences (in milliseconds)
          console.log(`difference: ${(dayAfterTimestamp-originalTimestamp)}`)
          
          
             // displaying the original format (timezone independent)

      最后,如果您想以YYYY-MM-DD 格式返回日期字符串,您可能必须自己实现它:-/,或者使用toLocaleFormat 方法,但它不是标准化的。

      【讨论】:

        【解决方案4】:

        逻辑是将 24 小时(以毫秒为单位)添加到当前时间。举个例子:

        var myDate = new Date();
        var oneMoreDay = new Date();
        oneMoreDay.setTime(myDate.getTime() + 86400000);
        console.log(myDate.getDate());
        console.log(oneMoreDay.getDate());
        

        在 oneMoreDay 变量中增加了一天。在您的具体示例中,您只想在 ORIGINAL 变量中再增加一天,所以我会做一些事情,例如:

        date.setTime(date.getTime() + 86400000);
        

        【讨论】:

        • 如果用户在亚洲的某个地方,他们与 UTC 有一个正时区偏移怎么办?那不是从提供的日期开始两天吗?
        • 并非所有的日子都是 24 小时长的夏令时,请参阅 How can I add 1 day to current date?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2011-09-09
        • 2019-03-11
        • 2015-11-18
        • 2016-01-02
        • 1970-01-01
        • 2021-09-25
        相关资源
        最近更新 更多