我希望使用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,因此使用其他库不是解决方案。
答案 0 :(得分:2)
确定星期几数字的传统方式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类取代。
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
输出:星期日
this code run live at IdeOne.com框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacy,java.util.Date
和& Calendar
现在位于SimpleDateFormat
的Joda-Time项目建议迁移到maintenance mode类。
要了解详情,请参阅java.time。并搜索Stack Overflow以获取许多示例和解释。规范是Oracle Tutorial。
从哪里获取java.time类?
How to use ThreeTenABP…项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTen-Extra,Interval
,YearWeek
和YearQuarter
。
答案 1 :(得分:1)
答案 2 :(得分:0)
在发布问题values of Constants in Calendar
之前,检查日历的Javadoc for java 6对于US Locale,Calendar.SUNDAY的值为1.