You do not need to use Joda time, It is really easy to calculate with core Java library. It is not enough to calculate time differences, summer and winter time switches should be taken into consideration.
TimeZone#getRawOffset, TimeZone#getDSTSavings, TimeZone#inDaylightTime methods of Java should be used. Use TimeZone#getRawOffset to get time offset to UTC time. Give special attention to this method, because this do not return dayligth savings. Use TimeZone#getDSTSavings to get dayligth offset time in miliseconds. Finaly use TimeZone#inDaylightTime to check if the time in DST.
Here is the full code;
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());
The output of the code;
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
Check the correctness on this. There is 10 hours difference on 13rd of March.
Lets test the code for 13rd of June, which is summer time in Madrid. Furthermore, there is a switch between summer and winter time.
Here is the output of the code;
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
You can check the correctness of calculation on this
Furthermore, i totally agree @dimo414. It is best practice to use Joda time for date and time operations.
Here is the Joda code;
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);
See also;
TimeZone#getRawOffset
TimeZone#getDSTSavings
TimeZone#inDaylightTime