如何在一系列日期中进行迭代?

时间:2016-05-09 01:33:28

标签: java date

我正在尝试迭代日期字符串。字符串的格式类似于2000.07.28。我尝试将它们转换成双打,然后抱怨。我还需要保持相同的日期格式。因为我需要打印某些日期。 我试过这个:

  String begDate = "1999.11.18";
  SimpleDateFormat sdf = new     SimpleDateFormat("yyyy.MM.dd");
  Date start = sdf.parse("2010.01.01");
  Date end = sdf.parse("2010.04.01");
  GregorianCalendar gcal = new GregorianCalendar();
  gcal.setTime(start);
  while (!gcal.getTime().after(end))
 {
      Date d = gcal.getTime();
      System.out.println(d);
      gcal.add(Calendar.MONTH, 1);
  }

但是,虽然它会正确地迭代日期,但它会更改日期格式。

1 个答案:

答案 0 :(得分:1)

Date / Calendar没有格式

您似乎将Date / Calendar对象与toString方法生成的字符串的文本表示混淆。 DateCalendar都没有格式。每个都有toString方法,您在行System.out.println( d );中隐式调用。生成String时toString使用的格式是它自己的默认格式模式,而不是解析时指定的格式模式。

这一行:

System.out.println( d );

...是下一行的快捷方式,对toString的隐式调用是明确的:

System.out.println( d.toString() );

toString方法使用dow mon dd hh:mm:ss zzz yyyy形式的格式(形式笨拙,格式设计不佳)。

java.time

您正在使用旧的遗留类,这些类已被证明设计糟糕,令人困惑且麻烦。它们已被Java 8及更高版本(以及java.timeback-ported to Java 6 & 7)内置的to Android框架所取代。

对于没有时间且没有时区的仅限日期的值,请使用LocalDate类。

要指定用于解析的格式设置模式,请使用DateTimeFormatter类。

此示例代码以您希望的格式以文本方式显示LocalDate值。同时,此代码会在List中收集序列中的每个LocalDate

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy.MM.dd" );
LocalDate start = sdf.parse("2010.01.01");
LocalDate end = sdf.parse("2010.04.01");
LocalDate localDate = start;
List<LocalDate> dates = new ArrayList<>();
int i = 0;
while ( ! localDate.isAfter( end ) ) {
    i = i + 1;
    dates.add( localDate );
    String output = localDate.format( formatter );
    System.out.println( "LocalDate # " + i + " : " + output );
    // Set up next loop.
    localDate = localDate.plusDays( 1 );
}
System.out.println( "dates : " + dates.toString() );

打印ListLocalDate个对象时,请注意每个LocalDate对象的LocalDate::toString方法使用ISO 8601标准中的合理格式生成字符串。

提示:

  • LocalDate之类的对象中完成大部分工作,而不是使用字符串。对于业务逻辑,请使用智能对象。当您需要呈现用户时,请以特定格式生成字符串。
  • 在交换数据或序列化值时,如果可能的话,使用标准的ISO 8601格式,而不是发明自己的格式,如yyyy.MM.dd