Question: 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.

Answer: 
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.
You could try to find a mapping for an abbreviation you got:

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

```

You could get the offsets like in this `main`:

```java
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

```none
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.