Generally you cannot translate from a time zone like Asia/Kolkata to a GMT offset like +05:30 or +07:00. A time zone, as the name says, is a place on earth and comprises the historic, present and known future UTC offsets used by the people in that place (for now we can regard GMT and UTC as synonyms, strictly speaking they are not). For example, Asia/Kolkata has been at offset +05:30 since 1945. During periods between 1941 and 1945 it was at +06:30 and before that time at +05:53:20 (yes, with seconds precision). Many other time zones have summer time (daylight saving time, DST) and change their offset twice a year.
Given a point in time, we can make the translation for that particular point in time, though. I should like to provide the modern way of doing that.
java.time and ThreeTenABP
ZoneId zone = ZoneId.of("Asia/Kolkata");
ZoneOffset offsetIn1944 = LocalDateTime.of(1944, Month.JANUARY, 1, 0, 0)
.atZone(zone)
.getOffset();
System.out.println("Offset in 1944: " + offsetIn1944);
ZoneOffset offsetToday = OffsetDateTime.now(zone)
.getOffset();
System.out.println("Offset now: " + offsetToday);
Output when running just now was:
Offset in 1944: +06:30
Offset now: +05:30
For the default time zone set zone
to ZoneId.systemDefault()
.
To format the offset with the text GMT
use a formatter with OOOO
(four uppercase letter O) in the pattern:
DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("OOOO");
System.out.println(offsetFormatter.format(offsetToday));
GMT+05:30
I am recommending and in my code I am using java.time, the modern Java date and time API. The TimeZone
, Calendar
, Date
, SimpleDateFormat
and DateFormat
classes used in many of the other answers are poorly designed and now long outdated, so my suggestion is to avoid all of them.
Question: Can I use java.time on Android?
Yes, java.time works nicely on older and newer Android devices. It just requires at least Java 6.
- In Java 8 and later and on newer Android devices (from API level 26) the modern API comes built-in.
- In Java 6 and 7 get the ThreeTen Backport, the backport of the modern classes (ThreeTen for JSR 310; see the links at the bottom).
- On (older) Android use the Android edition of ThreeTen Backport. It’s called ThreeTenABP. And make sure you import the date and time classes from
org.threeten.bp
with subpackages.
Links