Does the JRE support posix TZ description rather than TZ name?

It is not a bug. It is a feature.

According to the javadoc for ZoneId, that POSIX syntax for specifying zones is not supported:

Time-zone IDs

The ID is unique within the system. There are three types of ID.

The simplest type of ID is that from ZoneOffset. This consists of 'Z' and IDs starting with '+' or '-'.

The next type of ID are offset-style IDs with some form of prefix, such as 'GMT+2' or 'UTC+01:00'. The recognised prefixes are 'UTC', 'GMT' and 'UT'. The offset is the suffix and will be normalized during creation. These IDs can be normalized to a ZoneOffset using normalized().

The third type of ID are region-based IDs. A region-based ID must be of two or more characters, and not start with 'UTC', 'GMT', 'UT' '+' or '-'. Region-based IDs are defined by configuration, see ZoneRulesProvider. The configuration focuses on providing the lookup from the ID to the underlying ZoneRules.

Time-zone rules are defined by governments and change frequently. There are a number of organizations, known here as groups, that monitor time-zone changes and collate them. The default group is the IANA Time Zone Database (TZDB). Other organizations include IATA (the airline industry body) and Microsoft.

Each group defines its own format for the region ID it provides. The TZDB group defines IDs such as 'Europe/London' or 'America/New_York'. TZDB IDs take precedence over other groups.

See also:

  • TZ Var to Java TimeZone?

If you wrote some code to parse that syntax, you should be able to use the data to construct a SimpleTimeZone (javadoc). Unfortunately, this forces to continue using the old ("mostly deprecated") Date class and friends.

The new (in Java 8) java.time.* classes don't appear to have an easy way to construct your own ZoneId from a set of rules. (Maybe it could be done by implementing your own ZoneRuleProvider (javadoc), but it looks complicated.)

So (IMO) you would be better off getting your OS to use the standard TZDB zone ids.

You commented:

On this particular system, neither "/etc/localtime" nor "/etc/timezone" exist.

If you are running Ubuntu Bionic, "/etc/localtime" should exist. It should be a symlink to a binary timezone file in the "/usr/share/zoneinfo" tree. See Or perhaps the problem is that the system has been deliberately configured to not know its local timezone.