偏移量≠时区
正如 Jon Skeet 在评论中所说,时区不仅仅是与 UTC/GMT 的偏移量。存储偏移小时数(和分钟数)对于在数据库/存储中处理日期时间来说不是最佳策略。
乔达时间
java.util.Date 和 java.util.Calendar 类是出了名的麻烦。避开他们。使用Joda-Time。或者,在 Java 8 中,使用新的 java.time.* package,它由 JSR 310 定义,并受到 Joda-Time 的启发,但经过重新设计。
我们可以创建一个DateTimeZone 来表示偏移量,但如前所述,这在逻辑上并不构成完整的时区。
我们可以将 java.util.Date 对象直接传递给 Joda-Time DateTime 构造函数。除此之外,我们还传递了一个 DateTimeZone 对象。要进行另一个转换方向,请在 DateTime 对象上调用 toDate。
java.util.Date date = new java.util.Date(); // Retrieved from elsewhere. Faked here.
String offsetInput = "GMT-5";
int offsetHours = 0, offsetMinutes = 0;
offsetInput = offsetInput.replace( "GMT", "" ); // Delete 'GMT' characters.
String[] parts = offsetInput.split(":"); // About splitting a string: http://stackoverflow.com/q/3481828/642706
// Handle results of split.
if( parts.length == 0 ) {
// Add some error handling here
}
if ( parts.length >= 1 ) {
offsetHours = Integer.parseInt( parts[0] ); // Retrieve text of first number (zero-based index counting).
}
if ( parts.length >= 2 ) {
offsetMinutes = Integer.parseInt( parts[1] ); // Retrieve text of second number (zero-based index counting).
}
if( parts.length >= 3 ) {
// Add some error handling here
}
DateTimeZone partialTimeZoneWithOnlyOffset = DateTimeZone.forOffsetHoursMinutes( offsetHours, offsetMinutes );
DateTime dateTime = new DateTime( date, partialTimeZoneWithOnlyOffset );
转储到控制台…
System.out.println( "date: " + date ); // BEWARE: JVM's default time zone applied in the implicit call to "toString" of a Date. Very misleading.
System.out.println( "partialTimeZoneWithOnlyOffset: " + partialTimeZoneWithOnlyOffset );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime with alternate formatting: " + DateTimeFormat.forStyle( "FF" ).withLocale( Locale.US ).print( dateTime ) );
运行时……
date: Sat Feb 08 22:40:57 PST 2014
partialTimeZoneWithOnlyOffset: -05:00
dateTime: 2014-02-09T01:40:57.810-05:00
dateTime with alternate formatting: Sunday, February 9, 2014 1:40:57 AM -05:00