The purpose of this library is to offer an efficient support for time zone handling in the smallest package.
- Lightweight - nothing else is included. Thus serving well for other date & time libraries, but also for applications, which do not manipulate dates.
- Tiny - use packed time zone data, unpacked on demand. Compromise between loading time and being ready to use immediately.
- Reliable - generated from the fresh official time zone database version 2019a. Canonical time zone names, aliases, UTC offsets, and daylight-saving time changes.
- Customizable - named exports and functions divided to separate modules allow tree-shaking. Alternative time zone data can be supplied to reduce the library size.
The interface is built around two value types:
- UNIX timestamp for a date in UTC
- Time object for a date in an arbitrary time zone
The UNIX timestamp can be used to create a native Date
object instance, or it can be obtained from it by calling date.prototype.getTime
. It serves well as a common way how to represent a date in UTC. (The UNIX timestamp used in this library is the epoch time in milliseconds, not in seconds, to be compatible with the interface of the native Date
object.)
The UNIX timestamp is returned by the function getUnixTime
converting from an arbitrary time zone to UTC.
The time object is used to carry a date and information about an arbitrary time zone. The native Date
object cannot include the time zone information with the date.
{
year: 2018,
month: 9,
day: 25,
hours: 9,
minutes: 30,
seconds: 45,
milliseconds: 273,
epoch: 1537860645273,
dayOfWeek: 2,
zone: {
abbreviation: 'CEST',
offset: -120
}
}
The following properties are expected in an incomplete time object, usually set from the user input or by the function parseZonedTime
. The properties seconds
and milliseconds
are optional and will be considered as set to zero, if they are missing.
year
(Number) - full year number, as returned byDate.prototype.getFullYear
month
(Number) - month number starting from 1 (January); not as returned byDate.prototype.getMonth
, which returns a zero-based month indexday
(Number) - day of the month number starting from 1, as returned byDate.prototype.getDate
hours
(Number) - elapsed hours within a day starting from 0, as returned byDate.prototype.getHours
minutes
(Number) - elapsed minutes within n hour starting from 0, as returned byDate.prototype.getMinutes
seconds
(Number) - elapsed seconds within a minute starting from 0, as returned byDate.prototype.getSeconds
milliseconds
(Number) - elapsed milliseconds within a second starting from 0, as returned byDate.prototype.getMilliseconds
The following properties are added to a complete time object, usually set by conversion function getZonedTime
and setZonedTime
.
dayOfWeek
(Number) - day of the week number starting from 0 (Sunday), as returned byDate.prototype.getDay
epoch
(Number) - elapsed milliseconds from the UNIX epoch (UTC), as returned byDate.prototype.getTime
zone
(Object) - information about the time zone for the day stored in the time objectzone.abbreviation
(String) - time zone abbreviation for the day stored in the time objectzone.offset
(Number) - difference between UTC and the time zone of the time object in minutes, asDate.prototype.getTimezoneOffset
would return it, if it supported arbitrary time zones
The property zone.offset
has the opposite sign, than the time zone offset formatted in displayable strings. For example, its value for "CEST+02:00" is -120. If this offset is subtracted from the UNIX timestamp in UTC, you will get the epoch time in the given time zone. Similarly, if you have an epoch time in a specific time zone, adding the zone.offset
to it will convert it to UTC.