3

I need two things:

  1. convert current time into UTC (so I can store date in UTC format) --> result = java.util.Date.

  2. 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..

user1731299
  • 567
  • 3
  • 10
  • 24
  • possible duplicate of [How can I get the current date and time in UTC or GMT in Java?](http://stackoverflow.com/questions/308683/how-can-i-get-the-current-date-and-time-in-utc-or-gmt-in-java) – AlikElzin-kilaka Feb 12 '15 at 15:39

2 Answers2

2

Did you thought about just using existing DateTime API like Joda?

UPDATE

  1. already answered: Joda Time - different between timezones

  2. would be the same i guess just use withZone

Community
  • 1
  • 1
christian.vogel
  • 2,117
  • 18
  • 22
0

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"));
udalmik
  • 7,838
  • 26
  • 40
  • 1
    Well I tried using your methods. First I got utc date form 'toUTcDate' and it did not return the correct value (+1 hour). After that I tried 'convertDate' but It made not differences which target timezone I tried - I always got the same date return. – user1731299 Nov 29 '12 at 11:44
  • 1
    I see now .. Was sure, that it works, will update the answer soon – udalmik Nov 29 '12 at 12:04
  • Well now 'convertDate' deliver a date with +1 hour..maybe daylight problem? – user1731299 Nov 29 '12 at 14:55
  • this line are the problem in my mind: LocalDateTime localDateTime = new LocalDateTime(date.getTime()); Because sourceDate is always an UTC Date why do I have with local date? – user1731299 Nov 29 '12 at 15:10
  • if we return java.util.Date the timezone of this object will be resetted to local one? – user1731299 Nov 29 '12 at 15:31