Android中java.util.Calendar的不同行为

时间:2014-12-06 22:57:36

标签: java android intellij-idea

所以我想实现一种方法,它给我工作日的日期,如果它是星期六或星期日的那些星期。为此,我使用了Calendar和setFirstDayOfWeek方法。 这就是我的代码的样子:

    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/Berlin"));
    calendar.setFirstDayOfWeek(Calendar.SATURDAY);
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); //write to array 
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);//write
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY); // and so on...

如果我在周六的IntelliJ中编译它。 12月6日,我得到以下日期:

Mon Dec 08 23:44:32 CET 2014
Tue Dec 09 23:44:32 CET 2014
...
Sat Dec 06 23:44:32 CET 2014
Sun Dec 07 23:44:32 CET 2014

..正如预期的那样。没有将星期的第一天设置为星期六,星期一的日期将是Dec 01。

现在我在Android Studio下使用完全相同的代码。如果我没有将星期的第一天设置为星期六,那么日期看起来就像在IntelliJ中一样。 任何人都可以告诉我为什么相同的代码会提供不同的结果吗?

2 个答案:

答案 0 :(得分:0)

这可能是本周默认第一天的差异。 尝试在getInstance()之后立即在两个平台上执行calendar.getFirstDayOfWeek(),看看你得到了什么。

如果你得到不同的值,那可能是问题,而这可能是由于不同的默认语言环境。尝试在两个平台上使用相同的Locale构建Calendar。

然后,还要记住,当你用Java编写Android代码时,在运行时,它不是在JVM上执行的,而是使用Dalvik运行时。无法保证两者100%兼容,尤其是对于默认的Locale。

有关详细信息,请参阅How to specify firstDayOfWeek for java.util.Calendar using a JVM argument

答案 1 :(得分:0)

java.time

虽然我无法解释行为差异,但我可以建议将这些麻烦的旧日期时间类转储为以合理的方式工作的现代类:java.time classes。

ZoneId z = ZoneId.of( "Europe/Berlin" ) ;
LocalDate today = LocalDate.now( z ) ;  // Current moment.

DayOfWeek枚举定义了七个对象,一个星期中的每一天。定义"周末"作为一组那些对象。

Set< DayOfWeek > weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY ) ;

比较今天的星期几以查看它是否包含在集合中。

LocalDate monday = null ;
if( weekend.contains( todayDow ) {
    monday = today.with( TemporalAdjusters.next( DayOfWeek.MONDAY ) ) ;
} else {  // Else today is a week-day, not found in the weekend set.
    monday = today.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) ) ;
}

收集一周剩余的日子。

List< LocalDate > daysOfTheWeek = new ArrayList<>( 5 ) ;
daysOfTheWeek.add( monday ) ;
for( int i = 1 ; i <= 4 ; i ++ ) {
    daysOfTheWeek.add( monday.plusDays( i ) ) ; // Tuesday, Wednesday, Thursday, Friday.
}

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?