You can set a time zone for the duration of the query thusly:
Note the whitespace between the
TZ setting and the
date command. In Bourne-like and
rc-like shells, that sets the
TZ variable for the current command only. In other shells (
fish), you can always use the
env command instead:
env TZ=America/New_York date
On Linux systems. time zones are defined in files in the
/usr/share/zoneinfo directory. This structure is often referred to as the "Olson database" to honor its founding contributor.
The rules for each time zone are defined as text file lines which are then compiled into a binary file. The lines so compiled, define the zone name; a range of data and time during which the zone applies; an offset from UTC for the standard time; and the notation for defining how transition to-and-from daylight saving time occurs, if applicable.
For example, the directory "America" contains the requisite information for New York in the file
America/New_York as used, above.
Beware that the specification of a non-existent zone (file name) is silently ignored and UTC times are reported. For example, this reports an incorrect time:
TZ="America/New York" date ### WRONG ###
The Single UNIX Specification, version-3, known as SUSv3 or POSIX-2001, notes that for portability, the character string that identifies the time zone description should begin with a colon character. Thus, we can also write:
As an alternative method to the specification of time zones using a path to a description file, SUSv3 describes the POSIX model. In this format, a string is defined as:
std offset [dst[offset][,start-date[/time],end-date[/time]]]
std is the standard component name and
dst is the daylight saving one. Each name consists of three or more characters. The
offset is positive for time zones west of the prime meridian and negative for those east of the meridian. The offset is added to the local time to obtain UTC (formerly known as GMT). The
end time fields indicate when the standard/daylight transitions occur.
For example, in the Eastern United States, standard time is 5 hours earlier than UTC, and we can specify
EST5EDT in lieu of
America/New_York. These alternatives are not always recognized, however, especially for zones outside of the United States and are best avoided.
HP-UX (an SUSv3 compliant UNIX) uses textual rules in
/usr/lib/tztab and the POSIX names like EST5EDT, CST6CDT, MST7MDT, PST8PDT. The file includes all of the historical rules for each time zone, akin to the Olson database.
NOTE: You should be able to find all of the time zones by inspecting the following directory: