我需要在我的应用中显示开始日期和结束日期之间的日期列表。我有一个复选框列表,其中包含一周中的日期,即;星期一到星期日和两个日期选择器,帮助用户选择开始和结束日期。如果用户没有选中任何包含一周中几天的复选框,我需要显示所有日期以及开始日期和结束日期之间的一周中的日期。如果用户选择一些复选框,即;星期一,星期三,星期五我需要只显示开始日期和结束日期之间的那些日期和星期几。如果有任何方法可以实现,请告诉我吗? 谢谢。
答案 0 :(得分:1)
这可以为您提供两个日期之间的日期列表
List<Calendar> datelist = new ArrayList<Calendar>();
Calendar cStart = Calendar.getInstance();
cStart.set(2014, 04, 01);
Calendar cEnd = Calendar.getInstance();
cEnd.set(2014, 05, 2);
while(cStart.compareTo(cEnd) < 1){
datelist.add(cStart);
cStart.add(Calendar.DAY_OF_MONTH, 1);
}
msg = String.valueOf(datelist.size());
答案 1 :(得分:0)
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
枚举定义了表示星期一到星期日七天中每一天的对象。
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 );
我希望有一些聪明的方法可以优化上面显示的代码。例如:
EnumSet
对象,而不是重建DayOfWeek
并查看每个复选框。days
列表上搜索a List
implementation that acts as a mask并使用包含/排除某些元素的功能,而不是重建allDates
列表。但是在过早优化之前测试现实世界的性能。我怀疑执行时间的任何节省都是微不足道的。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见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 };