【问题标题】:javascript - get next day of a stringjavascript - 获取字符串的第二天
【发布时间】:2009-07-21 18:19:28
【问题描述】:

我有一个 var example = "05-10-1983"

我怎样才能得到字符串example的“第二天”?

我尝试使用 Date 对象...但什么都没有...

【问题讨论】:

  • 字符串是否总是采用 MM-DD-YYY 格式?

标签: javascript date


【解决方案1】:

这适用于您所拥有的简单场景:

var example = '05-10-1983';
var date = new Date();
var parts = example.split('-');
date.setFullYear(parts[2], parts[0]-1, parts[1]); // year, month (0-based), day
date.setTime(date.getTime() + 86400000);
alert(date);

本质上,我们创建一个空的Date object,并使用setFullYear() 函数设置年、月、日。然后,我们使用 getTime() 获取该日期的时间戳,并为其添加 1 天(86400000 毫秒),并使用 setTime() 函数将其设置回日期。

如果你需要比这更复杂的东西,比如支持不同的格式和类似的东西,你应该看看datejs library,它为你做了很多工作。

【讨论】:

  • 使用date.setDate(date.getDate() + 1);是否存在闰年/秒问题?
  • 您的代码是否可用于 DD-MM-YYYY 或 MM-DD-YYYY 格式的示例日期?我认为是 MM-DD-YYYY 格式,但我也想与您确认。
【解决方案2】:

您可以执行以下操作:

var nextDay;
var example = "05-10-1983";

nextDay = new Date(example);
nextDay.setDate(nextDay.getDate() + 1);

#getDate/#setDate 获取/设置当前日期 (1-31)。

以上运行后,nextDay 将设置为明天的日期。如果是月底,这也将滚动到下个月/下一年,甚至可以处理闰年。 :)

【讨论】:

    【解决方案3】:
    new Date(+new Date('05-10-1983'.replace(/-/g,'/')) + 24*60*60*1000)
    

    【讨论】:

      【解决方案4】:

      +86400000 方法的问题是跨越夏令时障碍时可能会出错。 例如,我在 EST。 如果我这样做:

      var d = new Date("11/04/2012 00:00:00");
      var e = new Date(d.getTime() + 86400000);
      

      e 将是 2012 年 11 月 4 日 23:00:00 如果然后仅提取日期部分,则会得到错误的值。我最近在编写日历控件时遇到了这个问题。

      这会做得更好(并且有一个灵活的偏移量,可以让你在未来超过 1 天):

      function getTomorrow(d,offset) {
          if (!offset) { offset = 1 }
          return new Date(new Date().setDate(d.getDate() + offset));
      }
      

      【讨论】:

      • 如果 d+offset 跨越月份边界,您的解决方案将回滚到月初,但 Date()+offset 没有。您需要锚定新的基准日期,将天数添加到原始日期。因此,而不是:new Date(new Date().setDate(d.getDate() + offset)); 应该是:new Date(new Date(d.getTime()).setDate(d.getDate() + offset)); 否则,您将根据当前 Date() + 偏移量的月份进行算术,而不是函数参数 + 偏移量中给出的 d 日期。
      【解决方案5】:

      所以

      var d = new Date("11/04/2012 00:00:00");
      var e = new Date(d.getTime() + 86400000);
      

      由于夏令时障碍而无法工作。我遇到了同样的问题。我最终做了这样的事情:

      function next_day(date) {
        var e = new Date(date.getTime() + 24 * 60 * 60 * 1000);
        if e.getHours() != date.getHours() {
          e = new Date(e.getTime() + (e.getHours() - date.getHours()) * 60 * 60 * 1000)
        }
        return e;
      }
      

      【讨论】:

      • 还没有测试过,但它是我没有想到的 DST 问题的一个有趣的解决方案。我想不出任何其他情况下这不起作用。
      【解决方案6】:

      您可以使用名为 php.js 的框架。谷歌为它。这包括高级日期功能等

      【讨论】:

      • 这对于navtive js来说非常简单,我不会直接进入另一个“框架”。
      【解决方案7】:

      您可以通过getDay() 函数找出日期索引,并按以下方式创建一个日期字符串数组-

      day = new Date(YourDate);
      
      var dayArray = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
      
      day = dayArray[day.getDay()+1];
      

      【讨论】:

        【解决方案8】:

        有闰秒、闰日、夏令时等,所以这在所有情况下都是一个棘手的问题。

        在我看来,解决这个问题的最好方法(没有日期库)是利用 Date 构造函数溢出特性[1]:

        main();
        
        function main() {
          var date = uniqueDateParse( '05-10-1983' );
          var newDate = nextDay( date );
        
          print( date );
          print( newDate );
        }
        
        function uniqueDateParse( string ) {
          var stringArray = string.split( '-', 3 );
          var month = stringArray[ 0 ],
              day   = stringArray[ 1 ],
              year  = stringArray[ 2 ];
          // Per ISO 8601[2], using Pacific Daylight Time[3].
          var dateString = year + '-' + month + '-' + day + 'T00:00:00-07:00';
          return new Date( dateString );
        } 
        
        function nextDay( date ) {
          return new Date( date.getFullYear()
                         , date.getMonth()
                         , date.getDate() + 1 );
        }
        
        function print( object ) {
          console.log( object );
        }
        

        链接

        [1]https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Parameters

        [2]http://www.w3.org/TR/NOTE-datetime

        [3]http://www.timeanddate.com/time/zones/pdt

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-29
          • 2022-12-13
          • 1970-01-01
          • 2022-06-13
          • 1970-01-01
          • 2020-02-26
          • 2021-07-21
          相关资源
          最近更新 更多