[英]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.