…解析…从字符串…时区未指定…我想设置一个特定的时区LocalDateTime.parse( "2018-01-23T01:23:45.123456789" )
// Parse string, lacking an offset-from-UTC and lacking a time zone, as a `LocalDateTime`.
.atZone( ZoneId.of( "Africa/Tunis" ) )
// Assign the time zone for which you are certain this date-time was intended. Instantiates a `ZonedDateTime` object.在j.U.Date中没有时区正如其他正确答案所述,java.util.Date没有时区†..它代表世界协调时/GMT(无时区偏移)。令人困惑的是toString方法在生成字符串表示时应用JVM的默认时区。避免j.U.Date由于这个原因,以及许多其他原因,您应该避免使用内置的java.util.Date&.Calendar&java.text.ClineDateFormat。他们是出了名的麻烦。相反,请使用java.time包捆绑在一起Java 8.java.time时间类可以通过三种方式表示时间线上的某个时刻:世界协调时(Instant)带有偏移量(OffsetDateTime带着ZoneOffset)有时区(ZonedDateTime带着ZoneId)Instant在……里面java.time,基本的构建块是Instant,世界协调时间线上的一个时刻。使用Instant对象,用于您的大部分业务逻辑。Instant instant = Instant.now();OffsetDateTime应用从世界协调时抵消适应某一地区挂钟时间.应用aZoneOffset得到一个OffsetDateTime.ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" );OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset );ZonedDateTime最好是应用一个时区,抵消加处理异常的规则,如夏令时(DST).应用aZoneId转到Instant得到一个ZonedDateTime..始终指定适当时区名称..不要使用3-4缩写,例如EST或IST既不独特也不标准化。ZoneId zoneId = ZoneId.of( "America/Montreal" );ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );LocalDateTime如果输入字符串缺少任何偏移量或区域指示符,则将其解析为LocalDateTime.如果确定预定的时区,则分配ZoneId产生一个ZonedDateTime..参见上面的代码示例TL;DR部分在上面。格式化字符串呼叫toString方法在这三个类中的任何一个上生成一个字符串,该字符串表示标准中的日期时间值。ISO 8601格式。这个ZonedDateTime类通过在括号中追加时区的名称来扩展标准格式。String outputInstant = instant.toString(); // Ex: 2011-12-03T10:15:30ZString outputOdt = odt.toString();
// Ex: 2007-12-03T10:15:30+01:00String outputZdt = zdt.toString(); // Ex: 2007-12-03T10:15:30+01:00[Europe/Paris]对于其他格式,请使用DateTimeFormatter班级,等级。通常最好让该类使用用户预期的人类语言和文化规范生成本地化格式。也可以指定特定的格式。关于java.time这个java.time框架构建在Java 8及更高版本中。这些阶级取代了那个烦人的老人。遗产日期-时间类,如java.util.Date, Calendar, & SimpleDateFormat.这个尤达-时间项目,现在在维护模式,建议迁移到java.time上课。若要了解更多信息,请参见Oracle教程..并搜索堆栈溢出的许多例子和解释。规格是JSR 310.你们可以交换java.time对象直接使用数据库。用JDBC驱动程序符合JDBC 4.2或者晚些时候。不需要字符串,不需要字符串java.sql.*上课。在哪里获得java.time类?JavaSE 8, JavaSE 9, JavaSE 10, JavaSE 11,以及以后的版本-标准JavaAPI的一部分是捆绑实现。Java 9添加了一些次要的特性和修复。JavaSE 6和JavaSE 7大多数java.time功能都被移植到Java 6&7中Threeten-Backport.安卓的android包实现的更高版本。java.time上课。对于早期的Android(<26),ThreeTenABP项目适应Threeten-Backport(上文所述)。看见如何使用ThreeTenaBP….这个三次-额外项目使用其他类扩展java.time。这个项目是java.time将来可能添加的一个试验场。您可能会在这里发现一些有用的类,例如Interval, YearWeek, YearQuarter,和更多.尤达-时间当尤达-时间仍然在积极维护,它的制造者告诉我们尽快迁移到java.time是方便的。我保留此部分作为参考,但我建议使用java.time上一节代替。在……里面尤达-时间,日期时间对象(DateTime)确实知道它指定的时区。这意味着来自UTC的抵消和该时区夏令时(DST)及其他此类异常的规律和历史。String input = "2014-01-02T03:04:05";DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" );DateTime dateTimeIndia = new DateTime
( input, timeZone );DateTime dateTimeUtcGmt = dateTimeIndia.withZone( DateTimeZone.UTC );呼叫toString方法生成字符串。ISO 8601格式。String output = dateTimeIndia.toString();Joda-Time还提供了生成各种其他字符串格式的丰富功能。如果需要,可以将Joda-time日期时间转换为java.util.Date。Java.util.Date date = dateTimeIndia.toDate();搜索StackOverflow中的“joda日期”以找到更多的示例,其中一些非常详细。†实际上在那里是嵌入在java.util.Date中的时区,用于某些内部函数(请参阅对此答案的注释)。但此内部时区未公开为属性,且无法设置。这个内部时区是不所使用的toString方法生成日期-时间值的字符串表示;相反,JVM的当前默认时区是动态应用的。因此,简而言之,我们经常说“j.u.date没有时区”。
困惑?是。还有另一个理由来避免这些老生常谈的课程。