Вам не нужно использовать Joda время, это очень легко вычислить с основной Java библиотеки. Недостаточно рассчитать разницу во времени, следует учитывать летние и зимние переключатели.
TimeZone # getRawOffset, TimeZone # getDSTSavings, TimeZone # inDaylightTime следует использовать методы Java. Используйте TimeZone # getRawOffset, чтобы получить временное смещение по времени UTC. Уделите особое внимание этому методу, потому что это не возвращает экономию дневных денег. Используйте TimeZone # getDSTSavings, чтобы получить время смещения дневного времени в миллисекундах. Заключительное использование TimeZone # inDaylightTime, чтобы проверить, находится ли время в DST.
Вот полный код;
TimeZone timeZoneMelbourne = TimeZone.getTimeZone("Australia/Melbourne");
TimeZone timeZoneMadrid = TimeZone.getTimeZone("Europe/Madrid");
System.out.println("timeZoneMelbourne.getRawOffset() -> " + timeZoneMelbourne.getRawOffset());
System.out.println("timeZoneMadrid.getRawOffset() -> " + timeZoneMadrid.getRawOffset());
System.out.println("timeZoneMelbourne.getDSTSavings() -> " + timeZoneMelbourne.getDSTSavings());
System.out.println("timeZoneMadrid.getDSTSavings() -> " + timeZoneMadrid.getDSTSavings());
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2015);
c.set(Calendar.MONTH, 2);
c.set(Calendar.DAY_OF_MONTH, 13);
c.set(Calendar.HOUR_OF_DAY, 20);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
int timeDiff = timeZoneMadrid.getRawOffset() - timeZoneMelbourne.getRawOffset();
int madridDST = 0;
int melbourneDST = 0;
if(timeZoneMadrid.inDaylightTime(c.getTime()))
{
madridDST = timeZoneMadrid.getDSTSavings();
System.out.println("timeZoneMadrid#inDaylightTime -> " + madridDST);
}
if(timeZoneMelbourne.inDaylightTime(c.getTime()))
{
melbourneDST += timeZoneMelbourne.getDSTSavings();
System.out.println("timeZoneMelbourne#inDaylightTime -> " + melbourneDST);
}
timeDiff = timeDiff - melbourneDST + madridDST;
System.out.println("total timeDiff -> " +timeDiff);
System.out.println("timeZoneMelbourne -> " +c.getTime());
c.add(Calendar.MILLISECOND, timeDiff);
System.out.println("timeZoneMadrid -> " +c.getTime());
Выходной код;
timeZoneMelbourne.getRawOffset() -> 36000000
timeZoneMadrid.getRawOffset() -> 3600000
timeZoneMelbourne.getDSTSavings() -> 3600000
timeZoneMadrid.getDSTSavings() -> 3600000
timeZoneMelbourne#inDaylightTime -> 3600000
timeDiff -> -36000000
timeZoneMelbourne -> Fri Mar 13 20:00:00 EET 2015
timeZoneMadrid -> Fri Mar 13 10:00:00 EET 2015
Проверьте правильность на this. 13 марта разница в 10 часов.
Позволяет проверить код на 13 июня, который является летним временем в Мадриде. Кроме того, есть переход между летним и зимним периодом.
Укажите код этого кода;
timeZoneMelbourne.getRawOffset() -> 36000000
timeZoneMadrid.getRawOffset() -> 3600000
timeZoneMelbourne.getDSTSavings() -> 3600000
timeZoneMadrid.getDSTSavings() -> 3600000
timeZoneMadrid#inDaylightTime -> 3600000
total timeDiff -> -28800000
timeZoneMelbourne -> Sat Jun 13 20:00:00 EEST 2015
timeZoneMadrid -> Sat Jun 13 12:00:00 EEST 2015
Вы можете проверить правильность расчета на this
Кроме того, я полностью согласен @ dimo414. Лучше всего использовать время Joda для операций даты и времени.
Код Joda;
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2015);
c.set(Calendar.MONTH, 5);
c.set(Calendar.DAY_OF_MONTH, 13);
c.set(Calendar.HOUR_OF_DAY, 20);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
LocalDateTime dateTime = new LocalDateTime(c.getTime());
DateTime srcDateTime = dateTime.toDateTime(DateTimeZone.forID("Australia/Melbourne"));
DateTime dstDateTime = srcDateTime.withZone(DateTimeZone.forID("Europe/Madrid"));
Date madridTime =dstDateTime.toLocalDateTime().toDateTime().toDate();
System.out.println("Melbourne Time -> "+srcDateTime.toDateTime());
System.out.println("Madrid Time -> "+madridTime);
См. Также;
TimeZone#getRawOffset
TimeZone#getDSTSavings
TimeZone#inDaylightTime
Итак, что * * вы ищете для? Что вы ожидаете от вывода, и что этот код дает вам вместо этого? – RealSkeptic
Не совсем понятно, что вы * * ищете, так как этот код преобразуется из одного часового пояса в другой. Является ли проблема, что вам нужно * разобрать * в этом часовом поясе? Пожалуйста, будьте более конкретными, иначе вам будет сложно помочь. –
http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html#forOffsetHours-int- –