[英]How to Iterate through a range of dates?
我正在尝试遍历日期字符串。 字符串的格式类似于 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);
}
但是,虽然它确实正确地遍历日期,但它会更改日期格式。
Date
/ Calendar
没有格式您似乎将Date
/ Calendar
对象与其由toString
方法生成为 String 的值的文本表示相混淆。 Date
和Calendar
都没有格式。 每个都有一个你在System.out.println( d );
行中隐式调用的toString
方法System.out.println( d );
. toString
在生成 String 时使用的格式是它自己的默认格式模式,而不是您在解析时指定的格式模式。
这一行:
System.out.println( d );
...是下一行的快捷方式,隐式调用toString
显式:
System.out.println( d.toString() );
该toString
方法使用自己的格式(一种笨拙、设计不佳的格式),格式为dow mon dd hh:mm:ss zzz yyyy
。
您正在使用旧的遗留类,这些类已被证明设计不佳、令人困惑且麻烦。 它们已被内置于 Java 8 及更高版本中的java.time框架所取代(并且向后移植到 Java 6 & 7和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() );
打印LocalDate
对象List
时,请注意每个LocalDate
对象的LocalDate::toString
方法使用ISO 8601标准中的合理格式生成一个 String。
提示:
LocalDate
而不是 Strings 这样的对象中完成大部分工作。 对于业务逻辑,请使用智能对象。 当您需要呈现用户时,则生成某种格式的字符串。yyyy.MM.dd
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.