【问题标题】:Convert Date by TimeZone按时区转换日期
【发布时间】:2013-01-17 08:28:54
【问题描述】:

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

时区 timeZoneServer = TimeZone.getTimeZone(timeZoneServerString); 长时间 = 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; 

【问题讨论】:

    标签: java date calendar timezone


    【解决方案1】:

    我做错了什么?

    您假设Date 有一个时区作为开始。它没有。 Calendar 确实如此,但 Date 自 Unix 纪元以来只有 毫秒。它不知道日历系统或时区。这只是一个时间点。

    不清楚你想对结果做什么 - 但如果是格式化显示的问题,只需使用 SimpleDateFormat 并将时区设置在 that 上。

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

    【讨论】:

    • 感谢乔恩·斯基特。我不知道 Java 的对象 Date 只是忽略 Time Zone。
    【解决方案2】:

    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 | odt服务器:2016-01-22T20:16:14.386-02:00 | odtDesired: 2016-01-22T19:16:14.386-03:00

    这些日期时间值的文本表示默认在toString 方法中使用ISO 8601 标准进行格式化。您可以根据需要定义其他格式;在 StackOverflow 上搜索很多示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多