Kona Laxman Deepak
Kona Laxman Deepak

Reputation: 280

How to get offset from TimeZone

I just wanted to get offset(+02:00) from TimeZone but seems like it is not working for IST, JST, EST, and BET.

TimeZone exchangeTimeZone = banker.getTimeZone();   
String timeZone = ZonedDateTime.now(ZoneId.of(exchangeTimeZone.getID())).getOffset().getId();

It is returning error "Unknown time-zone ID: EST". Date object is not avilable with me.

Upvotes: 0

Views: 2113

Answers (3)

Eugene Voichishen
Eugene Voichishen

Reputation: 51

Use ZoneId.SHORT_IDS

ZonedDateTime.now(ZoneId.of(exchangeTimeZone.getID(), ZoneId.SHORT_IDS))
             .getOffset().getId();

Upvotes: 5

Anonymous
Anonymous

Reputation: 86389

TimeZone.toZoneId()

    // Never do this in your code: Get a TimeZone with ID EST for demonstration only.
    TimeZone tz = TimeZone.getTimeZone("EST");
    
    String currentOffsetString = ZonedDateTime.now(tz.toZoneId())
            .getOffset()
            .getId();
    System.out.println(currentOffsetString);

Output when running just now:

-05:00

Contrary to the one-arg ZoneId.of method that you used in your code, TimeZone.toZoneId() does handle the deprecated three letter abbreviations (which may be considered an advantage or a disadvantage depending on your situation and your taste). So the above code works with many such three letter abbreviations too, including EST.

I am only hesitatingly including the first code line above. There are several things wrong with it: We should not create old-fashioned TimeZone objects in our code but rely on the modern ZonedId and related classes from java.time, the modern Java date and time API. We should not rely on three letter time zone abbreviations either. They are deprecated, not standardized and typically ambiguous. EST, for example, may mean Australian Eastern Standard Time or North American Eastern Standard Time. To increase confusion some will expect you to get Eastern Time with summer time (DST) in summer. With TimeZone you don’t. You get a time zone that uses standard time all year. The same is not true for AST, PST nor CST.

However you often cannot control what you get from an API. And if you’re unlucky enough to get an old-fashioned TimeZone object with ID EST, the above code shows you the conversion you need to get into the realm of java.time.

Upvotes: 3

deHaar
deHaar

Reputation: 18588

You could try to find a mapping for an abbreviation you got:

public static ZoneId getFromAbbreviation(String abbreviation) {
    return ZoneId.of(ZoneId.SHORT_IDS.get(abbreviation));
}

You could get the offsets like in this main:

public static void main(String[] args) {
    ZoneId istEquivalent = getFromAbbreviation("IST");
    ZoneId estEquivalent = getFromAbbreviation("EST");
    ZoneId jstEquivalent = getFromAbbreviation("JST");
    ZoneId betEquivalent = getFromAbbreviation("BET");
    ZonedDateTime istNow = ZonedDateTime.now(istEquivalent);
    ZonedDateTime estNow = ZonedDateTime.now(estEquivalent);
    ZonedDateTime jstNow = ZonedDateTime.now(jstEquivalent);
    ZonedDateTime betNow = ZonedDateTime.now(betEquivalent);
    System.out.println("IST --> " + istEquivalent + " with offset " + istNow.getOffset());
    System.out.println("EST --> " + estEquivalent + " with offset " + estNow.getOffset());
    System.out.println("JST --> " + jstEquivalent + " with offset " + jstNow.getOffset());
    System.out.println("BET --> " + betEquivalent + " with offset " + betNow.getOffset());
}

the output is

IST --> Asia/Kolkata with offset +05:30
EST --> -05:00 with offset -05:00
JST --> Asia/Tokyo with offset +09:00
BET --> America/Sao_Paulo with offset -03:00

As you can see, EST simply doesn't have a zone name, just an offset.

Upvotes: 3

Related Questions