Java - convert current date into UTC and UTC in any TimeZone
我需要两件事:
将当前时间转换为UTC(因此我可以以UTC格式存储日期)
- > result = java.util.Date。
将加载日期(UTC格式)转换为任何TimeZone - > result =
java.util.Date或毫秒。
两点都要考虑到白昼。
1)
我在stackoverflow上找到了以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Calendar c = Calendar.getInstance(); System.out.println("current:"+c.getTime()); TimeZone z = c.getTimeZone(); int offset = z.getRawOffset(); if(z.inDaylightTime(new Date())){ offset = offset + z.getDSTSavings(); } int offsetHrs = offset / 1000 / 60 / 60; int offsetMins = offset / 1000 / 60 % 60; System.out.println("offset:" + offsetHrs); System.out.println("offset:" + offsetMins); c.add(Calendar.HOUR_OF_DAY, (-offsetHrs)); c.add(Calendar.MINUTE, (-offsetMins)); System.out.println("GMT Time:"+c.getTime()); |
- >结果等于UTC?
2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public static long getTimeMillisFromTimeZone(long utcTimeMillis, String timeZoneId) { System.out.println("input millis:" + utcTimeMillis); Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); calendar.setTimeInMillis(utcTimeMillis); TimeZone fromTimeZone = calendar.getTimeZone(); TimeZone toTimeZone = TimeZone.getTimeZone(timeZoneId); calendar.setTimeZone(fromTimeZone); calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1); if (fromTimeZone.inDaylightTime(calendar.getTime())) { calendar.add(Calendar.MILLISECOND, calendar.getTimeZone() .getDSTSavings() * -1); } calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset()); if (toTimeZone.inDaylightTime(calendar.getTime())) { calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings()); } System.out.println(calendar.getTime()); System.out.println("output millis:" + calendar.getTime().getTime()); return calendar.getTime().getTime(); } |
- >我遇到了问题 - >输了1h!
在我的例子中,我将来自TimeZone"Europe / Vienna"的日期(使用日光)存储到数据库中作为utc。
欧洲/维也纳 - > 10:00
UTC - > 09:00
现在我想把这个UTC(09:00)转换成"欧洲/维也纳",我得到:09:00 =我输了一个小时..
您是否考虑过像Joda一样使用现有的DateTime API?
UPDATE
已经回答:Joda Time - 时区之间的差异
将是相同的我想只是使用
请尝试以下代码(我正在使用Joda Time)来转换时区之间的日期:
1 2 3 4 5 6 | public static Date convertDate(Date sourceDate, DateTimeZone sourceTimeZone, DateTimeZone resultTimeZone) { LocalDateTime localDateTime = new LocalDateTime(date.getTime()); DateTime sourceDateTime = localDateTime.toDateTime(sourceTimeZone); DateTime resultDateTime = sourceDateTime.withZone(resultTimeZone); return resultDateTime.toLocalDateTime().toDateTime().toDate(); } |
转换为UTC可以简化为:
1 2 3 |
这个电话成功为我增加了1小时:
1 |