java 设置时区_如何设置java.util.Date的时区?

…解析…从字符串…时区未指定…我想设置一个特定的时区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

时间类可以通过三种方式表示时间线上的某个时刻:世界协调时(

Instant)

带有偏移量(

OffsetDateTime带着

ZoneOffset)

有时区(

ZonedDateTime带着

ZoneId)

Instant

在……里面java.time,基本的构建块是Instant,世界协调时间线上的一个时刻。使用Instant对象,用于您的大部分业务逻辑。Instant instant = Instant.now();

OffsetDateTimeZoneOffset 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

若要了解更多信息,请参见Oracle教程..并搜索堆栈溢出的许多例子和解释。规格是JSR 310.

你们可以交换java.time对象直接使用数据库。用JDBC驱动程序符合JDBC 4.2或者晚些时候。不需要字符串,不需要字符串java.sql.*上课。

在哪里获得java.time类?Java 9添加了一些次要的特性和修复。大多数java.time功能都被移植到Java 6&7中的android包实现的更高版本。

java.time上课。

这个三次-额外项目使用其他类扩展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没有时区”。困惑?是。还有另一个理由来避免这些老生常谈的课程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值