Java 按时区转换日期

Java 按时区转换日期,java,date,calendar,timezone,Java,Date,Calendar,Timezone,在上面的代码中,我想将服务器时区(GMT-02:00)的日期转换为设备时区(GMT-03:00)。 但我总是有相同的服务器日期。我做错了什么 TimeZone timeZoneServer=TimeZone.getTimeZone(timeZoneServerString); 长时间=新的长时间(长值(timeInMilis)) 我做错了什么 您假设一个日期有一个时区开始。没有。一个日历可以,但是一个日期距离Unix纪元只有几毫秒。它不知道日历系统或时区。这只是一个时间点 现在还不清楚您想对结果

在上面的代码中,我想将服务器时区(GMT-02:00)的日期转换为设备时区(GMT-03:00)。 但我总是有相同的服务器日期。我做错了什么

TimeZone timeZoneServer=TimeZone.getTimeZone(timeZoneServerString); 长时间=新的长时间(长值(timeInMilis))

我做错了什么

您假设一个日期有一个时区开始。没有。一个
日历
可以,但是一个
日期
距离Unix纪元只有几毫秒。它不知道日历系统或时区。这只是一个时间点

现在还不清楚您想对结果做什么,但如果这是一个格式化显示的问题,只需使用
SimpleDateFormat
并设置时区即可

我还强烈建议您使用而不是内置类型。。。这是一个更合理的API。

java.time Java8及更高版本内置了该框架。灵感来源于Joda Time,由JSR 310定义,并由Three Ten Extra项目扩展。这些新的java.time类取代了与最早版本的java捆绑在一起的臭名昭著的旧日期时间类,
java.util.date
/
.Calendar

时间…一个
瞬间
是时间轴上的一个瞬间。应用时区(
ZoneId
)以获取
zoneDateTime

您的示例代码仅使用。时区是一个偏移量加上一组关于调整夏时制(DST)等异常的规则。因此,尽可能使用一个新的方法。但如果不可能,请使用获取

顺便说一句,一般的最佳实践是将您的服务器保持在可用状态。但这是另一种讨论

首先从服务器获取当前日期和时间

Instant now = Instant.now();  // UTC.
ZoneOffset offsetServer = ZoneOffset.of ( "-02:00" ); // Or ZoneOffset.systemDefault ()
OffsetDateTime odtServer = OffsetDateTime.ofInstant( instant , offsetServer );
或者我们可以将其缩短为:

ZoneOffset offsetServer = ZoneOffset.of ( "-02:00" ); // Or ZoneOffset.systemDefault ()
OffsetDateTime odtServer = OffsetDateTime.now ( offsetServer );
定义所需的偏移量。将该偏移量应用于服务器的当前日期时间以进行调整

ZoneOffset offsetDesired = ZoneOffset.of ( "-03:00" );
OffsetDateTime odtDesired = odtServer.withOffsetSameInstant ( offsetDesired );
转储到控制台

System.out.println ( "instant: " + instant + " | odtServer: " + odtServer + " | odtDesired: " + odtDesired );
即时:2016-01-22T22:16:14.386Z | ODT服务器:2016-01-22T20:16:14.386-02:00 | ODT预期:2016-01-22T19:16:14.386-03:00


默认情况下,日期时间值的文本表示形式在使用标准的
toString
方法中格式化。您可以根据需要定义其他格式;在StackOverflow中搜索许多示例。

谢谢Jon Skeet。我不知道Java的对象日期,只是忽略时区。
System.out.println ( "instant: " + instant + " | odtServer: " + odtServer + " | odtDesired: " + odtDesired );