tl;博士
java.time.LocalDate.parse(
"31/12/2010" ,
DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.UK )
)
.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )
52
或者,添加一个库,然后……
org.threeten.extra.YearWeek.from( // Convert from a `LocalDate` object to a `YearWeek` object representing the entire week of that date’s week-based year.
java.time.LocalDate.parse( "31/12/2010" , DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.UK )
).getWeek() // Extract an integer number of that week of week-based-year, either 1-52 or 1-53 depending on the year.
52
java.time
正如其他人所指出的,一周的定义因旧 java.util.Calendar 类中的 Locale 而异。
这个麻烦的类及其伙伴 java.util.Date 已被 Java 8 及更高版本中内置的 java.time 框架所取代。
IsoFields 类使用 ISO 8601 标准定义一周:周总是从星期一开始,第 1 周保存日历年的第一个星期四。
获取当前时刻。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
询问基于周的标准年份。
int week = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );
标准周定义
有很多方法可以定义“一周”和“一年中的第一周”。
但是,有one major standard definition:ISO 8601 standard。该标准定义了一年中的几周,包括一年中的第一周。
一年中第一个星期四的那一周
标准周从星期一开始,到星期日结束。
一周年的第 1 周是日历年的第一个星期四。
java.time 类通过 IsoFields 类支持 ISO 8601 周,包含三个实现 TemporalField 的常量:
致电LocalDate::get 访问TemporalField。
LocalDate ld = LocalDate.parse( "2010-12-31" ) ;
int weekOfWeekBasedYear = ld.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) ;
int yearOfWeekBasedYear = ld.get( IsoFields.WEEK_BASED_YEAR ) ;
ld.toString(): 2010-12-31
weekOfWeekBasedYear:52
yearOfWeekBasedYear:2010
ISO 8601 字符串格式
ISO 8601 标准定义了一种文本格式以及基于周的年份值的含义:yyyy-Www。对于特定日期,为星期一至星期日添加编号为 1-7 的星期几:yyyy-Www-d。
构造这样一个字符串。
String outputWeek = String.format( "%04d" , yearOfWeekBasedYear ) + "-W" + String.format( "%02d" , weekOfWeekBasedYear ) ;
String outputDate = outputWeek + "-" + ld.getDayOfWeek().getValue() ;
2010-W52-5
YearWeek
如果您将ThreeTen-Extra 库添加到您的项目,这项工作会容易得多。然后使用YearWeek 类。
YearWeek yw = YearWeek.from( ld ) ; // Determine ISO 8601 week of a `LocalDate`.
生成标准字符串。
String output = yw.toString() ;
2010-W52
然后解析。
YearWeek yearWeek = YearWeek.parse( "2010-W52" ) ;
yearWeek.toString(): 2010-W52
确定日期。传递 java.time.DayOfWeek 枚举对象用于周一至周日的星期几。
LocalDate localDate = yw.atDay( DayOfWeek.MONDAY ) ;
localDate.toString(): 2010-12-27
我强烈建议将此库添加到您的项目中。然后你可以传递智能对象而不是愚蠢的整数。这样做可以使您的代码更具自我记录性,提供type-safety,并确保有效值。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
使用符合JDBC 4.2 或更高版本的JDBC driver,您可以直接与您的数据库交换java.time 对象。不需要字符串也不需要 java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。
有关更多详细信息,请参阅类似问题的my Answer:
...在类似的问题上查看my Answer: