由时区转换日期(Convert Date by TimeZone)

2019-08-16 16:39发布

在上面的代码我想通过服务器(GMT-02:00)的时区变换一个日期从我的设备(GMT-03:00)到时区。 但我始终有服务器相​​同的日期。 我做错了吗?

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

Answer 1:

我做错了吗?

你假设一个Date有一个时区开始。 事实并非如此。 一个Calendar做,但Date 仅仅是因为Unix纪元毫秒。 它不知道关于日历的系统或时区。 这只是一个时间点。

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

我也强烈建议您使用约达时间 ,而不是内建类型...它是一个明智的API。



Answer 2:

java.time

Java的8后来有java.time框架内置。 通过乔达时间的启发,由JSR 310定义,由ThreeTen-EXTRA项目扩展。 这些新java.time类取代与Java,最早版本捆绑出了名的麻烦旧日期,时间类java.util.Date / .Calendar

java.time的基础...一个Instant是在时间轴上的时刻UTC 。 套用一个时区( ZoneId )获得ZonedDateTime

你的示例代码仅使用偏移从-UTC 。 阿时区为大约调整异常,如日光节约时间(DST)的偏移加上一组规则。 因此,使用正确的时区的名称只要有可能。 但是,如果没有可能,使用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

日期时间值的那些文本表示默认情况下,在格式化toString使用方法ISO 8601标准。 您可以定义其他格式的需求; 搜索StackOverflow的许多例子。



文章来源: Convert Date by TimeZone