2013-02-01 58 views
1

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

TimeZone timeZoneServer = TimeZone.getTimeZone(timeZoneServerString); Long time = new 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; 

回答

4

我做错了什么?

你假设一个Date有一个开始的时区。它没有。 A Calendar确实,但Date只是毫秒以来的Unix时代。它不知道日历系统或时区。这只是一个时间点。

目前尚不清楚你想要的结果做什么 - 但如果它的格式化显示的问题,只需使用SimpleDateFormat和设置时区上代替。

我也强烈建议您使用Joda Time,而不是内建类型...这是一个更明智的API。

+0

谢谢Jon Skeet。我不知道Java的对象日期只是忽略时区。 – leonvian

0

java.time

的Java 8,后来有java.time框架内置。受JSR 310定义的Joda-Time的启发,并由ThreeTen-Extra项目扩展。这些新的java.time类取代了与最早版本的Java(java.util.Date/.Calendar)捆绑在一起的众所周知的麻烦的旧日期时间类。

java.time的基础知识... InstantUTC中时间轴上的一个时刻。应用时区(ZoneId)获得ZonedDateTime。您的示例代码仅使用offset-from-UTC。时区是一个偏移量关于调整诸如夏令时(DST)等异常的一组规则。因此尽可能使用proper time zone name。但如果不可能,请使用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。