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 将 Sunday-Saturday 的周定义为 1-7,根据美国的习惯。
DAY_OF_WEEK
public static final int DAY_OF_WEEK
get 和 set 的字段编号,表示星期几。此字段采用 SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY 和 SATURDAY 值。
如果您绝对不能添加库,那么您必须从 Calendar 星期天-星期六 1-7 的定义中进行调整。要将 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 ) ;
}
顺便说一句,从ISO 8601风格到美式风格(先星期日),计算modulo 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
但请考虑添加a library of modern date-time classes。值得为您的项目添加 jar 的麻烦。那些旧的日期时间类真的很糟糕。
避免使用旧的日期时间类
Calendar 类是麻烦的旧日期时间类的一部分,现在被 java.time 类所取代。
java.time
java.time.DayOfWeek 枚举是标准的,表示由ISO 8601 定义的一周,其中一周从星期一到星期日,编号为 1-7。
LocalDate 类表示没有时间和时区的仅日期值。
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 ) ;
见this code run live at IdeOne.com。
ld.toString(): 2017-07-30
dow.toString(): 星期日
道数:7
输出:周日
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。