通过TimeZone转换日期
在上面的代码中,我想通过服务器的TimeZone(GMT-02:00)将Date转换为来自我的设备的TimeZone(GMT-03:00)。 但我总是拥有相同的服务器日期。 我做错了什么?
TimeZone timeZoneServer = TimeZone.getTimeZone(timeZoneServerString); 很长时间=新的Long(Long.valueOf(timeInMilis));
Calendar calendarDateServer = Calendar.getInstance(timeZoneServer); calendarDateServer.setTimeInMillis(time); long miliServer = calendarDateServer.getTimeInMillis(); TimeZone timeZoneMeu = TimeZone.getDefault(); Calendar meuCalendario = new GregorianCalendar(); meuCalendario.setTimeZone(timeZoneMeu); meuCalendario.setTimeInMillis(miliServer); Date transformedDate = meuCalendario.getTime(); return transformedDate;
我做错了什么?
您假设Date
有一个时区可以开始。 它没有。 一个Calendar
可以,但是一个Date
就是自Unix时代以来的毫秒。 它不了解日历系统或时区。 这只是一个时间点。
目前还不清楚你想对结果做什么 – 但是如果要将其格式化以便显示,只需使用SimpleDateFormat
并在其上设置时区。
我还强烈建议您使用Joda Time而不是内置类型……这是一个更合理的API。
java.time
Java 8及更高版本内置了java.time框架。 灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目扩展。 这些新的java.time类取代了与最早版本的Java java.util.Date
/ .Calendar
捆绑在一起的臭名昭着的旧日期时间类。
java.time的基础知识… Instant
是UTC时间轴上的一个时刻。 应用时区( ZoneId
)以获取ZonedDateTime
。
您的示例代码仅使用来自UTC的偏移量 。 时区是偏移量加上一组关于调整夏令时(DST)等exception的规则。 因此,请尽可能使用适当的时区名称 。 但如果不可能,请使用ZoneOffset
获取OffsetDateTime
。
顺便说一句,一般的最佳做法是将服务器保持在UTC状态 。 但这是另一个讨论。
首先从服务器获取当前日期时间。
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 | odtServer:2016-01-22T20:16:14.386-02:00 | odtDesired:2016-01-22T19:16:14.386-03:00
默认情况下,使用ISO 8601标准在toString
方法中格式化日期时间值的文本表示。 您可以根据需要定义其他格式; 搜索StackOverflow有很多例子。