【问题标题】:I need a cycle which iterates through dates interval我需要一个循环遍历日期间隔
【发布时间】:2011-01-05 15:53:33
【问题描述】:

我有开始日期和结束日期。我需要在这两个日期之间的每一天进行迭代。

最好的方法是什么?

我只能建议如下:

Date currentDate = new Date (startDate.getTime ());
while (true) {
   if (currentDate.getTime () >= endDate.getTime ())
      break;
   doSmth ();
   currentDate = new Date (currentDate.getTime () + MILLIS_PER_DAY);
}

【问题讨论】:

    标签: java algorithm date


    【解决方案1】:

    准备运行 ;-)

    public static void main(String[] args) throws ParseException {
        GregorianCalendar gcal = new GregorianCalendar();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
        Date start = sdf.parse("2010.01.01");
        Date end = sdf.parse("2010.01.14");
        gcal.setTime(start);
        while (gcal.getTime().before(end)) {
            gcal.add(Calendar.DAY_OF_YEAR, 1);
            System.out.println( gcal.getTime().toString());
        }
    }
    

    【讨论】:

      【解决方案2】:

      那些说使用日历对象的说法同上。

      如果您尝试使用 Date 对象并为其添加 24 小时,您可能会遇到意外的麻烦。

      这是一个谜语:一年中最长的月份是哪一个月?你可能认为这个问题没有答案。七个月每个月有 31 天,所以它们的长度都是一样的,对吧?好吧,在美国这几乎是正确的,但在欧洲却是错误的!在欧洲,十月是最长的一个月。它有 31 天 1 小时,因为欧洲人在 10 月将夏令时拨回 1 小时,使得 10 月的一天持续 25 小时。 (美国人现在在 11 月开始夏令时,有 30 天,所以 11 月仍然比 10 月或 12 月短。因此这个谜语对美国人来说并不有趣。)

      我曾经在做你想做的事情时遇到了麻烦:我使用了一个 Date 对象,并在循环中添加了 24 小时。只要我没有跨越夏令时界限,它就可以工作。但是当我这样做的时候,突然间我跳过了一天或者在同一天两次,因为 2009 年 3 月 8 日午夜 + 24 小时 = 3 月 10 日凌晨 1:00。像我一样放下时间,神秘地跳过了 3 月 9 日.同样,2009 年 11 月 1 日午夜 + 24 小时 = 11 月 1 日晚上 11:00,我们在 11 月 1 日两次。

      【讨论】:

      • Stacker 已经给出了代码。我只是想解释为什么这是正确的答案,而 OP 的想法行不通。当然,一个工作代码的例子是一件好事,但除非你理解它为什么工作,否则它只会让你解决眼前的问题。下次出现类似但不完全相同的问题时,您将再次陷入困境。 :-)
      【解决方案3】:

      如果您想操作日期,请使用日历对象。

          Calendar c = Calendar.getInstance();
          // ... set the calendar time ...
          Date endDate = new Date();
          // ... set the endDate value ...
      
          while (c.getTime().before(endDate) {
             // do something
             c.add(Calendar.DAY_OF_WEEK, 1);
          }
      

      或使用Joda Time

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 2018-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多