java.time
java.time 类取代了与 Java 早期版本捆绑在一起的麻烦的旧日期时间类。
LocalDate
LocalDate 类表示没有时间和时区的仅日期值。
定义您的开始和结束日期。然后循环填充所有可能日期的列表。
LocalDate start = LocalDate( 2016 , 1 , 2 );
LocalDate stop = start.plusWeeks( 1 );
List<LocalDate> allDates = new ArrayList<>();
LocalDate ld = start ;
while( ld.isBefore( stop ) ) {
allDates.add( ld );
// Set up next loop.
ld = ld.plusDays( 1 );
}
DayOfWeek
DayOfWeek 枚举定义了代表每周 7 天(周一至周日)中的每一天的对象。
Java 中的EnumSet 是Set 的一个极快且低内存的实现,用于表示枚举对象的集合。当用户启用/禁用星期复选框时,重新定义您的 EnumSet DayOfWeek 值集合。
for( DayOfWeek dow in DayOfWeek.values() ) {
if ( … ) { // if your checkbox is checked for this day-of-week
dows.add( dow );
}
}
接下来,定义一组可供用户选择的日期。此集合支持用户界面小部件。
List<LocalDate> dates = new ArrayList<>();
现在循环所有可能的日期,根据用户选择的日期测试每个星期几。
for( LocalDate localDate in allDates ) {
if( dows.contains( localDate.getDayOfWeek() ) ) {
dates.add( localDate );
}
}
字符串
要填充您的用户界面小部件,您可能需要字符串来表示每个 LocalDate 对象的值。您可以使用您定义的显式格式模式创建此类字符串。但我建议让DateTimeFormatter 类自动本地化。
Locale l = Locale.CANADA_FRENCH; // Defines how to create the string: translation, abbreviation, punctuation, order-of-parts, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( l );
循环你想要展示的日期,为每个人的展示生成一个字符串。
String output = localDate.format( f );
优化
我希望有一些聪明的方法可以优化上面显示的代码。例如:
但在过早优化之前测试实际性能。我怀疑任何节省的执行时间都是微不足道的。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date、.Calendar 和java.text.SimpleDateFormat。
Joda-Time 项目现在位于 maintenance mode,建议迁移到 java.time。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。
大部分 java.time 功能在ThreeTen-Backport 中向后移植到Java 6 和7,并进一步适应ThreeTenABP 中的Android(参见How to use…)。
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 等等。
乔达时间
更新:Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
使用 Joda-Time 库及其 LocalDate(无时间)类编写一个循环。
让您开始……
LocalDate start = new LocalDate( year, month, day );
LocalDate next = start.plusDays( 1 );
int dayOfWeek = next.getDayOfWeek();
if ( dayOfWeek == DateTimeConstants.MONDAY ) { // Add to list };