我正在尝试迭代日期字符串。字符串的格式类似于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);
}
但是,虽然它会正确地迭代日期,但它会更改日期格式。
答案 0 :(得分:1)
Date
/ Calendar
没有格式您似乎将Date
/ Calendar
对象与toString
方法生成的字符串的文本表示混淆。 Date
和Calendar
都没有格式。每个都有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 8及更高版本(以及java.time和back-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() );
打印List
个LocalDate
个对象时,请注意每个LocalDate
对象的LocalDate::toString
方法使用ISO 8601标准中的合理格式生成字符串。
提示:
LocalDate
之类的对象中完成大部分工作,而不是使用字符串。对于业务逻辑,请使用智能对象。当您需要呈现用户时,请以特定格式生成字符串。 yyyy.MM.dd
。