---
name: "daylight"
section: "3"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/daylight"
---

# daylight(3)

initialize time conversion information

## NAME

**daylight**, **timezone**, **tzname**, **tzset** – initialize time conversion information

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<time.h\>**

*extern* *int* *daylight*; *extern* *long* *timezone*; *extern* *char* *\*tzname\[2\]*;

*void*\

**tzset**(*void*);

## DESCRIPTION

The **tzset**() function initializes time conversion information used by the library routine [localtime(3)](/localtime/3.md). The environment variable TZ specifies how this is done.

If TZ does not appear in the environment, the best available approximation to local wall clock time, as specified by the [tzfile(5)](/tzfile/5.md)-format file */etc/localtime* is used.

If TZ appears in the environment but its value is a null string, Coordinated Universal Time (UTC) is used (without leap second correction).

If TZ appears in the environment and its value begins with a colon (‘:’), the rest of its value is used as a pathname of a [tzfile(5)](/tzfile/5.md)-format file from which to read the time conversion information. If the first character of the pathname is a slash (‘/’) it is used as an absolute pathname; otherwise, it is used as a pathname relative to the system time conversion information directory.

If its value does not begin with a colon, it is first used as the pathname of a file (as described above) from which to read the time conversion information. If that file cannot be read, the value is then interpreted as a direct specification (the format is described below) of the time conversion information.

If the TZ environment variable does not specify a [tzfile(5)](/tzfile/5.md)-format file and cannot be interpreted as a direct specification, UTC is used.

After the first call to **tzset**, the *timezone* variable is set to the difference, in seconds, between Coordinated Universal Time (UTC) and the local time. The *daylight* variable is set to 0 if the local timezone is observing standard time. It is set to 1 if the local timezone ever observes an alternate time, such as summer time. The first element of the *tzname* array is the timezone name of standard time, while the second element is the name of the altnerative time zone.

## SPECIFICATION FORMAT

When TZ is used directly as a specification of the time conversion information, it must have the following syntax (spaces inserted for clarity):

*std* *offset*\[ *dst* \[*offset*\] \[, *rule*\]\]

Where:

- *std* and *dst*

  Three or more bytes that are the designation for the standard (*std*) or summer (*dst*) time zone. Only *std* is required; if *dst* is missing, then summer time does not apply in this locale. Upper and lowercase letters are explicitly allowed. Any characters except a leading colon (‘:’), digits, comma (‘,’), minus (‘-’), plus (‘+’), and ASCII NUL are allowed.

- *offset*

  Indicates the value one must add to the local time to arrive at Coordinated Universal Time. The *offset* has the form:

  *hh*\[:*mm* \[:*ss*\]\]

  The minutes (*mm*) and seconds (*ss*) are optional. The hour (*hh*) is required and may be a single digit. The *offset* following *std* is required. If no *offset* follows *dst*, summer time is assumed to be one hour ahead of standard time. One or more digits may be used; the value is always interpreted as a decimal number. The hour must be between zero and 24, and the minutes (and seconds) — if present — between zero and 59. If preceded by a (‘-’) the time zone shall be east of the Prime Meridian; otherwise it shall be west (which may be indicated by an optional preceding (‘+’)).

- *rule*

  Indicates when to change to and back from summer time. The *rule* has the form:

  *date/time,date/time*

  where the first *date* describes when the change from standard to summer time occurs and the second *date* describes when the change back happens. Each *time* field describes when, in current local time, the change to the other time is made.

  The format of *date* is one of the following:

  - **J** *n*

    The Julian day *n* (1  *n*\
      365\). Leap days are not counted; that is, in all years — including leap years — February 28 is day 59 and March 1 is day 60. It is impossible to explicitly refer to the occasional February 29.

  - *n*

    The zero-based Julian day (0  *n*\
      365 ) . Leap days are counted, and it is possible to refer to February 29.

  - **M** *m.n.d*

    The *d*'th day (0  *d*\
      6\) of week *n* of month *m* of the year (1  *n*\
      5\), (1  *m*\
      12\), where week 5 means“ the last *d* day in month *m*” which may occur in either the fourth or the fifth week). Week 1 is the first week in which the *d*'th day occurs. Day zero is Sunday.

    The *time* has the same format as *offset* except that no leading sign (‘-’) or (‘+’) is allowed. The default, if *time* is not given, is **02:00:00**.

    If no *rule* is present in the TZ specification, the rules specified by the [tzfile(5)](/tzfile/5.md)-format file *posixrules* in the system time conversion information directory are used, with the standard and summer time offsets from UTC replaced by those specified by the *offset* values in TZ.

For compatibility with System V Release 3.1, a semicolon (‘;’) may be used to separate the *rule* from the rest of the specification.

## FILES

- */etc/localtime*

  local time zone file

- */usr/share/zoneinfo*

  time zone directory

- */usr/share/zoneinfo/posixrules*

  rules for POSIX-style TZs

- */usr/share/zoneinfo/Etc/GMT*

  for UTC leap seconds

If the file */usr/share/zoneinfo/UTC* does not exist, UTC leap seconds are loaded from */usr/share/zoneinfo/posixrules*.

## SEE ALSO

[date(1)](/date/1.md), [gettimeofday(2)](/gettimeofday/2.md), [ctime(3)](/ctime/3.md), [getenv(3)](/getenv/3.md), [time(3)](/time/3.md), [tzfile(5)](/tzfile/5.md)

## HISTORY

The **tzset**() function first appeared in 4.4BSD.
