tl;博士
ZonedDateTime zdt = LocalDateTime.parse( "2014-02-15 05:18:08".replace( " " , "T" ) ).atOffset( ZoneOffset.UTC ).atZoneSameInstant( ZoneId.of( "Asia/Kolkata" ) ) ;
LocalDate ld = zdt.toLocalDate();
LocalTime lt = zdt.toLocalTime();
使用对象,而不是字符串
您应该从数据库中检索日期时间值作为日期时间对象而不是字符串。
从 JDBC 4.2 及更高版本开始,我们可以与数据库交换 java.time 对象。
Instant instant = Instant.now() ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , instant ) ;
检索。
Instant instant = myResultSet.getObject( … , Instant.class ) ;
java.time
Java 8 和更高版本中的 java.time 类取代了麻烦的旧旧日期时间类以及第 3 方 Joda-Time 库。
-
java.sql.Timestamp 类已替换为 Instant。
-
java.sql.Date 类已替换为 LocalDate。
-
java.sql.Time 类已替换为 LocalTime。
-
解析字符串
如果您遇到这样的字符串,请使用 java.time 类对其进行解析。其他答案正在使用与 Java 的最早版本捆绑在一起的麻烦的旧日期时间类。这些现在是遗留问题,应该避免。
您的输入字符串几乎是标准的ISO 8601 格式。只需将中间的空格替换为T。
String input = "2014-02-15 05:18:08".replace( " " , "T" ) ;
LocalDateTime
解析为LocalDateTime,因为字符串缺少有关offset-from-UTC 或时区的任何信息。
LocalDateTime ldt = LocalDateTime.parse( input ) ;
OffsetDateTime
我会假设您输入字符串中的值是UTC 时区中的一个时刻。所以调整为UTC。
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
ZonedDateTime
您要求将此调整到比 UTC 时间提前五个半小时的 India time 区域。
atZoneSameInstant 表示生成的ZonedDateTime 表示与OffsetDateTime 完全相同的同时时刻。两者的不同之处仅在于他们通过wall-clock time 的两个不同镜头观看同一时刻。
ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );
LocalDate & LocalTime
如果您想分别处理日期部分和时间部分,请将每个部分提取为 Local…。
LocalDate ld = zdt.toLocalDate();
LocalTime lt = zdt.toLocalTime();
生成字符串表示
类上的toString 方法都使用标准ISO 8601 格式生成字符串表示。要使用其他格式,请使用 DateTimeFormatter 类。在 Stack Overflow 上搜索许多示例和讨论。
最简单的方法是让课程自动为您本地化。为所需的人类语言和所需的文化规范指定 Locale,以决定大小写、缩写等问题。
Locale locale = new Locale( "en" , "IN" ); // English language, India cultural norms.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ).withLocale( locale );
String output = zdt.format( f );
关于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。