I have several time zone strings in UTC format, such as "UTC+08:00", "UTC-05:00"
, the question is how can i convert these utc format strings to the java.util.TimeZone
in Java?
I have tried to convert by ZoneId
as follows, but it did not work:
ZoneId zoneId = ZoneId.of("UTC+08:00");
TimeZone timeZone = TimeZone.getTimeZone(zoneId);
I know TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
would work, but I do not know the mapping between "UTC+08:00"
and "Asia/Shanghai"
TimeZone
class (now legacy).ZoneOffset
and ZoneId
instead.Example:
ZoneOffset.of( "+08:00" )
java.time.ZoneId
, not TimeZone
The troublesome old date-time classes bundled with the earliest versions of Java are now legacy, supplanted by the java.time classes. Among these old legacy classes is TimeZone
, now supplanted by ZoneId
and ZoneOffset
.
An offset-from-UTC is a number of hours and minutes adjustment ahead of, or behind, UTC. This is represented by the ZoneOffset
class.
A time zone is a collection of offsets, the history of changes in the offset used by a particular region in determining their wall-clock time. This is represented by the ZoneId
class.
Using a time zone is always preferable to an offset as a zone has the offset plus so much more information. But your examples are only mere offsets. So use the ZoneOffset
to parse the strings after deleting the characters UTC
.
String input = "UTC+08:00".replace( "UTC" , "" ) ;
ZoneOffset offset = ZoneOffset.of( input ) ;
You cannot assume that a particular offset implies a particular time zone. Many zones may have used a particular offset in the past, present, or future. So you should not guess the zone.
Take, for example, the offset of +08:00
. That offset is currently used by several different time zones including Asia/Shangai
, Asia/Macao
, and Australia/Perth
.
If you are certain a particular zone was intended for a date-time value, apply it to get a ZonedDateTime
. But do not guess.
The Instant
class represents a moment on the timeline in UTC with a resolution of nanoseconds.
Instant instant = Instant.now() ;
ZoneId z = ZoneId.of( "Asia/Shanghai" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
If you do not know for certain the intended time zone and have only an offset, use the offset to get an OffsetDateTime
.
Instant instant = Instant.now() ;
ZoneOffset offset = ZoneOffset.of( "+08:00" ) ;
OffsetDateTime odt = instant.atOffset( offset ) ;
Best to avoid the old legacy class TimeZone
. But if you must use that class to work with old code not yet updated for the java.time classes, you can convert to/from a ZoneId
. Use the new conversion methods added to the old classes.
TimeZone myLegacyTimeZone = TimeZone.getTimeZone( myModernZoneId );
…and…
ZoneId z = myLegacyTimeZone.toZoneId() ;
Note that ZoneOffset
is a subclass of ZoneId
. Normally, we ignore that inheritance relationship. If you have only a mere offset such as +08:00
, use ZoneOffset
. If you have a full time zone such as Asia/Shanghai
, use ZoneId
. One exception to this rule is for this conversion to/from TimeZone
where only the superclass ZoneId
is recognized.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With