在上面的代码我想通过服务器(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;
我做错了吗?
你假设一个Date
有一个时区开始。 事实并非如此。 一个Calendar
做,但Date
仅仅是因为Unix纪元毫秒。 它不知道关于日历的系统或时区。 这只是一个时间点。
目前尚不清楚你想要的结果做什么-但如果它的格式化显示的问题,只是使用SimpleDateFormat
和设置的时区来代替。
我也强烈建议您使用约达时间 ,而不是内建类型...它是一个更明智的API。
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的许多例子。