tl;博士
org.threeten.extra.YearWeek // Handy class found in the ThreeTen-Extra library added to your project.
.from( // Determine the week number and the week-based year number from the passed `LocalDate` object, according to standard ISO 8601 definition of a week.
myResultSet.getObject( … , LocalDate.class ) // Produces a `LocalDate` object to pass to `YearWeek.from`.
)
.toString() // Generate a String in standard ISO 8601 format: yyyy-Www
2018-W13
详情
当您从 H2 获取 Date 类型为 java.sql.Date 时,转换为 java.time.LocalDate。
LocalDate ld = mySqlDate.toLocalDate();
您可以查询 ISO 8601 标准 definition of a week 其中第 1 周包含一年中的第一个星期四,并且从星期一到星期日运行。
int weekNumber = ld.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) ;
提取年份。
int year = ld.getYear();
组装您的标准 ISO 8601 字符串。
String output = year + "-W" + String.format( "%02d ", weekNumber );
更简单的是使用来自ThreeTen-Extra 项目的YearWeek 类。
String output = YearWeek.from( ld ).toString() ;
JDBC 4.2
从 JDBC 4.2 及更高版本开始,您可以直接与数据库交换 java.time 对象。无需再次过度使用 java.util 或 java.sql 日期时间类。
LocalDate ld = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ; // Capture the current date as seen in the wall-clock used by the people in a certain region (a time zone).
myPreparedStatement.setObject( … , ld ) ;
和检索。
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
关于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 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。