通过TimeZone转换日期

时间:2013-02-01 22:39:24

标签: java date calendar 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; 

2 个答案:

答案 0 :(得分:4)

  

我做错了什么?

您假设Date有一个时区可以开始。它没有。一个Calendar可以,但是自{1}}以来只是毫秒时间。它不了解日历系统或时区。这只是一个时间点。

目前还不清楚你想要对结果做什么 - 但如果要将其格式化以便显示,只需使用Date并在上设置的时区。< / p>

我还强烈建议您使用Joda Time而不是内置类型...这是很多更明智的API。

答案 1 :(得分:0)

java.time

Java 8及更高版本内置了java.time框架。灵感来自Joda-Time,由JSR 310定义,并由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有很多例子。