如何使用Calendar API获取ISO星期几

时间:2017-08-04 15:03:06

标签: java iso8601 dayofweek

我希望使用Calendar API获取每周的ISO日期,但它会返回错误的日期编号。

星期日是一周的最后一天,应该是ISO标准的数字 7 ,星期一是第一天的第一天。

但是为星期日(2017-07-30)运行以下代码会让我返回 1 。为什么Calendar API会为我返回不同的值?

Calendar cal = Calendar.getInstance(Locale.US);
cal.set(Calendar.YEAR, 2017);
cal.set(Calendar.MONTH, Calendar.JULY);
cal.set(Calendar.DAY_OF_MONTH, 30);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

System.out.println(dayOfWeek);

结果是:1

我尝试使用Joda Time并且工作正常,但我需要使用Calendar和Java 6,因此使用其他库不是解决方案。

3 个答案:

答案 0 :(得分:2)

TL;博士

确定星期几数字的传统方式ISO 8601(周一至周日,1-7):

int dayOfWeekISO = cal.get( Calendar.DAY_OF_WEEK ) - 1 ;
if( dayOfWeekISO == 0 ) {  // For Sunday ( 1 - 1 = 0), add 7. 
    dayOfWeekISO = ( dayOfWeekISO + 1 ) ; 
}

现代方式:

LocalDate.of( 2017 , Month.JULY , 30 )  // Date-only value.
         .getDayOfWeek()                // `DayOfWeek.SUNDAY` enum object.
         .getValue()                    // 7 for Sunday. (1 = Monday, per ISO 8601 standard.)
  

7

详细

accepted answer by Maia是正确的:Those int constants on Calendar根据美国的惯例,将{@ 3}} - 星期六定义为1-7周。

  

DAY_OF_WEEK

     

public static final int DAY_OF_WEEK

     

获取和设置的字段编号,表示星期几。此字段的值为SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY和SATURDAY。

如果您绝对无法添加库,则必须根据星期日 - 星期六1-7的一周Calendar定义进行调整。要将Money放在第一位,减1,然后检查0,你要添加7。

int dayOfWeekISO = cal.get( Calendar.DAY_OF_WEEK ) - 1 ;
if( dayOfWeekISO == 0 ) {  // For Sunday ( 1 - 1 = 0), add 7. 
    dayOfWeekISO = ( dayOfWeekISO + 1 ) ; 
}

顺便说一下,从Sunday样式到美式样式(星期日首先),计算ISO 8601 7然后加1。

( DayOfWeek.SUNDAY.getValue() % 7 ) + 1

像这样:

System.out.println( ( DayOfWeek.SUNDAY.getValue() % 7 ) + 1 ) ;
System.out.println( ( DayOfWeek.MONDAY.getValue() % 7 ) + 1 ) ;
System.out.println( ( DayOfWeek.TUESDAY.getValue() % 7 ) + 1 ) ;
System.out.println( ( DayOfWeek.WEDNESDAY.getValue() % 7 ) + 1 ) ;
System.out.println( ( DayOfWeek.THURSDAY.getValue() % 7 ) + 1 ) ;
System.out.println( ( DayOfWeek.FRIDAY.getValue() % 7 ) + 1 ) ;
System.out.println( ( DayOfWeek.SATURDAY.getValue() % 7 ) + 1 ) ;
  

1

     

2

     

3

     

4

     

5

     

6

     

7

但请考虑添加modulo。非常值得为您的项目添加一个jar。那些旧的日期时间课程确实很糟糕。

避免遗留日期时间类

Calendar类是麻烦的旧遗留日期时间类的一部分,现在由java.time类取代。

java.time

a library of modern date-time classes枚举是标准的,表示由java.time.DayOfWeek定义的一周,其中一周从星期一到星期日,编号为1-7。

ISO 8601类表示没有时间且没有时区的仅限日期的值。

LocalDate ld = LocalDate.of( 2017 , Month.JULY , 30 ) ;
DayOfWeek dow = ld.getDayOfWeek() ;
int dowNumber = dow.getValue() ;
String output = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 

请参阅LocalDate

  

ld.toString():2017-07-30

     

dow.toString():SUNDAY

     

dowNumber:7

     

输出:星期日

关于java.time

this code run live at IdeOne.com框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacyjava.util.Date和& Calendar

现在位于SimpleDateFormatJoda-Time项目建议迁移到maintenance mode类。

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

从哪里获取java.time类?

How to use ThreeTenABP…项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTen-ExtraIntervalYearWeekYearQuarter

答案 1 :(得分:1)

int常量从星期日开始,到星期六结束。

记录在java.util.Calendar JavaDoc for Java 6

所以我的建议是自己计算。

答案 2 :(得分:0)

在发布问题values of Constants in Calendar

之前,检查日历的Javadoc for java 6

对于US Locale,Calendar.SUNDAY的值为1.