博士tl;
OffsetDateTime.parse ( "2010-01-01T12:00:00+01:00" )
或者对于Java 12+,使用Instant。解析见Arvind Kumar Avinash的答案。
使用java.time
新的java。Java 8中的time包,后来受到Joda-Time的启发。
OffsetDateTime类表示时间轴上的一个时刻,该时刻具有与utc的偏移量,而不是时区。
OffsetDateTime odt = OffsetDateTime.parse ( "2010-01-01T12:00:00+01:00" );
调用toString生成标准ISO 8601格式的字符串:
2010 - 01 - 01 - t12:00 + 01:00
要通过UTC的镜头看到相同的值,提取一个Instant或将偏移量从+01:00调整为00:00。
Instant instant = odt.toInstant();
…or…
OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC );
根据需要调整时区。时区是一个区域的utc偏移值的历史记录,并带有一组处理异常(如夏令时)的规则。因此,尽可能应用时区,而不仅仅是偏移量。
ZonedDateTime zonedDateTimeMontréal = odt.atZoneSameInstant( ZoneId.of( "America/Montreal" ) );
对于只有日期的值,使用LocalDate。
LocalDate ld = LocalDate.of( 2010 , Month.JANUARY , 1 ) ;
Or:
LocalDate ld = LocalDate.parse( "2010-01-01" ) ;
关于java.time
java。时间框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期-时间类,如java.util。日期,日历和简单日期格式。
要了解更多,请参阅Oracle教程。搜索Stack Overflow可以找到很多例子和解释。规范是JSR 310。
Joda-Time项目现在处于维护模式,建议迁移到java。时间类。
你可以交换java。Time对象直接使用数据库。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java。sql。*类。Hibernate 5和JPA 2.2支持java.time。
从哪里获取java。时间类?
Java SE 8, Java SE 9, Java SE 10, Java SE 11, and later - Part of the standard Java API with a bundled implementation.
Java 9 brought some minor features and fixes.
Java SE 6 and Java SE 7
Most of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
Android
Later versions of Android (26+) bundle implementations of the java.time classes.
For earlier Android (<26), the process of API desugaring brings a subset of the java.time functionality not originally built into Android.
If the desugaring does not offer what you need, the ThreeTenABP project adapts ThreeTen-Backport (mentioned above) to Android. See How to use ThreeTenABP….