Reputation: 567
I need two things:
convert current time into UTC (so I can store date in UTC format) --> result = java.util.Date.
convert loaded date (UTC format) into any TimeZone --> result = java.util.Date or milliseconds.
For both points bear daylight in mind.
1) I found following on stackoverflow:
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());
--> result equals UTC?
2)
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();
}
--> I got a problem there --> lost 1h!
In my example I stored a Date from TimeZone "Europe/Vienna" (using daylight) into database as utc. Europa/Vienna --> 10:00 UTC --> 09:00
Now I want to convert this UTC (09:00) into "Europe/Vienna" and I get: 09:00 = I lost an hour..
Upvotes: 3
Views: 25937
Reputation: 7988
Please try following code (I am using Joda Time) to convert dates between Time Zones:
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();
}
Conversion to UTC could be simplified to:
public static Date toUtcDate(Date sourceDate, DateTimeZone sourceTimeZone) {
return convertDate(sourceDate, sourceTimeZone, DateTimeZone.UTC);
}
This call successfully adds 1 hour for me:
convertDate(new Date(), DateTimeZone.UTC, DateTimeZone.forID("Europe/Vienna"));
Upvotes: 0
Reputation: 2137
Did you thought about just using existing DateTime API like Joda?
UPDATE
already answered: Joda Time - different between timezones
would be the same i guess just use withZone
Upvotes: 2