Added TZ_LINK_INTL option
This commit is contained in:
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -31,9 +31,6 @@
|
||||
[submodule "libadrenotools"]
|
||||
path = externals/libadrenotools
|
||||
url = https://github.com/bylaws/libadrenotools.git
|
||||
[submodule "tzdb_to_nx"]
|
||||
path = externals/nx_tzdb/tzdb_to_nx
|
||||
url = https://github.com/lat9nq/tzdb_to_nx.git
|
||||
[submodule "simpleini"]
|
||||
path = externals/simpleini
|
||||
url = https://github.com/brofield/simpleini.git
|
||||
|
||||
1
externals/nx_tzdb/tzdb_to_nx
vendored
1
externals/nx_tzdb/tzdb_to_nx
vendored
Submodule externals/nx_tzdb/tzdb_to_nx deleted from 9792969023
52
externals/nx_tzdb/tzdb_to_nx/.github/workflows/cmake.yml
vendored
Normal file
52
externals/nx_tzdb/tzdb_to_nx/.github/workflows/cmake.yml
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
name: CMake
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
|
||||
env:
|
||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||
BUILD_TYPE: Release
|
||||
|
||||
jobs:
|
||||
build:
|
||||
# The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac.
|
||||
# You can convert this to a matrix build if you need cross-platform coverage.
|
||||
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
|
||||
strategy:
|
||||
matrix:
|
||||
platform: [ubuntu-latest,macos-latest]
|
||||
runs-on: ${{ matrix.platform }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: 'true'
|
||||
|
||||
- name: Configure CMake
|
||||
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
|
||||
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
|
||||
run: |
|
||||
cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
|
||||
echo "nx_tzdb_dir=$(grep NX_TZDB_DIR ${{github.workspace}}/build/CMakeCache.txt | sed 's/.*=//g')" > "$GITHUB_ENV"
|
||||
|
||||
- name: Build
|
||||
# Build your program with the given configuration
|
||||
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --target x80e
|
||||
|
||||
- name: Package
|
||||
run: |
|
||||
mkdir -p ${{github.workspace}}/artifacts
|
||||
cp -Rv ${{ env.nx_tzdb_dir }} ${{github.workspace}}/artifacts/
|
||||
|
||||
- name: Version
|
||||
run: |
|
||||
echo "nx_version=$(cat ${{ env.nx_tzdb_dir }}/version.txt)" > "$GITHUB_ENV"
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ env.nx_version }}_${{ matrix.platform }}
|
||||
path: artifacts/nx
|
||||
2
externals/nx_tzdb/tzdb_to_nx/.gitignore
vendored
Normal file
2
externals/nx_tzdb/tzdb_to_nx/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
.cache
|
||||
build
|
||||
3
externals/nx_tzdb/tzdb_to_nx/.gitmodules
vendored
Normal file
3
externals/nx_tzdb/tzdb_to_nx/.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "externals/tz/tz"]
|
||||
path = externals/tz/tz
|
||||
url = https://github.com/eggert/tz.git
|
||||
21
externals/nx_tzdb/tzdb_to_nx/CMakeLists.txt
vendored
Normal file
21
externals/nx_tzdb/tzdb_to_nx/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
|
||||
project(tzdb2nx VERSION 1.0)
|
||||
|
||||
option(TZDB2NX_ZONEINFO_DIR "Specify a custom zoneinfo directory containing time zone data you wish to use" "")
|
||||
option(TZDB2NX_VERSION "Specify a custom zoneinfo version with the directory" "")
|
||||
|
||||
if (TZDB2NX_ZONEINFO_DIR AND NOT TZDB2NX_VERSION)
|
||||
message(FATAL_ERROR "TZDB2NX_ZONEINFO_DIR was specified but TZDB2NX_VERSION was left undefined.")
|
||||
endif()
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
|
||||
option(TZ_LINK_INTL "Enable if gettext needs to link with libintl" ${APPLE})
|
||||
|
||||
if (TZ_LINK_INTL)
|
||||
find_package(Intl REQUIRED)
|
||||
endif()
|
||||
|
||||
add_subdirectory(externals)
|
||||
add_subdirectory(src)
|
||||
10
externals/nx_tzdb/tzdb_to_nx/CMakeModules/list_directory.cmake
vendored
Normal file
10
externals/nx_tzdb/tzdb_to_nx/CMakeModules/list_directory.cmake
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
set(WITH_DIRECTORIES ${CMAKE_ARGV3})
|
||||
set(RECURSE ${CMAKE_ARGV4})
|
||||
|
||||
set(HOW_TO_GLOB "GLOB")
|
||||
if (RECURSE)
|
||||
set(HOW_TO_GLOB "GLOB_RECURSE")
|
||||
endif()
|
||||
|
||||
file(${HOW_TO_GLOB} FILE_LIST LIST_DIRECTORIES ${WITH_DIRECTORIES} RELATIVE ${CMAKE_SOURCE_DIR} "*")
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${FILE_LIST};")
|
||||
21
externals/nx_tzdb/tzdb_to_nx/LICENSE
vendored
Normal file
21
externals/nx_tzdb/tzdb_to_nx/LICENSE
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright © 2023 lat9nq
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the “Software”), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
22
externals/nx_tzdb/tzdb_to_nx/README.md
vendored
Normal file
22
externals/nx_tzdb/tzdb_to_nx/README.md
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
# tzdb_to_nx
|
||||
|
||||
This is a CMake/C++ project to convert RFC 8536 time zone data to the Nintendo Switch's format.
|
||||
This makes use a lot of Unix system calls as well as a bash script to convert the data, so it likely requires a bit of work to port to a non-POSIX platform, such as Windows.
|
||||
|
||||
Intended for use with the [yuzu Emulator](https://yuzu-emu.org/) project, but the project in the future likely won't ship synthesized Switch archives.
|
||||
That leaves this project in a place where it is not likely to be used, but will remain here as a reference.
|
||||
|
||||
- tzdb: CMake and bash script to build and convert time zone data from https://www.iana.org/time-zones into the Nintendo Switch's format.
|
||||
- tzdb2nx: C++ program that converts a single tzif file to the Nintendo's format.
|
||||
|
||||
The fine folks over at [SwitchBrew](https://switchbrew.org/wiki/PSC_services#ITimeZoneService) have left very helpful information on reading the data.
|
||||
Nintendo's file is simply the TZif version 2 data, with standard_indicators and ut_indicators data stripped out (and the necessary modifications needed in the header to make the data valid).
|
||||
This means the TZif 1 data is not present, so essentially we are left with the second half of each file.
|
||||
|
||||
Nintendo also does not seem to run the `zic` program on their output when they build the time zone data.
|
||||
I have left the relevant build command for that in src/tzdb/CMakeLists.txt commented out, but it isn't used here.
|
||||
This lets the project produce data identical to Nintendo's firmware for time zones, however this code does not produce the time zone data on US/Pacific-New or America/East-Saskatchewan (I may have bunged up the actual paths for these as this is 3 day old memory).
|
||||
|
||||
The CMake and C++ code in this repository is licensed under the MIT License.
|
||||
The source files date.c, newstrftime.3 and strftime.c from submodule eggert/tz use the BSD-3 clause license [[source]](https://github.com/eggert/tz/blob/main/LICENSE).
|
||||
The time zone data output from this repository, like those found in archives in the Release setcion, is in the public domain [[source]](https://github.com/eggert/tz/blob/main/LICENSE).
|
||||
1
externals/nx_tzdb/tzdb_to_nx/externals/CMakeLists.txt
vendored
Normal file
1
externals/nx_tzdb/tzdb_to_nx/externals/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1 @@
|
||||
add_subdirectory(tz)
|
||||
73
externals/nx_tzdb/tzdb_to_nx/externals/tz/CMakeLists.txt
vendored
Normal file
73
externals/nx_tzdb/tzdb_to_nx/externals/tz/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
set(TZ_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tz" CACHE PATH "Time zone source directory")
|
||||
set(TZ_DIR "${CMAKE_CURRENT_BINARY_DIR}/tz")
|
||||
set(TZ_TMP_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/tmpsrc")
|
||||
set(TZIF_LIST_FILE "${CMAKE_CURRENT_BINARY_DIR}/tzif_list.txt" CACHE PATH "List of zone info files")
|
||||
if (TZDB2NX_ZONEINFO_DIR)
|
||||
set(TZ_ZONEINFO_DIR "${TZDB2NX_ZONEINFO_DIR}" CACHE PATH "Time zone info data directory")
|
||||
else()
|
||||
set(TZ_ZONEINFO_DIR "${TZ_DIR}/usr/share/zoneinfo" CACHE PATH "Time zone info data directory")
|
||||
endif()
|
||||
|
||||
find_program(GNU_MAKE make)
|
||||
if (NOT GNU_MAKE)
|
||||
message(FATAL_ERROR "GNU make not found")
|
||||
endif()
|
||||
|
||||
if (NOT EXISTS "${TZ_DIR}" OR NOT EXISTS "${TZIF_LIST_FILE}")
|
||||
if (NOT TZDB2NX_ZONEINFO_DIR) # If a custom zoneinfo directory was specified
|
||||
# tz's makefile can only build in-tree, so copy the whole source tree to a
|
||||
# separate directory before building.
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -E copy_directory "${TZ_SOURCE_DIR}" "${TZ_TMP_SOURCE_DIR}"
|
||||
COMMAND_ERROR_IS_FATAL ANY
|
||||
)
|
||||
|
||||
if (TZ_LINK_INTL)
|
||||
set(TZ_MAKEFLAGS "LDLIBS=${Intl_LIBRARY}")
|
||||
else()
|
||||
set(TZ_MAKEFLAGS)
|
||||
endif()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
${GNU_MAKE} DESTDIR=${TZ_DIR} ${TZ_MAKEFLAGS} install
|
||||
WORKING_DIRECTORY
|
||||
${TZ_TMP_SOURCE_DIR}
|
||||
COMMAND_ERROR_IS_FATAL ANY
|
||||
)
|
||||
|
||||
unset(TZ_MAKEFLAGS)
|
||||
|
||||
# Step taken by Arch Linux packaging, but Nintendo apparently skips it
|
||||
# execute_process(
|
||||
# COMMAND
|
||||
# "${TZDB_LOCATION}/zic" -b fat -d ${TZDB_ZONEINFO} africa antarctica asia australasia europe northamerica southamerica etcetera backward factory
|
||||
# WORKING_DIRECTORY
|
||||
# "${TZDB_LOCATION}"
|
||||
# COMMAND_ERROR_IS_FATAL ANY
|
||||
# )
|
||||
endif()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -P ${PROJECT_SOURCE_DIR}/CMakeModules/list_directory.cmake false ON
|
||||
WORKING_DIRECTORY
|
||||
"${TZ_ZONEINFO_DIR}"
|
||||
OUTPUT_VARIABLE
|
||||
TZIF_SCAN
|
||||
)
|
||||
|
||||
set(TZIF_LIST "")
|
||||
foreach(CANDIDATE ${TZIF_SCAN})
|
||||
if (CANDIDATE STREQUAL "\n")
|
||||
continue()
|
||||
endif()
|
||||
set(TZIF_FILE "${TZ_ZONEINFO_DIR}/${CANDIDATE}")
|
||||
file(READ "${TZIF_FILE}" HEADER LIMIT 4)
|
||||
string(SUBSTRING "${HEADER}" 0 4 HEADER) # Remove trailing newline
|
||||
if (HEADER STREQUAL "TZif")
|
||||
file(APPEND "${TZIF_LIST_FILE}" "${TZIF_FILE}\n")
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
26
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/.gitignore
vendored
Normal file
26
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/.gitignore
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
# Files intentionally not tracked by Git.
|
||||
# This file is in the public domain.
|
||||
*.a
|
||||
*.asc
|
||||
*.diff
|
||||
*.i
|
||||
*.o
|
||||
*.orig
|
||||
*.patch
|
||||
*.rej
|
||||
*.tar
|
||||
*.tar.*
|
||||
*.txt
|
||||
*.tzs
|
||||
*.zi
|
||||
*~
|
||||
ChangeLog
|
||||
check_*
|
||||
date
|
||||
leapseconds
|
||||
tzselect
|
||||
version
|
||||
version.h
|
||||
yearistype
|
||||
zdump
|
||||
zic
|
||||
97
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/CONTRIBUTING
vendored
Normal file
97
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/CONTRIBUTING
vendored
Normal file
@@ -0,0 +1,97 @@
|
||||
# Contributing to the tz code and data
|
||||
|
||||
Please do not create issues or pull requests on GitHub, as the
|
||||
proper procedure for proposing and distributing patches is via
|
||||
email as described below.
|
||||
|
||||
The time zone database is by no means authoritative: governments
|
||||
change timekeeping rules erratically and sometimes with little
|
||||
warning, the data entries do not cover all of civil time before
|
||||
1970, and undoubtedly errors remain in the code and data. Feel
|
||||
free to fill gaps or fix mistakes, and please email improvements
|
||||
to <tz@iana.org> for use in the future. In your email, please give
|
||||
reliable sources that reviewers can check.
|
||||
|
||||
## Contributing technical changes
|
||||
|
||||
To email small changes, please run a POSIX shell command like
|
||||
'diff -u old/europe new/europe >myfix.patch', and attach
|
||||
'myfix.patch' to the email.
|
||||
|
||||
For more-elaborate or possibly-controversial changes,
|
||||
such as renaming, adding or removing zones, please read
|
||||
"Theory and pragmatics of the tz code and data"
|
||||
<https://www.iana.org/time-zones/repository/theory.html>.
|
||||
It is also good to browse the mailing list archives
|
||||
<https://mm.icann.org/pipermail/tz/> for examples of patches that tend
|
||||
to work well. Additions to data should contain commentary citing
|
||||
reliable sources as justification. Citations should use "https:" URLs
|
||||
if available.
|
||||
|
||||
For changes that fix sensitive security-related bugs, please see the
|
||||
distribution's 'SECURITY' file.
|
||||
|
||||
Please submit changes against either the latest release
|
||||
<https://www.iana.org/time-zones> or the main branch of the development
|
||||
repository. The latter is preferred.
|
||||
|
||||
## Sample Git workflow for developing contributions
|
||||
|
||||
If you use Git the following workflow may be helpful:
|
||||
|
||||
* Copy the development repository.
|
||||
|
||||
git clone https://github.com/eggert/tz.git
|
||||
cd tz
|
||||
|
||||
* Get current with the main branch.
|
||||
|
||||
git checkout main
|
||||
git pull
|
||||
|
||||
* Switch to a new branch for the changes. Choose a different
|
||||
branch name for each change set.
|
||||
|
||||
git checkout -b mybranch
|
||||
|
||||
* Sleuth by using 'git blame'. For example, when fixing data for
|
||||
Africa/Sao_Tome, if the command 'git blame africa' outputs a line
|
||||
'2951fa3b (Paul Eggert 2018-01-08 09:03:13 -0800 1068) Zone
|
||||
Africa/Sao_Tome 0:26:56 - LMT 1884', commit 2951fa3b should
|
||||
provide some justification for the 'Zone Africa/Sao_Tome' line.
|
||||
|
||||
* Edit source files. Include commentary that justifies the
|
||||
changes by citing reliable sources.
|
||||
|
||||
* Debug the changes, e.g.:
|
||||
|
||||
make check
|
||||
make install
|
||||
./zdump -v America/Los_Angeles
|
||||
|
||||
* For each separable change, commit it in the new branch, e.g.:
|
||||
|
||||
git add northamerica
|
||||
git commit
|
||||
|
||||
See recent 'git log' output for the commit-message style.
|
||||
|
||||
* Create patch files 0001-..., 0002-..., ...
|
||||
|
||||
git format-patch main
|
||||
|
||||
* After reviewing the patch files, send the patches to <tz@iana.org>
|
||||
for others to review.
|
||||
|
||||
git send-email main
|
||||
|
||||
For an archived example of such an email, see
|
||||
"[PROPOSED] Fix off-by-1 error for Jamaica and T&C before 1913"
|
||||
<https://mm.icann.org/pipermail/tz/2018-February/026122.html>.
|
||||
|
||||
* Start anew by getting current with the main branch again
|
||||
(the second step above).
|
||||
|
||||
-----
|
||||
|
||||
This file is in the public domain.
|
||||
5
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/LICENSE
vendored
Normal file
5
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/LICENSE
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
Unless specified below, all files in the tz code and data (including
|
||||
this LICENSE file) are in the public domain.
|
||||
|
||||
If the files date.c, newstrftime.3, and strftime.c are present, they
|
||||
contain material derived from BSD and use the BSD 3-clause license.
|
||||
1254
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/Makefile
vendored
Normal file
1254
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/Makefile
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5922
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/NEWS
vendored
Normal file
5922
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/NEWS
vendored
Normal file
File diff suppressed because it is too large
Load Diff
52
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/README
vendored
Normal file
52
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/README
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
README for the tz distribution
|
||||
|
||||
"Where do I set the hands of the clock?" -- Les Tremayne as The King
|
||||
"Oh that--you can set them any place you want." -- Frank Baxter as The Scientist
|
||||
(from the Bell System film "About Time")
|
||||
|
||||
The Time Zone Database (called tz, tzdb or zoneinfo) contains code and
|
||||
data that represent the history of local time for many representative
|
||||
locations around the globe. It is updated periodically to reflect
|
||||
changes made by political bodies to time zone boundaries, UTC offsets,
|
||||
and daylight-saving rules.
|
||||
|
||||
See <https://www.iana.org/time-zones/repository/tz-link.html> or the
|
||||
file tz-link.html for how to acquire the code and data. Once acquired,
|
||||
read the comments in the file 'Makefile' and make any changes needed
|
||||
to make things right for your system, especially if you are using some
|
||||
platform other than GNU/Linux. Then run the following commands,
|
||||
substituting your desired installation directory for "$HOME/tzdir":
|
||||
|
||||
make TOPDIR=$HOME/tzdir install
|
||||
$HOME/tzdir/usr/bin/zdump -v America/Los_Angeles
|
||||
|
||||
See the file tz-how-to.html for examples of how to read the data files.
|
||||
|
||||
This database of historical local time information has several goals:
|
||||
|
||||
* Provide a compendium of data about the history of civil time that
|
||||
is useful even if not 100% accurate.
|
||||
|
||||
* Give an idea of the variety of local time rules that have existed
|
||||
in the past and thus may be expected in the future.
|
||||
|
||||
* Test the generality of the local time rule description system.
|
||||
|
||||
The information in the time zone data files is by no means authoritative;
|
||||
fixes and enhancements are welcome. Please see the file CONTRIBUTING
|
||||
for details.
|
||||
|
||||
Thanks to these Time Zone Caballeros who've made major contributions to the
|
||||
time conversion package: Keith Bostic; Bob Devine; Paul Eggert; Robert Elz;
|
||||
Guy Harris; Mark Horton; John Mackin; and Bradley White. Thanks also to
|
||||
Michael Bloom, Art Neilson, Stephen Prince, John Sovereign, and Frank Wales
|
||||
for testing work, and to Gwillim Law for checking local mean time data.
|
||||
Thanks in particular to Arthur David Olson, the project's founder and first
|
||||
maintainer, to whom the time zone community owes the greatest debt of all.
|
||||
None of them are responsible for remaining errors.
|
||||
|
||||
-----
|
||||
|
||||
This file is in the public domain, so clarified as of 2009-05-17 by
|
||||
Arthur David Olson. The other files in this distribution are either
|
||||
public domain or BSD licensed; see the file LICENSE for details.
|
||||
15
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/SECURITY
vendored
Normal file
15
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/SECURITY
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
Please report any sensitive security-related bugs via email to the
|
||||
tzdb designated coordinators, currently Paul Eggert
|
||||
<eggert@cs.ucla.edu> and Tim Parenti <tim@timtimeonline.com>.
|
||||
Put "tzdb security" at the start of your email's subject line.
|
||||
We prefer communications to be in English.
|
||||
|
||||
You should receive a response within a week. If not, please follow up
|
||||
via email to make sure we received your original message.
|
||||
|
||||
If we confirm the bug, we plan to notify affected third-party services
|
||||
or software that we know about, prepare an advisory, commit fixes to
|
||||
the main development branch as quickly as is practical, and finally
|
||||
publish the advisory on tz@iana.org. As with all tzdb contributions,
|
||||
we give credit to security contributors unless they wish to remain
|
||||
anonymous.
|
||||
1436
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/africa
vendored
Normal file
1436
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/africa
vendored
Normal file
File diff suppressed because it is too large
Load Diff
309
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/antarctica
vendored
Normal file
309
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/antarctica
vendored
Normal file
@@ -0,0 +1,309 @@
|
||||
# tzdb data for Antarctica and environs
|
||||
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
|
||||
# From Paul Eggert (1999-11-15):
|
||||
# To keep things manageable, we list only locations occupied year-round; see
|
||||
# COMNAP - Stations and Bases
|
||||
# http://www.comnap.aq/comnap/comnap.nsf/P/Stations/
|
||||
# and
|
||||
# Summary of the Peri-Antarctic Islands (1998-07-23)
|
||||
# http://www.spri.cam.ac.uk/bob/periant.htm
|
||||
# for information.
|
||||
# Unless otherwise specified, we have no time zone information.
|
||||
|
||||
# FORMAT is '-00' and STDOFF is 0 for locations while uninhabited.
|
||||
|
||||
# Argentina - year-round bases
|
||||
# Belgrano II, Confin Coast, -770227-0343737, since 1972-02-05
|
||||
# Carlini, Potter Cove, King George Island, -6414-0602320, since 1982-01
|
||||
# Esperanza, Hope Bay, -6323-05659, since 1952-12-17
|
||||
# Marambio, -6414-05637, since 1969-10-29
|
||||
# Orcadas, Laurie I, -6016-04444, since 1904-02-22
|
||||
# San Martín, Barry I, -6808-06706, since 1951-03-21
|
||||
# (except 1960-03 / 1976-03-21)
|
||||
|
||||
# Australia - territories
|
||||
# Heard Island, McDonald Islands (uninhabited)
|
||||
# previously sealers and scientific personnel wintered
|
||||
# Margaret Turner reports
|
||||
# https://web.archive.org/web/20021204222245/http://www.dstc.qut.edu.au/DST/marg/daylight.html
|
||||
# (1999-09-30) that they're UT +05, with no DST;
|
||||
# presumably this is when they have visitors.
|
||||
#
|
||||
# year-round bases
|
||||
# Casey, Bailey Peninsula, -6617+11032, since 1969
|
||||
# Davis, Vestfold Hills, -6835+07759, since 1957-01-13
|
||||
# (except 1964-11 - 1969-02)
|
||||
# Mawson, Holme Bay, -6736+06253, since 1954-02-13
|
||||
|
||||
# From Steffen Thorsen (2009-03-11):
|
||||
# Three Australian stations in Antarctica have changed their time zone:
|
||||
# Casey moved from UTC+8 to UTC+11
|
||||
# Davis moved from UTC+7 to UTC+5
|
||||
# Mawson moved from UTC+6 to UTC+5
|
||||
# The changes occurred on 2009-10-18 at 02:00 (local times).
|
||||
#
|
||||
# Government source: (Australian Antarctic Division)
|
||||
# http://www.aad.gov.au/default.asp?casid=37079
|
||||
#
|
||||
# We have more background information here:
|
||||
# https://www.timeanddate.com/news/time/antarctica-new-times.html
|
||||
|
||||
# From Steffen Thorsen (2010-03-10):
|
||||
# We got these changes from the Australian Antarctic Division: ...
|
||||
#
|
||||
# - Casey station reverted to its normal time of UTC+8 on 5 March 2010.
|
||||
# The change to UTC+11 is being considered as a regular summer thing but
|
||||
# has not been decided yet.
|
||||
#
|
||||
# - Davis station will revert to its normal time of UTC+7 at 10 March 2010
|
||||
# 20:00 UTC.
|
||||
#
|
||||
# - Mawson station stays on UTC+5.
|
||||
#
|
||||
# Background:
|
||||
# https://www.timeanddate.com/news/time/antartica-time-changes-2010.html
|
||||
|
||||
# From Steffen Thorsen (2016-10-28):
|
||||
# Australian Antarctica Division informed us that Casey changed time
|
||||
# zone to UTC+11 in "the morning of 22nd October 2016".
|
||||
|
||||
# From Steffen Thorsen (2020-10-02, as corrected):
|
||||
# Based on information we have received from the Australian Antarctic
|
||||
# Division, Casey station and Macquarie Island station will move to Tasmanian
|
||||
# daylight savings time on Sunday 4 October. This will take effect from 0001
|
||||
# hrs on Sunday 4 October 2020 and will mean Casey and Macquarie Island will
|
||||
# be on the same time zone as Hobart. Some past dates too for this 3 hour
|
||||
# time change back and forth between UTC+8 and UTC+11 for Casey:
|
||||
# - 2018 Oct 7 4:00 - 2019 Mar 17 3:00 - 2019 Oct 4 3:00 - 2020 Mar 8 3:00
|
||||
# and now - 2020 Oct 4 0:01
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Antarctica/Casey 0 - -00 1969
|
||||
8:00 - +08 2009 Oct 18 2:00
|
||||
11:00 - +11 2010 Mar 5 2:00
|
||||
8:00 - +08 2011 Oct 28 2:00
|
||||
11:00 - +11 2012 Feb 21 17:00u
|
||||
8:00 - +08 2016 Oct 22
|
||||
11:00 - +11 2018 Mar 11 4:00
|
||||
8:00 - +08 2018 Oct 7 4:00
|
||||
11:00 - +11 2019 Mar 17 3:00
|
||||
8:00 - +08 2019 Oct 4 3:00
|
||||
11:00 - +11 2020 Mar 8 3:00
|
||||
8:00 - +08 2020 Oct 4 0:01
|
||||
11:00 - +11
|
||||
Zone Antarctica/Davis 0 - -00 1957 Jan 13
|
||||
7:00 - +07 1964 Nov
|
||||
0 - -00 1969 Feb
|
||||
7:00 - +07 2009 Oct 18 2:00
|
||||
5:00 - +05 2010 Mar 10 20:00u
|
||||
7:00 - +07 2011 Oct 28 2:00
|
||||
5:00 - +05 2012 Feb 21 20:00u
|
||||
7:00 - +07
|
||||
Zone Antarctica/Mawson 0 - -00 1954 Feb 13
|
||||
6:00 - +06 2009 Oct 18 2:00
|
||||
5:00 - +05
|
||||
# References:
|
||||
# Casey Weather (1998-02-26)
|
||||
# http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html
|
||||
# Davis Station, Antarctica (1998-02-26)
|
||||
# http://www.antdiv.gov.au/aad/exop/sfo/davis/video.html
|
||||
# Mawson Station, Antarctica (1998-02-25)
|
||||
# http://www.antdiv.gov.au/aad/exop/sfo/mawson/video.html
|
||||
|
||||
# Belgium - year-round base
|
||||
# Princess Elisabeth, Queen Maud Land, -713412+0231200, since 2007
|
||||
|
||||
# Brazil - year-round base
|
||||
# Ferraz, King George Island, -6205+05824, since 1983/4
|
||||
|
||||
# Bulgaria - year-round base
|
||||
# St. Kliment Ohridski, Livingston Island, -623829-0602153, since 1988
|
||||
|
||||
# Chile - year-round bases and towns
|
||||
# Escudero, South Shetland Is, -621157-0585735, since 1994
|
||||
# Frei Montalva, King George Island, -6214-05848, since 1969-03-07
|
||||
# O'Higgins, Antarctic Peninsula, -6319-05704, since 1948-02
|
||||
# Prat, -6230-05941
|
||||
# Villa Las Estrellas (a town), around the Frei base, since 1984-04-09
|
||||
# These locations employ Region of Magallanes time; use
|
||||
# TZ='America/Punta_Arenas'.
|
||||
|
||||
# China - year-round bases
|
||||
# Great Wall, King George Island, -6213-05858, since 1985-02-20
|
||||
# Zhongshan, Larsemann Hills, Prydz Bay, -6922+07623, since 1989-02-26
|
||||
|
||||
# France - year-round bases (also see "France & Italy")
|
||||
#
|
||||
# From Antoine Leca (1997-01-20):
|
||||
# Time data entries are from Nicole Pailleau at the IFRTP
|
||||
# (French Institute for Polar Research and Technology).
|
||||
# She confirms that French Southern Territories and Terre Adélie bases
|
||||
# don't observe daylight saving time, even if Terre Adélie supplies came
|
||||
# from Tasmania.
|
||||
#
|
||||
# French Southern Territories with year-round inhabitants
|
||||
#
|
||||
# Alfred Faure, Possession Island, Crozet Islands, -462551+0515152, since 1964;
|
||||
# sealing & whaling stations operated variously 1802/1911+;
|
||||
# see Asia/Dubai.
|
||||
#
|
||||
# Martin-de-Viviès, Amsterdam Island, -374105+0773155, since 1950
|
||||
# Port-aux-Français, Kerguelen Islands, -492110+0701303, since 1951;
|
||||
# whaling & sealing station operated 1908/1914, 1920/1929, and 1951/1956
|
||||
#
|
||||
# St Paul Island - near Amsterdam, uninhabited
|
||||
# fishing stations operated variously 1819/1931
|
||||
#
|
||||
# Kerguelen - see Indian/Maldives.
|
||||
#
|
||||
# year-round base in the main continent
|
||||
# Dumont d'Urville - see Pacific/Port_Moresby.
|
||||
|
||||
# France & Italy - year-round base
|
||||
# Concordia, -750600+1232000, since 2005
|
||||
|
||||
# Germany - year-round base
|
||||
# Neumayer III, -704080-0081602, since 2009
|
||||
|
||||
# India - year-round bases
|
||||
# Bharati, -692428+0761114, since 2012
|
||||
# Maitri, -704558+0114356, since 1989
|
||||
|
||||
# Italy - year-round base (also see "France & Italy")
|
||||
# Zuchelli, Terra Nova Bay, -744140+1640647, since 1986
|
||||
|
||||
# Japan - year-round bases
|
||||
# See Asia/Riyadh.
|
||||
|
||||
# S Korea - year-round base
|
||||
# Jang Bogo, Terra Nova Bay, -743700+1641205 since 2014
|
||||
# King Sejong, King George Island, -6213-05847, since 1988
|
||||
|
||||
# New Zealand - claims
|
||||
# Balleny Islands (never inhabited)
|
||||
# Scott Island (never inhabited)
|
||||
#
|
||||
# year-round base
|
||||
# Scott Base, Ross Island, since 1957-01.
|
||||
# See Pacific/Auckland.
|
||||
|
||||
# Norway - territories
|
||||
# Bouvet (never inhabited)
|
||||
#
|
||||
# claims
|
||||
# Peter I Island (never inhabited)
|
||||
#
|
||||
# year-round base
|
||||
# Troll, Queen Maud Land, -720041+0023206, since 2005-02-12
|
||||
#
|
||||
# From Paul-Inge Flakstad (2014-03-10):
|
||||
# I recently had a long dialog about this with the developer of timegenie.com.
|
||||
# In the absence of specific dates, he decided to choose some likely ones:
|
||||
# GMT +1 - From March 1 to the last Sunday in March
|
||||
# GMT +2 - From the last Sunday in March until the last Sunday in October
|
||||
# GMT +1 - From the last Sunday in October until November 7
|
||||
# GMT +0 - From November 7 until March 1
|
||||
# The dates for switching to and from UTC+0 will probably not be absolutely
|
||||
# correct, but they should be quite close to the actual dates.
|
||||
#
|
||||
# From Paul Eggert (2014-03-21):
|
||||
# The CET-switching Troll rules require zic from tz 2014b or later, so as
|
||||
# suggested by Bengt-Inge Larsson comment them out for now, and approximate
|
||||
# with only UTC and CEST. Uncomment them when 2014b is more prevalent.
|
||||
#
|
||||
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
|
||||
#Rule Troll 2005 max - Mar 1 1:00u 1:00 +01
|
||||
Rule Troll 2005 max - Mar lastSun 1:00u 2:00 +02
|
||||
#Rule Troll 2005 max - Oct lastSun 1:00u 1:00 +01
|
||||
#Rule Troll 2004 max - Nov 7 1:00u 0:00 +00
|
||||
# Remove the following line when uncommenting the above '#Rule' lines.
|
||||
Rule Troll 2004 max - Oct lastSun 1:00u 0:00 +00
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Antarctica/Troll 0 - -00 2005 Feb 12
|
||||
0:00 Troll %s
|
||||
|
||||
# Poland - year-round base
|
||||
# Arctowski, King George Island, -620945-0582745, since 1977
|
||||
|
||||
# Romania - year-bound base
|
||||
# Law-Racoviță, Larsemann Hills, -692319+0762251, since 1986
|
||||
|
||||
# Russia - year-round bases
|
||||
# Bellingshausen, King George Island, -621159-0585337, since 1968-02-22
|
||||
# Mirny, Davis coast, -6633+09301, since 1956-02
|
||||
# Molodezhnaya, Alasheyev Bay, -6740+04551,
|
||||
# year-round from 1962-02 to 1999-07-01
|
||||
# Novolazarevskaya, Queen Maud Land, -7046+01150,
|
||||
# year-round from 1960/61 to 1992
|
||||
|
||||
# Vostok, since 1957-12-16, temporarily closed 1994-02/1994-11
|
||||
# See Asia/Urumqi.
|
||||
|
||||
# S Africa - year-round bases
|
||||
# Marion Island, -4653+03752
|
||||
# SANAE IV, Vesleskarvet, Queen Maud Land, -714022-0025026, since 1997
|
||||
|
||||
# Ukraine - year-round base
|
||||
# Vernadsky (formerly Faraday), Galindez Island, -651445-0641526, since 1954
|
||||
|
||||
# United Kingdom
|
||||
#
|
||||
# British Antarctic Territories (BAT) claims
|
||||
# South Orkney Islands
|
||||
# scientific station from 1903
|
||||
# whaling station at Signy I 1920/1926
|
||||
# South Shetland Islands
|
||||
#
|
||||
# year-round bases
|
||||
# Bird Island, South Georgia, -5400-03803, since 1983
|
||||
# Deception Island, -6259-06034, whaling station 1912/1931,
|
||||
# scientific station 1943/1967,
|
||||
# previously sealers and a scientific expedition wintered by accident,
|
||||
# and a garrison was deployed briefly
|
||||
# Halley, Coates Land, -7535-02604, since 1956-01-06
|
||||
# Halley is on a moving ice shelf and is periodically relocated
|
||||
# so that it is never more than 10km from its nominal location.
|
||||
# Rothera, Adelaide Island, -6734-6808, since 1976-12-01
|
||||
#
|
||||
# From Paul Eggert (2002-10-22)
|
||||
# <http://webexhibits.org/daylightsaving/g.html> says Rothera is -03 all year.
|
||||
#
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Antarctica/Rothera 0 - -00 1976 Dec 1
|
||||
-3:00 - -03
|
||||
|
||||
# Uruguay - year round base
|
||||
# Artigas, King George Island, -621104-0585107
|
||||
|
||||
# USA - year-round bases
|
||||
#
|
||||
# Palmer, Anvers Island, since 1965 (moved 2 miles in 1968)
|
||||
# See 'southamerica' for Antarctica/Palmer, since it uses South American DST.
|
||||
#
|
||||
# McMurdo Station, Ross Island, since 1955-12
|
||||
# Amundsen-Scott South Pole Station, continuously occupied since 1956-11-20
|
||||
#
|
||||
# From Chris Carrier (1996-06-27):
|
||||
# Siple, the first commander of the South Pole station,
|
||||
# stated that he would have liked to have kept GMT at the station,
|
||||
# but that he found it more convenient to keep GMT+12
|
||||
# as supplies for the station were coming from McMurdo Sound,
|
||||
# which was on GMT+12 because New Zealand was on GMT+12 all year
|
||||
# at that time (1957). (Source: Siple's book 90 Degrees South.)
|
||||
#
|
||||
# From Susan Smith
|
||||
# http://www.cybertours.com/whs/pole10.html
|
||||
# (1995-11-13 16:24:56 +1300, no longer available):
|
||||
# We use the same time as McMurdo does.
|
||||
# And they use the same time as Christchurch, NZ does....
|
||||
# One last quirk about South Pole time.
|
||||
# All the electric clocks are usually wrong.
|
||||
# Something about the generators running at 60.1hertz or something
|
||||
# makes all of the clocks run fast. So every couple of days,
|
||||
# we have to go around and set them back 5 minutes or so.
|
||||
# Maybe if we let them run fast all of the time, we'd get to leave here sooner!!
|
||||
#
|
||||
# See Pacific/Auckland.
|
||||
131
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/asctime.c
vendored
Normal file
131
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/asctime.c
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
/* asctime and asctime_r a la POSIX and ISO C, except pad years before 1000. */
|
||||
|
||||
/*
|
||||
** This file is in the public domain, so clarified as of
|
||||
** 1996-06-05 by Arthur David Olson.
|
||||
*/
|
||||
|
||||
/*
|
||||
** Avoid the temptation to punt entirely to strftime;
|
||||
** the output of strftime is supposed to be locale specific
|
||||
** whereas the output of asctime is supposed to be constant.
|
||||
*/
|
||||
|
||||
/*LINTLIBRARY*/
|
||||
|
||||
#include "private.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/*
|
||||
** All years associated with 32-bit time_t values are exactly four digits long;
|
||||
** some years associated with 64-bit time_t values are not.
|
||||
** Vintage programs are coded for years that are always four digits long
|
||||
** and may assume that the newline always lands in the same place.
|
||||
** For years that are less than four digits, we pad the output with
|
||||
** leading zeroes to get the newline in the traditional place.
|
||||
** The -4 ensures that we get four characters of output even if
|
||||
** we call a strftime variant that produces fewer characters for some years.
|
||||
** The ISO C and POSIX standards prohibit padding the year,
|
||||
** but many implementations pad anyway; most likely the standards are buggy.
|
||||
*/
|
||||
static char const ASCTIME_FMT[] = "%s %s%3d %.2d:%.2d:%.2d %-4s\n";
|
||||
/*
|
||||
** For years that are more than four digits we put extra spaces before the year
|
||||
** so that code trying to overwrite the newline won't end up overwriting
|
||||
** a digit within a year and truncating the year (operating on the assumption
|
||||
** that no output is better than wrong output).
|
||||
*/
|
||||
static char const ASCTIME_FMT_B[] = "%s %s%3d %.2d:%.2d:%.2d %s\n";
|
||||
|
||||
enum { STD_ASCTIME_BUF_SIZE = 26 };
|
||||
/*
|
||||
** Big enough for something such as
|
||||
** ??? ???-2147483648 -2147483648:-2147483648:-2147483648 -2147483648\n
|
||||
** (two three-character abbreviations, five strings denoting integers,
|
||||
** seven explicit spaces, two explicit colons, a newline,
|
||||
** and a trailing NUL byte).
|
||||
** The values above are for systems where an int is 32 bits and are provided
|
||||
** as an example; the size expression below is a bound for the system at
|
||||
** hand.
|
||||
*/
|
||||
static char buf_asctime[2*3 + 5*INT_STRLEN_MAXIMUM(int) + 7 + 2 + 1 + 1];
|
||||
|
||||
/* A similar buffer for ctime.
|
||||
C89 requires that they be the same buffer.
|
||||
This requirement was removed in C99, so support it only if requested,
|
||||
as support is more likely to lead to bugs in badly-written programs. */
|
||||
#if SUPPORT_C89
|
||||
# define buf_ctime buf_asctime
|
||||
#else
|
||||
static char buf_ctime[sizeof buf_asctime];
|
||||
#endif
|
||||
|
||||
char *
|
||||
asctime_r(register const struct tm *timeptr, char *buf)
|
||||
{
|
||||
static const char wday_name[][4] = {
|
||||
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
||||
};
|
||||
static const char mon_name[][4] = {
|
||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
||||
};
|
||||
register const char * wn;
|
||||
register const char * mn;
|
||||
char year[INT_STRLEN_MAXIMUM(int) + 2];
|
||||
char result[sizeof buf_asctime];
|
||||
|
||||
if (timeptr == NULL) {
|
||||
errno = EINVAL;
|
||||
return strcpy(buf, "??? ??? ?? ??:??:?? ????\n");
|
||||
}
|
||||
if (timeptr->tm_wday < 0 || timeptr->tm_wday >= DAYSPERWEEK)
|
||||
wn = "???";
|
||||
else wn = wday_name[timeptr->tm_wday];
|
||||
if (timeptr->tm_mon < 0 || timeptr->tm_mon >= MONSPERYEAR)
|
||||
mn = "???";
|
||||
else mn = mon_name[timeptr->tm_mon];
|
||||
/*
|
||||
** Use strftime's %Y to generate the year, to avoid overflow problems
|
||||
** when computing timeptr->tm_year + TM_YEAR_BASE.
|
||||
** Assume that strftime is unaffected by other out-of-range members
|
||||
** (e.g., timeptr->tm_mday) when processing "%Y".
|
||||
*/
|
||||
strftime(year, sizeof year, "%Y", timeptr);
|
||||
/*
|
||||
** We avoid using snprintf since it's not available on all systems.
|
||||
*/
|
||||
sprintf(result,
|
||||
((strlen(year) <= 4) ? ASCTIME_FMT : ASCTIME_FMT_B),
|
||||
wn, mn,
|
||||
timeptr->tm_mday, timeptr->tm_hour,
|
||||
timeptr->tm_min, timeptr->tm_sec,
|
||||
year);
|
||||
if (strlen(result) < STD_ASCTIME_BUF_SIZE
|
||||
|| buf == buf_ctime || buf == buf_asctime)
|
||||
return strcpy(buf, result);
|
||||
else {
|
||||
errno = EOVERFLOW;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
asctime(register const struct tm *timeptr)
|
||||
{
|
||||
return asctime_r(timeptr, buf_asctime);
|
||||
}
|
||||
|
||||
char *
|
||||
ctime_r(const time_t *timep, char *buf)
|
||||
{
|
||||
struct tm mytm;
|
||||
struct tm *tmp = localtime_r(timep, &mytm);
|
||||
return tmp ? asctime_r(tmp, buf) : NULL;
|
||||
}
|
||||
|
||||
char *
|
||||
ctime(const time_t *timep)
|
||||
{
|
||||
return ctime_r(timep, buf_ctime);
|
||||
}
|
||||
3955
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/asia
vendored
Normal file
3955
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/asia
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2222
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/australasia
vendored
Normal file
2222
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/australasia
vendored
Normal file
File diff suppressed because it is too large
Load Diff
318
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/backward
vendored
Normal file
318
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/backward
vendored
Normal file
@@ -0,0 +1,318 @@
|
||||
# tzdb links for backward compatibility
|
||||
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
|
||||
# This file provides links from old or merged timezone names to current ones.
|
||||
# Many names changed in 1993 and in 1995, and many merged names moved here
|
||||
# in the period from 2013 through 2022. Several of these names are
|
||||
# also present in the file 'backzone', which has data important only
|
||||
# for pre-1970 timestamps and so is out of scope for tzdb proper.
|
||||
|
||||
# Although this file is optional and tzdb will work if you omit it by
|
||||
# building with 'make BACKWARD=', in practice downstream users
|
||||
# typically use this file for backward compatibility.
|
||||
|
||||
# This file is divided into sections, one for each major reason for a
|
||||
# backward compatibility link. Each section is sorted by link name.
|
||||
|
||||
# A "#= TARGET1" comment labels each link inserted only because some
|
||||
# .zi parsers (including tzcode through 2022e) mishandle links to links.
|
||||
# The comment says what the target would be if these parsers were fixed
|
||||
# so that data could contain links to links. For example, the line
|
||||
# "Link Australia/Sydney Australia/ACT #= Australia/Canberra" would be
|
||||
# "Link Australia/Canberra Australia/ACT" were it not that data lines
|
||||
# refrain from linking to links like Australia/Canberra, which means
|
||||
# the Australia/ACT line links instead to Australia/Sydney,
|
||||
# Australia/Canberra's target.
|
||||
|
||||
|
||||
# Pre-1993 naming conventions
|
||||
|
||||
# Link TARGET LINK-NAME #= TARGET1
|
||||
Link Australia/Sydney Australia/ACT #= Australia/Canberra
|
||||
Link Australia/Lord_Howe Australia/LHI
|
||||
Link Australia/Sydney Australia/NSW
|
||||
Link Australia/Darwin Australia/North
|
||||
Link Australia/Brisbane Australia/Queensland
|
||||
Link Australia/Adelaide Australia/South
|
||||
Link Australia/Hobart Australia/Tasmania
|
||||
Link Australia/Melbourne Australia/Victoria
|
||||
Link Australia/Perth Australia/West
|
||||
Link Australia/Broken_Hill Australia/Yancowinna
|
||||
Link America/Rio_Branco Brazil/Acre #= America/Porto_Acre
|
||||
Link America/Noronha Brazil/DeNoronha
|
||||
Link America/Sao_Paulo Brazil/East
|
||||
Link America/Manaus Brazil/West
|
||||
Link America/Halifax Canada/Atlantic
|
||||
Link America/Winnipeg Canada/Central
|
||||
# This line is commented out, as the name exceeded the 14-character limit
|
||||
# and was an unused misnomer.
|
||||
#Link America/Regina Canada/East-Saskatchewan
|
||||
Link America/Toronto Canada/Eastern
|
||||
Link America/Edmonton Canada/Mountain
|
||||
Link America/St_Johns Canada/Newfoundland
|
||||
Link America/Vancouver Canada/Pacific
|
||||
Link America/Regina Canada/Saskatchewan
|
||||
Link America/Whitehorse Canada/Yukon
|
||||
Link America/Santiago Chile/Continental
|
||||
Link Pacific/Easter Chile/EasterIsland
|
||||
Link America/Havana Cuba
|
||||
Link Africa/Cairo Egypt
|
||||
Link Europe/Dublin Eire
|
||||
# Vanguard section, for most .zi parsers.
|
||||
#Link GMT Etc/GMT
|
||||
#Link GMT Etc/GMT+0
|
||||
#Link GMT Etc/GMT-0
|
||||
#Link GMT Etc/GMT0
|
||||
#Link GMT Etc/Greenwich
|
||||
# Rearguard section, for TZUpdater 2.3.2 and earlier.
|
||||
Link Etc/GMT Etc/GMT+0
|
||||
Link Etc/GMT Etc/GMT-0
|
||||
Link Etc/GMT Etc/GMT0
|
||||
Link Etc/GMT Etc/Greenwich
|
||||
# End of rearguard section.
|
||||
Link Etc/UTC Etc/UCT
|
||||
Link Etc/UTC Etc/Universal
|
||||
Link Etc/UTC Etc/Zulu
|
||||
Link Europe/London GB
|
||||
Link Europe/London GB-Eire
|
||||
# Vanguard section, for most .zi parsers.
|
||||
#Link GMT GMT+0
|
||||
#Link GMT GMT-0
|
||||
#Link GMT GMT0
|
||||
#Link GMT Greenwich
|
||||
# Rearguard section, for TZUpdater 2.3.2 and earlier.
|
||||
Link Etc/GMT GMT+0
|
||||
Link Etc/GMT GMT-0
|
||||
Link Etc/GMT GMT0
|
||||
Link Etc/GMT Greenwich
|
||||
# End of rearguard section.
|
||||
Link Asia/Hong_Kong Hongkong
|
||||
Link Africa/Abidjan Iceland #= Atlantic/Reykjavik
|
||||
Link Asia/Tehran Iran
|
||||
Link Asia/Jerusalem Israel
|
||||
Link America/Jamaica Jamaica
|
||||
Link Asia/Tokyo Japan
|
||||
Link Pacific/Kwajalein Kwajalein
|
||||
Link Africa/Tripoli Libya
|
||||
Link America/Tijuana Mexico/BajaNorte
|
||||
Link America/Mazatlan Mexico/BajaSur
|
||||
Link America/Mexico_City Mexico/General
|
||||
Link Pacific/Auckland NZ
|
||||
Link Pacific/Chatham NZ-CHAT
|
||||
Link America/Denver Navajo #= America/Shiprock
|
||||
Link Asia/Shanghai PRC
|
||||
Link Europe/Warsaw Poland
|
||||
Link Europe/Lisbon Portugal
|
||||
Link Asia/Taipei ROC
|
||||
Link Asia/Seoul ROK
|
||||
Link Asia/Singapore Singapore
|
||||
Link Europe/Istanbul Turkey
|
||||
Link Etc/UTC UCT
|
||||
Link America/Anchorage US/Alaska
|
||||
Link America/Adak US/Aleutian
|
||||
Link America/Phoenix US/Arizona
|
||||
Link America/Chicago US/Central
|
||||
Link America/Indiana/Indianapolis US/East-Indiana
|
||||
Link America/New_York US/Eastern
|
||||
Link Pacific/Honolulu US/Hawaii
|
||||
Link America/Indiana/Knox US/Indiana-Starke
|
||||
Link America/Detroit US/Michigan
|
||||
Link America/Denver US/Mountain
|
||||
Link America/Los_Angeles US/Pacific
|
||||
Link Pacific/Pago_Pago US/Samoa
|
||||
Link Etc/UTC UTC
|
||||
Link Etc/UTC Universal
|
||||
Link Europe/Moscow W-SU
|
||||
Link Etc/UTC Zulu
|
||||
|
||||
|
||||
# Two-part names that were renamed mostly to three-part names in 1995
|
||||
|
||||
# Link TARGET LINK-NAME #= TARGET1
|
||||
Link America/Argentina/Buenos_Aires America/Buenos_Aires
|
||||
Link America/Argentina/Catamarca America/Catamarca
|
||||
Link America/Argentina/Cordoba America/Cordoba
|
||||
Link America/Indiana/Indianapolis America/Indianapolis
|
||||
Link America/Argentina/Jujuy America/Jujuy
|
||||
Link America/Indiana/Knox America/Knox_IN
|
||||
Link America/Kentucky/Louisville America/Louisville
|
||||
Link America/Argentina/Mendoza America/Mendoza
|
||||
Link America/Puerto_Rico America/Virgin #= America/St_Thomas
|
||||
Link Pacific/Pago_Pago Pacific/Samoa
|
||||
|
||||
|
||||
# Pre-2013 practice, which typically had a Zone per zone.tab line
|
||||
|
||||
# Link TARGET LINK-NAME
|
||||
Link Africa/Abidjan Africa/Accra
|
||||
Link Africa/Nairobi Africa/Addis_Ababa
|
||||
Link Africa/Nairobi Africa/Asmara
|
||||
Link Africa/Abidjan Africa/Bamako
|
||||
Link Africa/Lagos Africa/Bangui
|
||||
Link Africa/Abidjan Africa/Banjul
|
||||
Link Africa/Maputo Africa/Blantyre
|
||||
Link Africa/Lagos Africa/Brazzaville
|
||||
Link Africa/Maputo Africa/Bujumbura
|
||||
Link Africa/Abidjan Africa/Conakry
|
||||
Link Africa/Abidjan Africa/Dakar
|
||||
Link Africa/Nairobi Africa/Dar_es_Salaam
|
||||
Link Africa/Nairobi Africa/Djibouti
|
||||
Link Africa/Lagos Africa/Douala
|
||||
Link Africa/Abidjan Africa/Freetown
|
||||
Link Africa/Maputo Africa/Gaborone
|
||||
Link Africa/Maputo Africa/Harare
|
||||
Link Africa/Nairobi Africa/Kampala
|
||||
Link Africa/Maputo Africa/Kigali
|
||||
Link Africa/Lagos Africa/Kinshasa
|
||||
Link Africa/Lagos Africa/Libreville
|
||||
Link Africa/Abidjan Africa/Lome
|
||||
Link Africa/Lagos Africa/Luanda
|
||||
Link Africa/Maputo Africa/Lubumbashi
|
||||
Link Africa/Maputo Africa/Lusaka
|
||||
Link Africa/Lagos Africa/Malabo
|
||||
Link Africa/Johannesburg Africa/Maseru
|
||||
Link Africa/Johannesburg Africa/Mbabane
|
||||
Link Africa/Nairobi Africa/Mogadishu
|
||||
Link Africa/Lagos Africa/Niamey
|
||||
Link Africa/Abidjan Africa/Nouakchott
|
||||
Link Africa/Abidjan Africa/Ouagadougou
|
||||
Link Africa/Lagos Africa/Porto-Novo
|
||||
Link America/Puerto_Rico America/Anguilla
|
||||
Link America/Puerto_Rico America/Antigua
|
||||
Link America/Puerto_Rico America/Aruba
|
||||
Link America/Panama America/Atikokan
|
||||
Link America/Puerto_Rico America/Blanc-Sablon
|
||||
Link America/Panama America/Cayman
|
||||
Link America/Phoenix America/Creston
|
||||
Link America/Puerto_Rico America/Curacao
|
||||
Link America/Puerto_Rico America/Dominica
|
||||
Link America/Puerto_Rico America/Grenada
|
||||
Link America/Puerto_Rico America/Guadeloupe
|
||||
Link America/Puerto_Rico America/Kralendijk
|
||||
Link America/Puerto_Rico America/Lower_Princes
|
||||
Link America/Puerto_Rico America/Marigot
|
||||
Link America/Puerto_Rico America/Montserrat
|
||||
Link America/Toronto America/Nassau
|
||||
Link America/Puerto_Rico America/Port_of_Spain
|
||||
Link America/Puerto_Rico America/St_Barthelemy
|
||||
Link America/Puerto_Rico America/St_Kitts
|
||||
Link America/Puerto_Rico America/St_Lucia
|
||||
Link America/Puerto_Rico America/St_Thomas
|
||||
Link America/Puerto_Rico America/St_Vincent
|
||||
Link America/Puerto_Rico America/Tortola
|
||||
Link Pacific/Port_Moresby Antarctica/DumontDUrville
|
||||
Link Pacific/Auckland Antarctica/McMurdo
|
||||
Link Asia/Riyadh Antarctica/Syowa
|
||||
Link Asia/Urumqi Antarctica/Vostok
|
||||
Link Europe/Berlin Arctic/Longyearbyen
|
||||
Link Asia/Riyadh Asia/Aden
|
||||
Link Asia/Qatar Asia/Bahrain
|
||||
Link Asia/Kuching Asia/Brunei
|
||||
Link Asia/Singapore Asia/Kuala_Lumpur
|
||||
Link Asia/Riyadh Asia/Kuwait
|
||||
Link Asia/Dubai Asia/Muscat
|
||||
Link Asia/Bangkok Asia/Phnom_Penh
|
||||
Link Asia/Bangkok Asia/Vientiane
|
||||
Link Africa/Abidjan Atlantic/Reykjavik
|
||||
Link Africa/Abidjan Atlantic/St_Helena
|
||||
Link Europe/Brussels Europe/Amsterdam
|
||||
Link Europe/Prague Europe/Bratislava
|
||||
Link Europe/Zurich Europe/Busingen
|
||||
Link Europe/Berlin Europe/Copenhagen
|
||||
Link Europe/London Europe/Guernsey
|
||||
Link Europe/London Europe/Isle_of_Man
|
||||
Link Europe/London Europe/Jersey
|
||||
Link Europe/Belgrade Europe/Ljubljana
|
||||
Link Europe/Brussels Europe/Luxembourg
|
||||
Link Europe/Helsinki Europe/Mariehamn
|
||||
Link Europe/Paris Europe/Monaco
|
||||
Link Europe/Berlin Europe/Oslo
|
||||
Link Europe/Belgrade Europe/Podgorica
|
||||
Link Europe/Rome Europe/San_Marino
|
||||
Link Europe/Belgrade Europe/Sarajevo
|
||||
Link Europe/Belgrade Europe/Skopje
|
||||
Link Europe/Berlin Europe/Stockholm
|
||||
Link Europe/Zurich Europe/Vaduz
|
||||
Link Europe/Rome Europe/Vatican
|
||||
Link Europe/Belgrade Europe/Zagreb
|
||||
Link Africa/Nairobi Indian/Antananarivo
|
||||
Link Asia/Bangkok Indian/Christmas
|
||||
Link Asia/Yangon Indian/Cocos
|
||||
Link Africa/Nairobi Indian/Comoro
|
||||
Link Indian/Maldives Indian/Kerguelen
|
||||
Link Asia/Dubai Indian/Mahe
|
||||
Link Africa/Nairobi Indian/Mayotte
|
||||
Link Asia/Dubai Indian/Reunion
|
||||
Link Pacific/Port_Moresby Pacific/Chuuk
|
||||
Link Pacific/Tarawa Pacific/Funafuti
|
||||
Link Pacific/Tarawa Pacific/Majuro
|
||||
Link Pacific/Pago_Pago Pacific/Midway
|
||||
Link Pacific/Guadalcanal Pacific/Pohnpei
|
||||
Link Pacific/Guam Pacific/Saipan
|
||||
Link Pacific/Tarawa Pacific/Wake
|
||||
Link Pacific/Tarawa Pacific/Wallis
|
||||
|
||||
|
||||
# Non-zone.tab locations with timestamps since 1970 that duplicate
|
||||
# those of an existing location
|
||||
|
||||
# Link TARGET LINK-NAME
|
||||
Link Africa/Abidjan Africa/Timbuktu
|
||||
Link America/Argentina/Catamarca America/Argentina/ComodRivadavia
|
||||
Link America/Adak America/Atka
|
||||
Link America/Panama America/Coral_Harbour
|
||||
Link America/Tijuana America/Ensenada
|
||||
Link America/Indiana/Indianapolis America/Fort_Wayne
|
||||
Link America/Toronto America/Montreal
|
||||
Link America/Toronto America/Nipigon
|
||||
Link America/Iqaluit America/Pangnirtung
|
||||
Link America/Rio_Branco America/Porto_Acre
|
||||
Link America/Winnipeg America/Rainy_River
|
||||
Link America/Argentina/Cordoba America/Rosario
|
||||
Link America/Tijuana America/Santa_Isabel
|
||||
Link America/Denver America/Shiprock
|
||||
Link America/Toronto America/Thunder_Bay
|
||||
Link Pacific/Auckland Antarctica/South_Pole
|
||||
Link Asia/Shanghai Asia/Chongqing
|
||||
Link Asia/Shanghai Asia/Harbin
|
||||
Link Asia/Urumqi Asia/Kashgar
|
||||
Link Asia/Jerusalem Asia/Tel_Aviv
|
||||
Link Europe/Berlin Atlantic/Jan_Mayen
|
||||
Link Australia/Sydney Australia/Canberra
|
||||
Link Australia/Hobart Australia/Currie
|
||||
Link Europe/London Europe/Belfast
|
||||
Link Europe/Chisinau Europe/Tiraspol
|
||||
Link Europe/Kyiv Europe/Uzhgorod
|
||||
Link Europe/Kyiv Europe/Zaporozhye
|
||||
Link Pacific/Kanton Pacific/Enderbury
|
||||
Link Pacific/Honolulu Pacific/Johnston
|
||||
Link Pacific/Port_Moresby Pacific/Yap
|
||||
|
||||
|
||||
# Alternate names for the same location
|
||||
|
||||
# Link TARGET LINK-NAME #= TARGET1
|
||||
Link Africa/Nairobi Africa/Asmera #= Africa/Asmara
|
||||
Link America/Nuuk America/Godthab
|
||||
Link Asia/Ashgabat Asia/Ashkhabad
|
||||
Link Asia/Kolkata Asia/Calcutta
|
||||
Link Asia/Shanghai Asia/Chungking #= Asia/Chongqing
|
||||
Link Asia/Dhaka Asia/Dacca
|
||||
# Istanbul is in both continents.
|
||||
Link Europe/Istanbul Asia/Istanbul
|
||||
Link Asia/Kathmandu Asia/Katmandu
|
||||
Link Asia/Macau Asia/Macao
|
||||
Link Asia/Yangon Asia/Rangoon
|
||||
Link Asia/Ho_Chi_Minh Asia/Saigon
|
||||
Link Asia/Thimphu Asia/Thimbu
|
||||
Link Asia/Makassar Asia/Ujung_Pandang
|
||||
Link Asia/Ulaanbaatar Asia/Ulan_Bator
|
||||
Link Atlantic/Faroe Atlantic/Faeroe
|
||||
Link Europe/Kyiv Europe/Kiev
|
||||
# Classically, Cyprus is in Asia; e.g. see Herodotus, Histories, I.72.
|
||||
# However, for various reasons many users expect to find it under Europe.
|
||||
Link Asia/Nicosia Europe/Nicosia
|
||||
Link Pacific/Guadalcanal Pacific/Ponape #= Pacific/Pohnpei
|
||||
Link Pacific/Port_Moresby Pacific/Truk #= Pacific/Chuuk
|
||||
1858
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/backzone
vendored
Normal file
1858
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/backzone
vendored
Normal file
File diff suppressed because it is too large
Load Diff
173
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/calendars
vendored
Normal file
173
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/calendars
vendored
Normal file
@@ -0,0 +1,173 @@
|
||||
----- Calendrical issues -----
|
||||
|
||||
As mentioned in Theory.html, although calendrical issues are out of
|
||||
scope for tzdb, they indicate the sort of problems that we would run
|
||||
into if we extended tzdb further into the past. The following
|
||||
information and sources go beyond Theory.html's brief discussion.
|
||||
They sometimes disagree.
|
||||
|
||||
|
||||
France
|
||||
|
||||
Gregorian calendar adopted 1582-12-20.
|
||||
French Revolutionary calendar used 1793-11-24 through 1805-12-31,
|
||||
and (in Paris only) 1871-05-06 through 1871-05-23.
|
||||
|
||||
|
||||
Russia
|
||||
|
||||
From Chris Carrier (1996-12-02):
|
||||
On 1929-10-01 the Soviet Union instituted an "Eternal Calendar"
|
||||
with 30-day months plus 5 holidays, with a 5-day week.
|
||||
On 1931-12-01 it changed to a 6-day week; in 1934 it reverted to the
|
||||
Gregorian calendar while retaining the 6-day week; on 1940-06-27 it
|
||||
reverted to the 7-day week. With the 6-day week the usual days
|
||||
off were the 6th, 12th, 18th, 24th and 30th of the month.
|
||||
(Source: Evitiar Zerubavel, _The Seven Day Circle_)
|
||||
|
||||
|
||||
Mark Brader reported a similar story in "The Book of Calendars", edited
|
||||
by Frank Parise (1982, Facts on File, ISBN 0-8719-6467-8), page 377. But:
|
||||
|
||||
From: Petteri Sulonen (via Usenet)
|
||||
Date: 14 Jan 1999 00:00:00 GMT
|
||||
...
|
||||
|
||||
If your source is correct, how come documents between 1929 and 1940 were
|
||||
still dated using the conventional, Gregorian calendar?
|
||||
|
||||
I can post a scan of a document dated December 1, 1934, signed by
|
||||
Yenukidze, the secretary, on behalf of Kalinin, the President of the
|
||||
Executive Committee of the Supreme Soviet, if you like.
|
||||
|
||||
|
||||
|
||||
Sweden (and Finland)
|
||||
|
||||
From: Mark Brader
|
||||
Subject: Re: Gregorian reform - a part of locale?
|
||||
<news:1996Jul6.012937.29190@sq.com>
|
||||
Date: 1996-07-06
|
||||
|
||||
In 1700, Denmark made the transition from Julian to Gregorian. Sweden
|
||||
decided to *start* a transition in 1700 as well, but rather than have one of
|
||||
those unsightly calendar gaps :-), they simply decreed that the next leap
|
||||
year after 1696 would be in 1744 - putting the whole country on a calendar
|
||||
different from both Julian and Gregorian for a period of 40 years.
|
||||
|
||||
However, in 1704 something went wrong and the plan was not carried through;
|
||||
they did, after all, have a leap year that year. And one in 1708. In 1712
|
||||
they gave it up and went back to Julian, putting 30 days in February that
|
||||
year!...
|
||||
|
||||
Then in 1753, Sweden made the transition to Gregorian in the usual manner,
|
||||
getting there only 13 years behind the original schedule.
|
||||
|
||||
(A previous posting of this story was challenged, and Swedish readers
|
||||
produced the following references to support it: "Tideräkning och historia"
|
||||
by Natanael Beckman (1924) and "Tid, en bok om tideräkning och
|
||||
kalenderväsen" by Lars-Olof Lodén (1968).
|
||||
|
||||
|
||||
Grotefend's data
|
||||
|
||||
From: "Michael Palmer" [with two obvious typos fixed]
|
||||
Subject: Re: Gregorian Calendar (was Re: Another FHC related question
|
||||
Newsgroups: soc.genealogy.german
|
||||
Date: Tue, 9 Feb 1999 02:32:48 -800
|
||||
...
|
||||
|
||||
The following is a(n incomplete) listing, arranged chronologically, of
|
||||
European states, with the date they converted from the Julian to the
|
||||
Gregorian calendar:
|
||||
|
||||
04/15 Oct 1582 - Italy (with exceptions), Spain, Portugal, Poland (Roman
|
||||
Catholics and Danzig only)
|
||||
09/20 Dec 1582 - France, Lorraine
|
||||
|
||||
21 Dec 1582/
|
||||
01 Jan 1583 - Holland, Brabant, Flanders, Hennegau
|
||||
10/21 Feb 1583 - bishopric of Liege (Lüttich)
|
||||
13/24 Feb 1583 - bishopric of Augsburg
|
||||
04/15 Oct 1583 - electorate of Trier
|
||||
05/16 Oct 1583 - Bavaria, bishoprics of Freising, Eichstedt, Regensburg,
|
||||
Salzburg, Brixen
|
||||
13/24 Oct 1583 - Austrian Oberelsaß and Breisgau
|
||||
20/31 Oct 1583 - bishopric of Basel
|
||||
02/13 Nov 1583 - duchy of Jülich-Berg
|
||||
02/13 Nov 1583 - electorate and city of Köln
|
||||
04/15 Nov 1583 - bishopric of Würzburg
|
||||
11/22 Nov 1583 - electorate of Mainz
|
||||
16/27 Nov 1583 - bishopric of Strassburg and the margraviate of Baden
|
||||
17/28 Nov 1583 - bishopric of Münster and duchy of Cleve
|
||||
14/25 Dec 1583 - Steiermark
|
||||
|
||||
06/17 Jan 1584 - Austria and Bohemia
|
||||
11/22 Jan 1584 - Lucerne, Uri, Schwyz, Zug, Freiburg, Solothurn
|
||||
12/23 Jan 1584 - Silesia and the Lausitz
|
||||
22 Jan/
|
||||
02 Feb 1584 - Hungary (legally on 21 Oct 1587)
|
||||
Jun 1584 - Unterwalden
|
||||
01/12 Jul 1584 - duchy of Westfalen
|
||||
|
||||
16/27 Jun 1585 - bishopric of Paderborn
|
||||
|
||||
14/25 Dec 1590 - Transylvania
|
||||
|
||||
22 Aug/
|
||||
02 Sep 1612 - duchy of Prussia
|
||||
|
||||
13/24 Dec 1614 - Pfalz-Neuburg
|
||||
|
||||
1617 - duchy of Kurland (reverted to the Julian calendar in
|
||||
1796)
|
||||
|
||||
1624 - bishopric of Osnabrück
|
||||
|
||||
1630 - bishopric of Minden
|
||||
|
||||
15/26 Mar 1631 - bishopric of Hildesheim
|
||||
|
||||
1655 - Kanton Wallis
|
||||
|
||||
05/16 Feb 1682 - city of Strassburg
|
||||
|
||||
18 Feb/
|
||||
01 Mar 1700 - Protestant Germany (including Swedish possessions in
|
||||
Germany), Denmark, Norway
|
||||
30 Jun/
|
||||
12 Jul 1700 - Gelderland, Zutphen
|
||||
10 Nov/
|
||||
12 Dec 1700 - Utrecht, Overijssel
|
||||
|
||||
31 Dec 1700/
|
||||
12 Jan 1701 - Friesland, Groningen, Zürich, Bern, Basel, Geneva,
|
||||
Thurgau, and Schaffhausen
|
||||
|
||||
1724 - Glarus, Appenzell, and the city of St. Gallen
|
||||
|
||||
01 Jan 1750 - Pisa and Florence
|
||||
|
||||
02/14 Sep 1752 - Great Britain
|
||||
|
||||
17 Feb/
|
||||
01 Mar 1753 - Sweden
|
||||
|
||||
1760-1812 - Graubünden
|
||||
|
||||
The Russian empire (including Finland and the Baltic states) did not
|
||||
convert to the Gregorian calendar until the Soviet revolution of 1917.
|
||||
|
||||
Source: H. Grotefend, _Taschenbuch der Zeitrechnung des deutschen
|
||||
Mittelalters und der Neuzeit_, herausgegeben von Dr. O. Grotefend
|
||||
(Hannover: Hahnsche Buchhandlung, 1941), pp. 26-28.
|
||||
|
||||
-----
|
||||
|
||||
This file is in the public domain, so clarified as of 2009-05-17 by
|
||||
Arthur David Olson.
|
||||
|
||||
-----
|
||||
Local Variables:
|
||||
coding: utf-8
|
||||
End:
|
||||
70
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/checklinks.awk
vendored
Normal file
70
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/checklinks.awk
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
# Check links in tz tables.
|
||||
|
||||
# Contributed by Paul Eggert. This file is in the public domain.
|
||||
|
||||
BEGIN {
|
||||
# Special marker indicating that the name is defined as a Zone.
|
||||
# It is a newline so that it cannot match a valid name.
|
||||
# It is not null so that its slot does not appear unset.
|
||||
Zone = "\n"
|
||||
}
|
||||
|
||||
/^Z/ {
|
||||
if (defined[$2]) {
|
||||
if (defined[$2] == Zone) {
|
||||
printf "%s: Zone has duplicate definition\n", $2
|
||||
} else {
|
||||
printf "%s: Link with same name as Zone\n", $2
|
||||
}
|
||||
status = 1
|
||||
}
|
||||
defined[$2] = Zone
|
||||
}
|
||||
|
||||
/^L/ {
|
||||
if (defined[$3]) {
|
||||
if (defined[$3] == Zone) {
|
||||
printf "%s: Link with same name as Zone\n", $3
|
||||
} else if (defined[$3] == $2) {
|
||||
printf "%s: Link has duplicate definition\n", $3
|
||||
} else {
|
||||
printf "%s: Link to both %s and %s\n", $3, defined[$3], $2
|
||||
}
|
||||
status = 1
|
||||
}
|
||||
if (backcheck && FILENAME != backcheck && $3 != "GMT") {
|
||||
printf "%s: Link should be in '%s'\n", $3, backcheck
|
||||
status = 1
|
||||
}
|
||||
if ($4 == "#=") {
|
||||
shortcut[$5] = $3
|
||||
}
|
||||
used[$2] = 1
|
||||
defined[$3] = $2
|
||||
}
|
||||
|
||||
END {
|
||||
for (tz in used) {
|
||||
if (defined[tz] != Zone) {
|
||||
if (!defined[tz]) {
|
||||
printf "%s: Link to nowhere\n", tz
|
||||
status = 1
|
||||
} else if (DATAFORM != "vanguard") {
|
||||
printf "%s: Link to link\n", tz
|
||||
status = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
for (tz in shortcut) {
|
||||
if (defined[shortcut[tz]] != defined[tz]) {
|
||||
target = (!defined[tz] ? "absence" \
|
||||
: defined[tz] == "\n" ? "zone" \
|
||||
: defined[tz])
|
||||
printf "%s: target %s disagrees with %s's target %s\n", \
|
||||
tz, target, shortcut[tz], defined[shortcut[tz]]
|
||||
status = 1
|
||||
}
|
||||
}
|
||||
|
||||
exit status
|
||||
}
|
||||
191
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/checktab.awk
vendored
Normal file
191
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/checktab.awk
vendored
Normal file
@@ -0,0 +1,191 @@
|
||||
# Check tz tables for consistency.
|
||||
|
||||
# Contributed by Paul Eggert. This file is in the public domain.
|
||||
|
||||
BEGIN {
|
||||
FS = "\t"
|
||||
|
||||
if (!iso_table) iso_table = "iso3166.tab"
|
||||
if (!zone_table) zone_table = "zone1970.tab"
|
||||
if (!want_warnings) want_warnings = -1
|
||||
|
||||
while (getline <iso_table) {
|
||||
iso_NR++
|
||||
if ($0 ~ /^#/) continue
|
||||
if (NF != 2) {
|
||||
printf "%s:%d: wrong number of columns\n", \
|
||||
iso_table, iso_NR >>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
cc = $1
|
||||
name = $2
|
||||
if (cc !~ /^[A-Z][A-Z]$/) {
|
||||
printf "%s:%d: invalid country code '%s'\n", \
|
||||
iso_table, iso_NR, cc >>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
if (cc <= cc0) {
|
||||
if (cc == cc0) {
|
||||
s = "duplicate";
|
||||
} else {
|
||||
s = "out of order";
|
||||
}
|
||||
|
||||
printf "%s:%d: country code '%s' is %s\n", \
|
||||
iso_table, iso_NR, cc, s \
|
||||
>>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
cc0 = cc
|
||||
if (name2cc[name]) {
|
||||
printf "%s:%d: '%s' and '%s' have the same name\n", \
|
||||
iso_table, iso_NR, name2cc[name], cc \
|
||||
>>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
name2cc[name] = cc
|
||||
cc2name[cc] = name
|
||||
cc2NR[cc] = iso_NR
|
||||
}
|
||||
|
||||
cc0 = ""
|
||||
|
||||
while (getline <zone_table) {
|
||||
zone_NR++
|
||||
if ($0 ~ /^#/) continue
|
||||
if (NF != 3 && NF != 4) {
|
||||
printf "%s:%d: wrong number of columns\n", \
|
||||
zone_table, zone_NR >>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
ccs = input_ccs[zone_NR] = $1
|
||||
coordinates = $2
|
||||
tz = $3
|
||||
comments = input_comments[zone_NR] = $4
|
||||
split(ccs, cca, /,/)
|
||||
cc = cca[1]
|
||||
|
||||
# Don't complain about a special case for Crimea in zone.tab.
|
||||
# FIXME: zone.tab should be removed, since it is obsolete.
|
||||
# Or at least put just "XX" in its country-code column.
|
||||
if (cc < cc0 \
|
||||
&& !(zone_table == "zone.tab" \
|
||||
&& tz0 == "Europe/Simferopol")) {
|
||||
printf "%s:%d: country code '%s' is out of order\n", \
|
||||
zone_table, zone_NR, cc >>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
cc0 = cc
|
||||
tz0 = tz
|
||||
tztab[tz] = 1
|
||||
tz2NR[tz] = zone_NR
|
||||
for (i in cca) {
|
||||
cc = cca[i]
|
||||
if (cc2name[cc]) {
|
||||
cc_used[cc]++
|
||||
} else {
|
||||
printf "%s:%d: %s: unknown country code\n", \
|
||||
zone_table, zone_NR, cc >>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
}
|
||||
if (coordinates !~ /^[-+][0-9][0-9][0-5][0-9][-+][01][0-9][0-9][0-5][0-9]$/ \
|
||||
&& coordinates !~ /^[-+][0-9][0-9][0-5][0-9][0-5][0-9][-+][01][0-9][0-9][0-5][0-9][0-5][0-9]$/) {
|
||||
printf "%s:%d: %s: invalid coordinates\n", \
|
||||
zone_table, zone_NR, coordinates >>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 1; i <= zone_NR; i++) {
|
||||
ccs = input_ccs[i]
|
||||
if (!ccs) continue
|
||||
comments = input_comments[i]
|
||||
split(ccs, cca, /,/)
|
||||
used_max = 0
|
||||
for (j in cca) {
|
||||
cc = cca[j]
|
||||
if (used_max < cc_used[cc]) {
|
||||
used_max = cc_used[cc]
|
||||
}
|
||||
}
|
||||
if (used_max <= 1 && comments) {
|
||||
printf "%s:%d: unnecessary comment '%s'\n", \
|
||||
zone_table, i, comments \
|
||||
>>"/dev/stderr"
|
||||
status = 1
|
||||
} else if (1 < cc_used[cc] && !comments) {
|
||||
printf "%s:%d: missing comment for %s\n", \
|
||||
zone_table, i, cc \
|
||||
>>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
}
|
||||
FS = " "
|
||||
}
|
||||
|
||||
$1 ~ /^#/ { next }
|
||||
|
||||
{
|
||||
tz = rules = ""
|
||||
if ($1 == "Zone") {
|
||||
tz = $2
|
||||
ruleUsed[$4] = 1
|
||||
if ($5 ~ /%/) rulePercentUsed[$4] = 1
|
||||
} else if ($1 == "Link" && zone_table == "zone.tab") {
|
||||
# Ignore Link commands if source and destination basenames
|
||||
# are identical, e.g. Europe/Istanbul versus Asia/Istanbul.
|
||||
src = $2
|
||||
dst = $3
|
||||
while ((i = index(src, "/"))) src = substr(src, i+1)
|
||||
while ((i = index(dst, "/"))) dst = substr(dst, i+1)
|
||||
if (src != dst) tz = $3
|
||||
} else if ($1 == "Rule") {
|
||||
ruleDefined[$2] = 1
|
||||
if ($10 != "-") ruleLetters[$2] = 1
|
||||
} else {
|
||||
ruleUsed[$2] = 1
|
||||
if ($3 ~ /%/) rulePercentUsed[$2] = 1
|
||||
}
|
||||
if (tz && tz ~ /\// && tz !~ /^Etc\//) {
|
||||
if (!tztab[tz] && FILENAME != "backward") {
|
||||
printf "%s: no data for '%s'\n", zone_table, tz \
|
||||
>>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
zoneSeen[tz] = 1
|
||||
}
|
||||
}
|
||||
|
||||
END {
|
||||
for (tz in ruleDefined) {
|
||||
if (!ruleUsed[tz]) {
|
||||
printf "%s: Rule never used\n", tz
|
||||
status = 1
|
||||
}
|
||||
}
|
||||
for (tz in ruleLetters) {
|
||||
if (!rulePercentUsed[tz]) {
|
||||
printf "%s: Rule contains letters never used\n", tz
|
||||
status = 1
|
||||
}
|
||||
}
|
||||
for (tz in tztab) {
|
||||
if (!zoneSeen[tz] && tz !~ /^Etc\//) {
|
||||
printf "%s:%d: no Zone table for '%s'\n", \
|
||||
zone_table, tz2NR[tz], tz >>"/dev/stderr"
|
||||
status = 1
|
||||
}
|
||||
}
|
||||
if (0 < want_warnings) {
|
||||
for (cc in cc2name) {
|
||||
if (!cc_used[cc]) {
|
||||
printf "%s:%d: warning: " \
|
||||
"no Zone entries for %s (%s)\n", \
|
||||
iso_table, cc2NR[cc], cc, cc2name[cc]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exit status
|
||||
}
|
||||
167
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/date.1
vendored
Normal file
167
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/date.1
vendored
Normal file
@@ -0,0 +1,167 @@
|
||||
.\" This file is in the public domain, so clarified as of
|
||||
.\" 2009-05-17 by Arthur David Olson.
|
||||
.TH date 1
|
||||
.SH NAME
|
||||
date \- show and set date and time
|
||||
.SH SYNOPSIS
|
||||
.if n .nh
|
||||
.if n .na
|
||||
.ie \n(.g .ds - \f(CR-\fP
|
||||
.el .ds - \-
|
||||
.B date
|
||||
[
|
||||
.B \*-u
|
||||
] [
|
||||
.B \*-c
|
||||
] [
|
||||
.B \*-r
|
||||
.I seconds
|
||||
] [
|
||||
.BI + format
|
||||
] [
|
||||
\fR[\fIyyyy\fR]\fImmddhhmm\fR[\fIyy\fR][\fB.\fIss\fR]
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
.ie '\(lq'' .ds lq \&"\"
|
||||
.el .ds lq \(lq\"
|
||||
.ie '\(rq'' .ds rq \&"\"
|
||||
.el .ds rq \(rq\"
|
||||
.de q
|
||||
\\$3\*(lq\\$1\*(rq\\$2
|
||||
..
|
||||
The
|
||||
.B date
|
||||
command
|
||||
without arguments writes the date and time to the standard output in
|
||||
the form
|
||||
.ce 1
|
||||
Wed Mar 8 14:54:40 EST 1989
|
||||
.br
|
||||
with
|
||||
.B EST
|
||||
replaced by the local time zone's abbreviation
|
||||
(or by the abbreviation for the time zone specified in the
|
||||
.B TZ
|
||||
environment variable if set).
|
||||
The exact output format depends on the locale.
|
||||
.PP
|
||||
If a command-line argument starts with a plus sign (\c
|
||||
.q "\fB+\fP" ),
|
||||
the rest of the argument is used as a
|
||||
.I format
|
||||
that controls what appears in the output.
|
||||
In the format, when a percent sign (\c
|
||||
.q "\fB%\fP"
|
||||
appears,
|
||||
it and the character after it are not output,
|
||||
but rather identify part of the date or time
|
||||
to be output in a particular way
|
||||
(or identify a special character to output):
|
||||
.nf
|
||||
.sp
|
||||
.if t .in +.5i
|
||||
.if n .in +2
|
||||
.ta \w'%M\0\0'u +\w'Wed Mar 8 14:54:40 EST 1989\0\0'u
|
||||
Sample output Explanation
|
||||
%a Wed Abbreviated weekday name*
|
||||
%A Wednesday Full weekday name*
|
||||
%b Mar Abbreviated month name*
|
||||
%B March Full month name*
|
||||
%c Wed Mar 08 14:54:40 1989 Date and time*
|
||||
%C 19 Century
|
||||
%d 08 Day of month (always two digits)
|
||||
%D 03/08/89 Month/day/year (eight characters)
|
||||
%e 8 Day of month (leading zero blanked)
|
||||
%h Mar Abbreviated month name*
|
||||
%H 14 24-hour-clock hour (two digits)
|
||||
%I 02 12-hour-clock hour (two digits)
|
||||
%j 067 Julian day number (three digits)
|
||||
%k 2 12-hour-clock hour (leading zero blanked)
|
||||
%l 14 24-hour-clock hour (leading zero blanked)
|
||||
%m 03 Month number (two digits)
|
||||
%M 54 Minute (two digits)
|
||||
%n \\n newline character
|
||||
%p PM AM/PM designation
|
||||
%r 02:54:40 PM Hour:minute:second AM/PM designation
|
||||
%R 14:54 Hour:minute
|
||||
%S 40 Second (two digits)
|
||||
%t \\t tab character
|
||||
%T 14:54:40 Hour:minute:second
|
||||
%U 10 Sunday-based week number (two digits)
|
||||
%w 3 Day number (one digit, Sunday is 0)
|
||||
%W 10 Monday-based week number (two digits)
|
||||
%x 03/08/89 Date*
|
||||
%X 14:54:40 Time*
|
||||
%y 89 Last two digits of year
|
||||
%Y 1989 Year in full
|
||||
%z -0500 Numeric time zone
|
||||
%Z EST Time zone abbreviation
|
||||
%+ Wed Mar 8 14:54:40 EST 1989 Default output format*
|
||||
.if t .in -.5i
|
||||
.if n .in -2
|
||||
* The exact output depends on the locale.
|
||||
.sp
|
||||
.fi
|
||||
If a character other than one of those shown above appears after
|
||||
a percent sign in the format,
|
||||
that following character is output.
|
||||
All other characters in the format are copied unchanged to the output;
|
||||
a newline character is always added at the end of the output.
|
||||
.PP
|
||||
In Sunday-based week numbering,
|
||||
the first Sunday of the year begins week 1;
|
||||
days preceding it are part of
|
||||
.q "week 0" .
|
||||
In Monday-based week numbering,
|
||||
the first Monday of the year begins week 1.
|
||||
.PP
|
||||
To set the date, use a command line argument with one of the following forms:
|
||||
.nf
|
||||
.if t .in +.5i
|
||||
.if n .in +2
|
||||
.ta \w'198903081454\0'u
|
||||
1454 24-hour-clock hours (first two digits) and minutes
|
||||
081454 Month day (first two digits), hours, and minutes
|
||||
03081454 Month (two digits, January is 01), month day, hours, minutes
|
||||
8903081454 Year, month, month day, hours, minutes
|
||||
0308145489 Month, month day, hours, minutes, year
|
||||
(on System V-compatible systems)
|
||||
030814541989 Month, month day, hours, minutes, four-digit year
|
||||
198903081454 Four-digit year, month, month day, hours, minutes
|
||||
.if t .in -.5i
|
||||
.if n .in -2
|
||||
.fi
|
||||
If the century, year, month, or month day is not given,
|
||||
the current value is used.
|
||||
Any of the above forms may be followed by a period and two digits that give
|
||||
the seconds part of the new time; if no seconds are given, zero is assumed.
|
||||
.PP
|
||||
These options are available:
|
||||
.TP
|
||||
.BR \*-u " or " \*-c
|
||||
Use Universal Time when setting and showing the date and time.
|
||||
.TP
|
||||
.BI "\*-r " seconds
|
||||
Output the date that corresponds to
|
||||
.I seconds
|
||||
past the epoch of 1970-01-01 00:00:00 UTC, where
|
||||
.I seconds
|
||||
should be an integer, either decimal, octal (leading 0), or
|
||||
hexadecimal (leading 0x), preceded by an optional sign.
|
||||
.SH FILES
|
||||
.ta \w'/usr/share/zoneinfo/posixrules\0\0'u
|
||||
/etc/localtime local timezone file
|
||||
.br
|
||||
/usr/lib/locale/\f2L\fP/LC_TIME description of time locale \f2L\fP
|
||||
.br
|
||||
/usr/share/zoneinfo timezone information directory
|
||||
.br
|
||||
/usr/share/zoneinfo/posixrules used with POSIX-style TZ's
|
||||
.br
|
||||
/usr/share/zoneinfo/GMT for UTC leap seconds
|
||||
.sp
|
||||
If
|
||||
.B /usr/share/zoneinfo/GMT
|
||||
is absent,
|
||||
UTC leap seconds are loaded from
|
||||
.BR /usr/share/zoneinfo/posixrules .
|
||||
216
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/date.c
vendored
Normal file
216
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/date.c
vendored
Normal file
@@ -0,0 +1,216 @@
|
||||
/* Display or set the current time and date. */
|
||||
|
||||
/* Copyright 1985, 1987, 1988 The Regents of the University of California.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. Neither the name of the University nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE. */
|
||||
|
||||
#include "private.h"
|
||||
#include <locale.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#if !HAVE_POSIX_DECLS
|
||||
extern char * optarg;
|
||||
extern int optind;
|
||||
#endif
|
||||
|
||||
static int retval = EXIT_SUCCESS;
|
||||
|
||||
static void display(const char *, time_t);
|
||||
static void dogmt(void);
|
||||
static void errensure(void);
|
||||
static void timeout(FILE *, const char *, const struct tm *);
|
||||
ATTRIBUTE_NORETURN static void usage(void);
|
||||
|
||||
int
|
||||
main(const int argc, char *argv[])
|
||||
{
|
||||
register const char * format = "+%+";
|
||||
register int ch;
|
||||
register bool rflag = false;
|
||||
time_t t;
|
||||
intmax_t secs;
|
||||
char * endarg;
|
||||
|
||||
#ifdef LC_ALL
|
||||
setlocale(LC_ALL, "");
|
||||
#endif /* defined(LC_ALL) */
|
||||
#if HAVE_GETTEXT
|
||||
# ifdef TZ_DOMAINDIR
|
||||
bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
|
||||
# endif /* defined(TEXTDOMAINDIR) */
|
||||
textdomain(TZ_DOMAIN);
|
||||
#endif /* HAVE_GETTEXT */
|
||||
t = time(NULL);
|
||||
while ((ch = getopt(argc, argv, "ucr:")) != EOF && ch != -1) {
|
||||
switch (ch) {
|
||||
default:
|
||||
usage();
|
||||
case 'u': /* do it in UT */
|
||||
case 'c':
|
||||
dogmt();
|
||||
break;
|
||||
case 'r': /* seconds since 1970 */
|
||||
if (rflag) {
|
||||
fprintf(stderr,
|
||||
_("date: error: multiple -r's used"));
|
||||
usage();
|
||||
}
|
||||
rflag = true;
|
||||
errno = 0;
|
||||
secs = strtoimax(optarg, &endarg, 0);
|
||||
if (*endarg || optarg == endarg)
|
||||
errno = EINVAL;
|
||||
else if (! (TIME_T_MIN <= secs && secs <= TIME_T_MAX))
|
||||
errno = ERANGE;
|
||||
if (errno) {
|
||||
perror(optarg);
|
||||
errensure();
|
||||
exit(retval);
|
||||
}
|
||||
t = secs;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (optind < argc) {
|
||||
if (argc - optind != 1) {
|
||||
fprintf(stderr,
|
||||
_("date: error: multiple operands in command line\n"));
|
||||
usage();
|
||||
}
|
||||
format = argv[optind];
|
||||
if (*format != '+') {
|
||||
fprintf(stderr, _("date: unknown operand: %s\n"), format);
|
||||
usage();
|
||||
}
|
||||
}
|
||||
|
||||
display(format, t);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
dogmt(void)
|
||||
{
|
||||
static char ** fakeenv;
|
||||
|
||||
if (fakeenv == NULL) {
|
||||
static char tzeutc0[] = "TZ=UTC0";
|
||||
ptrdiff_t from, to, n;
|
||||
|
||||
for (n = 0; environ[n] != NULL; ++n)
|
||||
continue;
|
||||
#if defined ckd_add && defined ckd_mul
|
||||
if (!ckd_add(&n, n, 2) && !ckd_mul(&n, n, sizeof *fakeenv)
|
||||
&& n <= SIZE_MAX)
|
||||
fakeenv = malloc(n);
|
||||
#else
|
||||
if (n <= min(PTRDIFF_MAX, SIZE_MAX) / sizeof *fakeenv - 2)
|
||||
fakeenv = malloc((n + 2) * sizeof *fakeenv);
|
||||
#endif
|
||||
if (fakeenv == NULL) {
|
||||
fprintf(stderr, _("date: Memory exhausted\n"));
|
||||
errensure();
|
||||
exit(retval);
|
||||
}
|
||||
to = 0;
|
||||
fakeenv[to++] = tzeutc0;
|
||||
for (from = 1; environ[from] != NULL; ++from)
|
||||
if (strncmp(environ[from], "TZ=", 3) != 0)
|
||||
fakeenv[to++] = environ[from];
|
||||
fakeenv[to] = NULL;
|
||||
environ = fakeenv;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
errensure(void)
|
||||
{
|
||||
if (retval == EXIT_SUCCESS)
|
||||
retval = EXIT_FAILURE;
|
||||
}
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("date: usage: date [-u] [-c] [-r seconds]"
|
||||
" [+format]\n"));
|
||||
errensure();
|
||||
exit(retval);
|
||||
}
|
||||
|
||||
static void
|
||||
display(char const *format, time_t now)
|
||||
{
|
||||
struct tm *tmp;
|
||||
|
||||
tmp = localtime(&now);
|
||||
if (!tmp) {
|
||||
fprintf(stderr,
|
||||
_("date: error: time out of range\n"));
|
||||
errensure();
|
||||
return;
|
||||
}
|
||||
timeout(stdout, format, tmp);
|
||||
putchar('\n');
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
if (ferror(stdout) || ferror(stderr)) {
|
||||
fprintf(stderr,
|
||||
_("date: error: couldn't write results\n"));
|
||||
errensure();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
timeout(FILE *fp, char const *format, struct tm const *tmp)
|
||||
{
|
||||
char *cp = NULL;
|
||||
ptrdiff_t result;
|
||||
ptrdiff_t size = 1024 / 2;
|
||||
|
||||
for ( ; ; ) {
|
||||
#ifdef ckd_mul
|
||||
bool bigger = !ckd_mul(&size, size, 2) && size <= SIZE_MAX;
|
||||
#else
|
||||
bool bigger = (size <= min(PTRDIFF_MAX, SIZE_MAX) / 2
|
||||
&& (size *= 2, true));
|
||||
#endif
|
||||
char *newcp = bigger ? realloc(cp, size) : NULL;
|
||||
if (!newcp) {
|
||||
fprintf(stderr,
|
||||
_("date: error: can't get memory\n"));
|
||||
errensure();
|
||||
exit(retval);
|
||||
}
|
||||
cp = newcp;
|
||||
result = strftime(cp, size, format, tmp);
|
||||
if (result != 0)
|
||||
break;
|
||||
}
|
||||
fwrite(cp + 1, 1, result - 1, fp);
|
||||
free(cp);
|
||||
}
|
||||
60
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/difftime.c
vendored
Normal file
60
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/difftime.c
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
/* Return the difference between two timestamps. */
|
||||
|
||||
/*
|
||||
** This file is in the public domain, so clarified as of
|
||||
** 1996-06-05 by Arthur David Olson.
|
||||
*/
|
||||
|
||||
/*LINTLIBRARY*/
|
||||
|
||||
#include "private.h" /* for time_t and TYPE_SIGNED */
|
||||
|
||||
/* Return -X as a double. Using this avoids casting to 'double'. */
|
||||
static double
|
||||
dminus(double x)
|
||||
{
|
||||
return -x;
|
||||
}
|
||||
|
||||
double
|
||||
difftime(time_t time1, time_t time0)
|
||||
{
|
||||
/*
|
||||
** If double is large enough, simply convert and subtract
|
||||
** (assuming that the larger type has more precision).
|
||||
*/
|
||||
if (sizeof(time_t) < sizeof(double)) {
|
||||
double t1 = time1, t0 = time0;
|
||||
return t1 - t0;
|
||||
}
|
||||
|
||||
/*
|
||||
** The difference of two unsigned values can't overflow
|
||||
** if the minuend is greater than or equal to the subtrahend.
|
||||
*/
|
||||
if (!TYPE_SIGNED(time_t))
|
||||
return time0 <= time1 ? time1 - time0 : dminus(time0 - time1);
|
||||
|
||||
/* Use uintmax_t if wide enough. */
|
||||
if (sizeof(time_t) <= sizeof(uintmax_t)) {
|
||||
uintmax_t t1 = time1, t0 = time0;
|
||||
return time0 <= time1 ? t1 - t0 : dminus(t0 - t1);
|
||||
}
|
||||
|
||||
/*
|
||||
** Handle cases where both time1 and time0 have the same sign
|
||||
** (meaning that their difference cannot overflow).
|
||||
*/
|
||||
if ((time1 < 0) == (time0 < 0))
|
||||
return time1 - time0;
|
||||
|
||||
/*
|
||||
** The values have opposite signs and uintmax_t is too narrow.
|
||||
** This suffers from double rounding; attempt to lessen that
|
||||
** by using long double temporaries.
|
||||
*/
|
||||
{
|
||||
long double t1 = time1, t0 = time0;
|
||||
return t1 - t0;
|
||||
}
|
||||
}
|
||||
79
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/etcetera
vendored
Normal file
79
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/etcetera
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
# tzdb data for ships at sea and other miscellany
|
||||
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
|
||||
# These entries are for uses not otherwise covered by the tz database.
|
||||
# Their main practical use is for platforms like Android that lack
|
||||
# support for POSIX-style TZ strings. On such platforms these entries
|
||||
# can be useful if the timezone database is wrong or if a ship or
|
||||
# aircraft at sea is not in a timezone.
|
||||
|
||||
# Starting with POSIX 1003.1-2001, the entries below are all
|
||||
# unnecessary as settings for the TZ environment variable. E.g.,
|
||||
# instead of TZ='Etc/GMT+4' one can use the POSIX setting TZ='<-04>+4'.
|
||||
#
|
||||
# Do not use a POSIX TZ setting like TZ='GMT+4', which is four hours
|
||||
# behind GMT but uses the completely misleading abbreviation "GMT".
|
||||
|
||||
# The following zone is used by tzcode functions like gmtime,
|
||||
# which load the "UTC" file to handle seconds properly.
|
||||
Zone Etc/UTC 0 - UTC
|
||||
|
||||
# Functions like gmtime load the "GMT" file to handle leap seconds properly.
|
||||
# Vanguard section, which works with most .zi parsers.
|
||||
#Zone GMT 0 - GMT
|
||||
# Rearguard section, for TZUpdater 2.3.2 and earlier.
|
||||
Zone Etc/GMT 0 - GMT
|
||||
|
||||
# The following link uses older naming conventions,
|
||||
# but it belongs here, not in the file 'backward',
|
||||
# as it is needed for tzcode releases through 2022a,
|
||||
# where functions like gmtime load "GMT" instead of the "Etc/UTC".
|
||||
# We want this to work even on installations that omit 'backward'.
|
||||
Link Etc/GMT GMT
|
||||
# End of rearguard section.
|
||||
|
||||
# Be consistent with POSIX TZ settings in the Zone names,
|
||||
# even though this is the opposite of what many people expect.
|
||||
# POSIX has positive signs west of Greenwich, but many people expect
|
||||
# positive signs east of Greenwich. For example, TZ='Etc/GMT+4' uses
|
||||
# the abbreviation "-04" and corresponds to 4 hours behind UT
|
||||
# (i.e. west of Greenwich) even though many people would expect it to
|
||||
# mean 4 hours ahead of UT (i.e. east of Greenwich).
|
||||
|
||||
# Earlier incarnations of this package were not POSIX-compliant,
|
||||
# and had lines such as
|
||||
# Zone GMT-12 -12 - GMT-1200
|
||||
# We did not want things to change quietly if someone accustomed to the old
|
||||
# way does a
|
||||
# zic -l GMT-12
|
||||
# so we moved the names into the Etc subdirectory.
|
||||
# Also, the time zone abbreviations are now compatible with %z.
|
||||
|
||||
Zone Etc/GMT-14 14 - +14
|
||||
Zone Etc/GMT-13 13 - +13
|
||||
Zone Etc/GMT-12 12 - +12
|
||||
Zone Etc/GMT-11 11 - +11
|
||||
Zone Etc/GMT-10 10 - +10
|
||||
Zone Etc/GMT-9 9 - +09
|
||||
Zone Etc/GMT-8 8 - +08
|
||||
Zone Etc/GMT-7 7 - +07
|
||||
Zone Etc/GMT-6 6 - +06
|
||||
Zone Etc/GMT-5 5 - +05
|
||||
Zone Etc/GMT-4 4 - +04
|
||||
Zone Etc/GMT-3 3 - +03
|
||||
Zone Etc/GMT-2 2 - +02
|
||||
Zone Etc/GMT-1 1 - +01
|
||||
Zone Etc/GMT+1 -1 - -01
|
||||
Zone Etc/GMT+2 -2 - -02
|
||||
Zone Etc/GMT+3 -3 - -03
|
||||
Zone Etc/GMT+4 -4 - -04
|
||||
Zone Etc/GMT+5 -5 - -05
|
||||
Zone Etc/GMT+6 -6 - -06
|
||||
Zone Etc/GMT+7 -7 - -07
|
||||
Zone Etc/GMT+8 -8 - -08
|
||||
Zone Etc/GMT+9 -9 - -09
|
||||
Zone Etc/GMT+10 -10 - -10
|
||||
Zone Etc/GMT+11 -11 - -11
|
||||
Zone Etc/GMT+12 -12 - -12
|
||||
3877
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/europe
vendored
Normal file
3877
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/europe
vendored
Normal file
File diff suppressed because it is too large
Load Diff
12
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/factory
vendored
Normal file
12
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/factory
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# tzdb data for noncommittal factory settings
|
||||
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
|
||||
# For distributors who don't want to specify a timezone in their
|
||||
# installation procedures. Users who run 'date' will get the
|
||||
# time zone abbreviation "-00", indicating that the actual time zone
|
||||
# is unknown.
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT
|
||||
Zone Factory 0 - -00
|
||||
274
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/iso3166.tab
vendored
Normal file
274
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/iso3166.tab
vendored
Normal file
@@ -0,0 +1,274 @@
|
||||
# ISO 3166 alpha-2 country codes
|
||||
#
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
#
|
||||
# From Paul Eggert (2022-11-18):
|
||||
# This file contains a table of two-letter country codes. Columns are
|
||||
# separated by a single tab. Lines beginning with '#' are comments.
|
||||
# All text uses UTF-8 encoding. The columns of the table are as follows:
|
||||
#
|
||||
# 1. ISO 3166-1 alpha-2 country code, current as of
|
||||
# ISO 3166-1 N1087 (2022-09-02). See: Updates on ISO 3166-1
|
||||
# https://isotc.iso.org/livelink/livelink/Open/16944257
|
||||
# 2. The usual English name for the coded region,
|
||||
# chosen so that alphabetic sorting of subsets produces helpful lists.
|
||||
# This is not the same as the English name in the ISO 3166 tables.
|
||||
#
|
||||
# The table is sorted by country code.
|
||||
#
|
||||
# This table is intended as an aid for users, to help them select time
|
||||
# zone data appropriate for their practical needs. It is not intended
|
||||
# to take or endorse any position on legal or territorial claims.
|
||||
#
|
||||
#country-
|
||||
#code name of country, territory, area, or subdivision
|
||||
AD Andorra
|
||||
AE United Arab Emirates
|
||||
AF Afghanistan
|
||||
AG Antigua & Barbuda
|
||||
AI Anguilla
|
||||
AL Albania
|
||||
AM Armenia
|
||||
AO Angola
|
||||
AQ Antarctica
|
||||
AR Argentina
|
||||
AS Samoa (American)
|
||||
AT Austria
|
||||
AU Australia
|
||||
AW Aruba
|
||||
AX Åland Islands
|
||||
AZ Azerbaijan
|
||||
BA Bosnia & Herzegovina
|
||||
BB Barbados
|
||||
BD Bangladesh
|
||||
BE Belgium
|
||||
BF Burkina Faso
|
||||
BG Bulgaria
|
||||
BH Bahrain
|
||||
BI Burundi
|
||||
BJ Benin
|
||||
BL St Barthelemy
|
||||
BM Bermuda
|
||||
BN Brunei
|
||||
BO Bolivia
|
||||
BQ Caribbean NL
|
||||
BR Brazil
|
||||
BS Bahamas
|
||||
BT Bhutan
|
||||
BV Bouvet Island
|
||||
BW Botswana
|
||||
BY Belarus
|
||||
BZ Belize
|
||||
CA Canada
|
||||
CC Cocos (Keeling) Islands
|
||||
CD Congo (Dem. Rep.)
|
||||
CF Central African Rep.
|
||||
CG Congo (Rep.)
|
||||
CH Switzerland
|
||||
CI Côte d'Ivoire
|
||||
CK Cook Islands
|
||||
CL Chile
|
||||
CM Cameroon
|
||||
CN China
|
||||
CO Colombia
|
||||
CR Costa Rica
|
||||
CU Cuba
|
||||
CV Cape Verde
|
||||
CW Curaçao
|
||||
CX Christmas Island
|
||||
CY Cyprus
|
||||
CZ Czech Republic
|
||||
DE Germany
|
||||
DJ Djibouti
|
||||
DK Denmark
|
||||
DM Dominica
|
||||
DO Dominican Republic
|
||||
DZ Algeria
|
||||
EC Ecuador
|
||||
EE Estonia
|
||||
EG Egypt
|
||||
EH Western Sahara
|
||||
ER Eritrea
|
||||
ES Spain
|
||||
ET Ethiopia
|
||||
FI Finland
|
||||
FJ Fiji
|
||||
FK Falkland Islands
|
||||
FM Micronesia
|
||||
FO Faroe Islands
|
||||
FR France
|
||||
GA Gabon
|
||||
GB Britain (UK)
|
||||
GD Grenada
|
||||
GE Georgia
|
||||
GF French Guiana
|
||||
GG Guernsey
|
||||
GH Ghana
|
||||
GI Gibraltar
|
||||
GL Greenland
|
||||
GM Gambia
|
||||
GN Guinea
|
||||
GP Guadeloupe
|
||||
GQ Equatorial Guinea
|
||||
GR Greece
|
||||
GS South Georgia & the South Sandwich Islands
|
||||
GT Guatemala
|
||||
GU Guam
|
||||
GW Guinea-Bissau
|
||||
GY Guyana
|
||||
HK Hong Kong
|
||||
HM Heard Island & McDonald Islands
|
||||
HN Honduras
|
||||
HR Croatia
|
||||
HT Haiti
|
||||
HU Hungary
|
||||
ID Indonesia
|
||||
IE Ireland
|
||||
IL Israel
|
||||
IM Isle of Man
|
||||
IN India
|
||||
IO British Indian Ocean Territory
|
||||
IQ Iraq
|
||||
IR Iran
|
||||
IS Iceland
|
||||
IT Italy
|
||||
JE Jersey
|
||||
JM Jamaica
|
||||
JO Jordan
|
||||
JP Japan
|
||||
KE Kenya
|
||||
KG Kyrgyzstan
|
||||
KH Cambodia
|
||||
KI Kiribati
|
||||
KM Comoros
|
||||
KN St Kitts & Nevis
|
||||
KP Korea (North)
|
||||
KR Korea (South)
|
||||
KW Kuwait
|
||||
KY Cayman Islands
|
||||
KZ Kazakhstan
|
||||
LA Laos
|
||||
LB Lebanon
|
||||
LC St Lucia
|
||||
LI Liechtenstein
|
||||
LK Sri Lanka
|
||||
LR Liberia
|
||||
LS Lesotho
|
||||
LT Lithuania
|
||||
LU Luxembourg
|
||||
LV Latvia
|
||||
LY Libya
|
||||
MA Morocco
|
||||
MC Monaco
|
||||
MD Moldova
|
||||
ME Montenegro
|
||||
MF St Martin (French)
|
||||
MG Madagascar
|
||||
MH Marshall Islands
|
||||
MK North Macedonia
|
||||
ML Mali
|
||||
MM Myanmar (Burma)
|
||||
MN Mongolia
|
||||
MO Macau
|
||||
MP Northern Mariana Islands
|
||||
MQ Martinique
|
||||
MR Mauritania
|
||||
MS Montserrat
|
||||
MT Malta
|
||||
MU Mauritius
|
||||
MV Maldives
|
||||
MW Malawi
|
||||
MX Mexico
|
||||
MY Malaysia
|
||||
MZ Mozambique
|
||||
NA Namibia
|
||||
NC New Caledonia
|
||||
NE Niger
|
||||
NF Norfolk Island
|
||||
NG Nigeria
|
||||
NI Nicaragua
|
||||
NL Netherlands
|
||||
NO Norway
|
||||
NP Nepal
|
||||
NR Nauru
|
||||
NU Niue
|
||||
NZ New Zealand
|
||||
OM Oman
|
||||
PA Panama
|
||||
PE Peru
|
||||
PF French Polynesia
|
||||
PG Papua New Guinea
|
||||
PH Philippines
|
||||
PK Pakistan
|
||||
PL Poland
|
||||
PM St Pierre & Miquelon
|
||||
PN Pitcairn
|
||||
PR Puerto Rico
|
||||
PS Palestine
|
||||
PT Portugal
|
||||
PW Palau
|
||||
PY Paraguay
|
||||
QA Qatar
|
||||
RE Réunion
|
||||
RO Romania
|
||||
RS Serbia
|
||||
RU Russia
|
||||
RW Rwanda
|
||||
SA Saudi Arabia
|
||||
SB Solomon Islands
|
||||
SC Seychelles
|
||||
SD Sudan
|
||||
SE Sweden
|
||||
SG Singapore
|
||||
SH St Helena
|
||||
SI Slovenia
|
||||
SJ Svalbard & Jan Mayen
|
||||
SK Slovakia
|
||||
SL Sierra Leone
|
||||
SM San Marino
|
||||
SN Senegal
|
||||
SO Somalia
|
||||
SR Suriname
|
||||
SS South Sudan
|
||||
ST Sao Tome & Principe
|
||||
SV El Salvador
|
||||
SX St Maarten (Dutch)
|
||||
SY Syria
|
||||
SZ Eswatini (Swaziland)
|
||||
TC Turks & Caicos Is
|
||||
TD Chad
|
||||
TF French Southern Territories
|
||||
TG Togo
|
||||
TH Thailand
|
||||
TJ Tajikistan
|
||||
TK Tokelau
|
||||
TL East Timor
|
||||
TM Turkmenistan
|
||||
TN Tunisia
|
||||
TO Tonga
|
||||
TR Turkey
|
||||
TT Trinidad & Tobago
|
||||
TV Tuvalu
|
||||
TW Taiwan
|
||||
TZ Tanzania
|
||||
UA Ukraine
|
||||
UG Uganda
|
||||
UM US minor outlying islands
|
||||
US United States
|
||||
UY Uruguay
|
||||
UZ Uzbekistan
|
||||
VA Vatican City
|
||||
VC St Vincent
|
||||
VE Venezuela
|
||||
VG Virgin Islands (UK)
|
||||
VI Virgin Islands (US)
|
||||
VN Vietnam
|
||||
VU Vanuatu
|
||||
WF Wallis & Futuna
|
||||
WS Samoa (western)
|
||||
YE Yemen
|
||||
YT Mayotte
|
||||
ZA South Africa
|
||||
ZM Zambia
|
||||
ZW Zimbabwe
|
||||
255
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/leap-seconds.list
vendored
Normal file
255
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/leap-seconds.list
vendored
Normal file
@@ -0,0 +1,255 @@
|
||||
#
|
||||
# In the following text, the symbol '#' introduces
|
||||
# a comment, which continues from that symbol until
|
||||
# the end of the line. A plain comment line has a
|
||||
# whitespace character following the comment indicator.
|
||||
# There are also special comment lines defined below.
|
||||
# A special comment will always have a non-whitespace
|
||||
# character in column 2.
|
||||
#
|
||||
# A blank line should be ignored.
|
||||
#
|
||||
# The following table shows the corrections that must
|
||||
# be applied to compute International Atomic Time (TAI)
|
||||
# from the Coordinated Universal Time (UTC) values that
|
||||
# are transmitted by almost all time services.
|
||||
#
|
||||
# The first column shows an epoch as a number of seconds
|
||||
# since 1 January 1900, 00:00:00 (1900.0 is also used to
|
||||
# indicate the same epoch.) Both of these time stamp formats
|
||||
# ignore the complexities of the time scales that were
|
||||
# used before the current definition of UTC at the start
|
||||
# of 1972. (See note 3 below.)
|
||||
# The second column shows the number of seconds that
|
||||
# must be added to UTC to compute TAI for any timestamp
|
||||
# at or after that epoch. The value on each line is
|
||||
# valid from the indicated initial instant until the
|
||||
# epoch given on the next one or indefinitely into the
|
||||
# future if there is no next line.
|
||||
# (The comment on each line shows the representation of
|
||||
# the corresponding initial epoch in the usual
|
||||
# day-month-year format. The epoch always begins at
|
||||
# 00:00:00 UTC on the indicated day. See Note 5 below.)
|
||||
#
|
||||
# Important notes:
|
||||
#
|
||||
# 1. Coordinated Universal Time (UTC) is often referred to
|
||||
# as Greenwich Mean Time (GMT). The GMT time scale is no
|
||||
# longer used, and the use of GMT to designate UTC is
|
||||
# discouraged.
|
||||
#
|
||||
# 2. The UTC time scale is realized by many national
|
||||
# laboratories and timing centers. Each laboratory
|
||||
# identifies its realization with its name: Thus
|
||||
# UTC(NIST), UTC(USNO), etc. The differences among
|
||||
# these different realizations are typically on the
|
||||
# order of a few nanoseconds (i.e., 0.000 000 00x s)
|
||||
# and can be ignored for many purposes. These differences
|
||||
# are tabulated in Circular T, which is published monthly
|
||||
# by the International Bureau of Weights and Measures
|
||||
# (BIPM). See www.bipm.org for more information.
|
||||
#
|
||||
# 3. The current definition of the relationship between UTC
|
||||
# and TAI dates from 1 January 1972. A number of different
|
||||
# time scales were in use before that epoch, and it can be
|
||||
# quite difficult to compute precise timestamps and time
|
||||
# intervals in those "prehistoric" days. For more information,
|
||||
# consult:
|
||||
#
|
||||
# The Explanatory Supplement to the Astronomical
|
||||
# Ephemeris.
|
||||
# or
|
||||
# Terry Quinn, "The BIPM and the Accurate Measurement
|
||||
# of Time," Proc. of the IEEE, Vol. 79, pp. 894-905,
|
||||
# July, 1991. <http://dx.doi.org/10.1109/5.84965>
|
||||
# reprinted in:
|
||||
# Christine Hackman and Donald B Sullivan (eds.)
|
||||
# Time and Frequency Measurement
|
||||
# American Association of Physics Teachers (1996)
|
||||
# <http://tf.nist.gov/general/pdf/1168.pdf>, pp. 75-86
|
||||
#
|
||||
# 4. The decision to insert a leap second into UTC is currently
|
||||
# the responsibility of the International Earth Rotation and
|
||||
# Reference Systems Service. (The name was changed from the
|
||||
# International Earth Rotation Service, but the acronym IERS
|
||||
# is still used.)
|
||||
#
|
||||
# Leap seconds are announced by the IERS in its Bulletin C.
|
||||
#
|
||||
# See www.iers.org for more details.
|
||||
#
|
||||
# Every national laboratory and timing center uses the
|
||||
# data from the BIPM and the IERS to construct UTC(lab),
|
||||
# their local realization of UTC.
|
||||
#
|
||||
# Although the definition also includes the possibility
|
||||
# of dropping seconds ("negative" leap seconds), this has
|
||||
# never been done and is unlikely to be necessary in the
|
||||
# foreseeable future.
|
||||
#
|
||||
# 5. If your system keeps time as the number of seconds since
|
||||
# some epoch (e.g., NTP timestamps), then the algorithm for
|
||||
# assigning a UTC time stamp to an event that happens during a positive
|
||||
# leap second is not well defined. The official name of that leap
|
||||
# second is 23:59:60, but there is no way of representing that time
|
||||
# in these systems.
|
||||
# Many systems of this type effectively stop the system clock for
|
||||
# one second during the leap second and use a time that is equivalent
|
||||
# to 23:59:59 UTC twice. For these systems, the corresponding TAI
|
||||
# timestamp would be obtained by advancing to the next entry in the
|
||||
# following table when the time equivalent to 23:59:59 UTC
|
||||
# is used for the second time. Thus the leap second which
|
||||
# occurred on 30 June 1972 at 23:59:59 UTC would have TAI
|
||||
# timestamps computed as follows:
|
||||
#
|
||||
# ...
|
||||
# 30 June 1972 23:59:59 (2287785599, first time): TAI= UTC + 10 seconds
|
||||
# 30 June 1972 23:59:60 (2287785599,second time): TAI= UTC + 11 seconds
|
||||
# 1 July 1972 00:00:00 (2287785600) TAI= UTC + 11 seconds
|
||||
# ...
|
||||
#
|
||||
# If your system realizes the leap second by repeating 00:00:00 UTC twice
|
||||
# (this is possible but not usual), then the advance to the next entry
|
||||
# in the table must occur the second time that a time equivalent to
|
||||
# 00:00:00 UTC is used. Thus, using the same example as above:
|
||||
#
|
||||
# ...
|
||||
# 30 June 1972 23:59:59 (2287785599): TAI= UTC + 10 seconds
|
||||
# 30 June 1972 23:59:60 (2287785600, first time): TAI= UTC + 10 seconds
|
||||
# 1 July 1972 00:00:00 (2287785600,second time): TAI= UTC + 11 seconds
|
||||
# ...
|
||||
#
|
||||
# in both cases the use of timestamps based on TAI produces a smooth
|
||||
# time scale with no discontinuity in the time interval. However,
|
||||
# although the long-term behavior of the time scale is correct in both
|
||||
# methods, the second method is technically not correct because it adds
|
||||
# the extra second to the wrong day.
|
||||
#
|
||||
# This complexity would not be needed for negative leap seconds (if they
|
||||
# are ever used). The UTC time would skip 23:59:59 and advance from
|
||||
# 23:59:58 to 00:00:00 in that case. The TAI offset would decrease by
|
||||
# 1 second at the same instant. This is a much easier situation to deal
|
||||
# with, since the difficulty of unambiguously representing the epoch
|
||||
# during the leap second does not arise.
|
||||
#
|
||||
# Some systems implement leap seconds by amortizing the leap second
|
||||
# over the last few minutes of the day. The frequency of the local
|
||||
# clock is decreased (or increased) to realize the positive (or
|
||||
# negative) leap second. This method removes the time step described
|
||||
# above. Although the long-term behavior of the time scale is correct
|
||||
# in this case, this method introduces an error during the adjustment
|
||||
# period both in time and in frequency with respect to the official
|
||||
# definition of UTC.
|
||||
#
|
||||
# Questions or comments to:
|
||||
# Judah Levine
|
||||
# Time and Frequency Division
|
||||
# NIST
|
||||
# Boulder, Colorado
|
||||
# Judah.Levine@nist.gov
|
||||
#
|
||||
# Last Update of leap second values: 8 July 2016
|
||||
#
|
||||
# The following line shows this last update date in NTP timestamp
|
||||
# format. This is the date on which the most recent change to
|
||||
# the leap second data was added to the file. This line can
|
||||
# be identified by the unique pair of characters in the first two
|
||||
# columns as shown below.
|
||||
#
|
||||
#$ 3676924800
|
||||
#
|
||||
# The NTP timestamps are in units of seconds since the NTP epoch,
|
||||
# which is 1 January 1900, 00:00:00. The Modified Julian Day number
|
||||
# corresponding to the NTP time stamp, X, can be computed as
|
||||
#
|
||||
# X/86400 + 15020
|
||||
#
|
||||
# where the first term converts seconds to days and the second
|
||||
# term adds the MJD corresponding to the time origin defined above.
|
||||
# The integer portion of the result is the integer MJD for that
|
||||
# day, and any remainder is the time of day, expressed as the
|
||||
# fraction of the day since 0 hours UTC. The conversion from day
|
||||
# fraction to seconds or to hours, minutes, and seconds may involve
|
||||
# rounding or truncation, depending on the method used in the
|
||||
# computation.
|
||||
#
|
||||
# The data in this file will be updated periodically as new leap
|
||||
# seconds are announced. In addition to being entered on the line
|
||||
# above, the update time (in NTP format) will be added to the basic
|
||||
# file name leap-seconds to form the name leap-seconds.<NTP TIME>.
|
||||
# In addition, the generic name leap-seconds.list will always point to
|
||||
# the most recent version of the file.
|
||||
#
|
||||
# This update procedure will be performed only when a new leap second
|
||||
# is announced.
|
||||
#
|
||||
# The following entry specifies the expiration date of the data
|
||||
# in this file in units of seconds since the origin at the instant
|
||||
# 1 January 1900, 00:00:00. This expiration date will be changed
|
||||
# at least twice per year whether or not a new leap second is
|
||||
# announced. These semi-annual changes will be made no later
|
||||
# than 1 June and 1 December of each year to indicate what
|
||||
# action (if any) is to be taken on 30 June and 31 December,
|
||||
# respectively. (These are the customary effective dates for new
|
||||
# leap seconds.) This expiration date will be identified by a
|
||||
# unique pair of characters in columns 1 and 2 as shown below.
|
||||
# In the unlikely event that a leap second is announced with an
|
||||
# effective date other than 30 June or 31 December, then this
|
||||
# file will be edited to include that leap second as soon as it is
|
||||
# announced or at least one month before the effective date
|
||||
# (whichever is later).
|
||||
# If an announcement by the IERS specifies that no leap second is
|
||||
# scheduled, then only the expiration date of the file will
|
||||
# be advanced to show that the information in the file is still
|
||||
# current -- the update time stamp, the data and the name of the file
|
||||
# will not change.
|
||||
#
|
||||
# Updated through IERS Bulletin C64
|
||||
# File expires on: 28 June 2023
|
||||
#
|
||||
#@ 3896899200
|
||||
#
|
||||
2272060800 10 # 1 Jan 1972
|
||||
2287785600 11 # 1 Jul 1972
|
||||
2303683200 12 # 1 Jan 1973
|
||||
2335219200 13 # 1 Jan 1974
|
||||
2366755200 14 # 1 Jan 1975
|
||||
2398291200 15 # 1 Jan 1976
|
||||
2429913600 16 # 1 Jan 1977
|
||||
2461449600 17 # 1 Jan 1978
|
||||
2492985600 18 # 1 Jan 1979
|
||||
2524521600 19 # 1 Jan 1980
|
||||
2571782400 20 # 1 Jul 1981
|
||||
2603318400 21 # 1 Jul 1982
|
||||
2634854400 22 # 1 Jul 1983
|
||||
2698012800 23 # 1 Jul 1985
|
||||
2776982400 24 # 1 Jan 1988
|
||||
2840140800 25 # 1 Jan 1990
|
||||
2871676800 26 # 1 Jan 1991
|
||||
2918937600 27 # 1 Jul 1992
|
||||
2950473600 28 # 1 Jul 1993
|
||||
2982009600 29 # 1 Jul 1994
|
||||
3029443200 30 # 1 Jan 1996
|
||||
3076704000 31 # 1 Jul 1997
|
||||
3124137600 32 # 1 Jan 1999
|
||||
3345062400 33 # 1 Jan 2006
|
||||
3439756800 34 # 1 Jan 2009
|
||||
3550089600 35 # 1 Jul 2012
|
||||
3644697600 36 # 1 Jul 2015
|
||||
3692217600 37 # 1 Jan 2017
|
||||
#
|
||||
# the following special comment contains the
|
||||
# hash value of the data in this file computed
|
||||
# use the secure hash algorithm as specified
|
||||
# by FIPS 180-1. See the files in ~/pub/sha for
|
||||
# the details of how this hash value is
|
||||
# computed. Note that the hash computation
|
||||
# ignores comments and whitespace characters
|
||||
# in data lines. It includes the NTP values
|
||||
# of both the last modification time and the
|
||||
# expiration time of the file, but not the
|
||||
# white space on those lines.
|
||||
# the hash line is also ignored in the
|
||||
# computation.
|
||||
#
|
||||
#h 2c413af9 124e1031 f165174 ff527c6b 756ae00b
|
||||
240
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/leapseconds.awk
vendored
Normal file
240
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/leapseconds.awk
vendored
Normal file
@@ -0,0 +1,240 @@
|
||||
# Generate zic format 'leapseconds' from NIST format 'leap-seconds.list'.
|
||||
|
||||
# This file is in the public domain.
|
||||
|
||||
# This program uses awk arithmetic. POSIX requires awk to support
|
||||
# exact integer arithmetic only through 10**10, which means for NTP
|
||||
# timestamps this program works only to the year 2216, which is the
|
||||
# year 1900 plus 10**10 seconds. However, in practice
|
||||
# POSIX-conforming awk implementations invariably use IEEE-754 double
|
||||
# and so support exact integers through 2**53. By the year 2216,
|
||||
# POSIX will almost surely require at least 2**53 for awk, so for NTP
|
||||
# timestamps this program should be good until the year 285,428,681
|
||||
# (the year 1900 plus 2**53 seconds). By then leap seconds will be
|
||||
# long obsolete, as the Earth will likely slow down so much that
|
||||
# there will be more than 25 hours per day and so some other scheme
|
||||
# will be needed.
|
||||
|
||||
BEGIN {
|
||||
print "# Allowance for leap seconds added to each time zone file."
|
||||
print ""
|
||||
print "# This file is in the public domain."
|
||||
print ""
|
||||
print "# This file is generated automatically from the data in the public-domain"
|
||||
print "# NIST format leap-seconds.list file, which can be copied from"
|
||||
print "# <ftp://ftp.nist.gov/pub/time/leap-seconds.list>"
|
||||
print "# or <ftp://ftp.boulder.nist.gov/pub/time/leap-seconds.list>."
|
||||
print "# The NIST file is used instead of its IERS upstream counterpart"
|
||||
print "# <https://hpiers.obspm.fr/iers/bul/bulc/ntp/leap-seconds.list>"
|
||||
print "# because under US law the NIST file is public domain"
|
||||
print "# whereas the IERS file's copyright and license status is unclear."
|
||||
print "# For more about leap-seconds.list, please see"
|
||||
print "# The NTP Timescale and Leap Seconds"
|
||||
print "# <https://www.eecis.udel.edu/~mills/leap.html>."
|
||||
print ""
|
||||
print "# The rules for leap seconds are specified in Annex 1 (Time scales) of:"
|
||||
print "# Standard-frequency and time-signal emissions."
|
||||
print "# International Telecommunication Union - Radiocommunication Sector"
|
||||
print "# (ITU-R) Recommendation TF.460-6 (02/2002)"
|
||||
print "# <https://www.itu.int/rec/R-REC-TF.460-6-200202-I/>."
|
||||
print "# The International Earth Rotation and Reference Systems Service (IERS)"
|
||||
print "# periodically uses leap seconds to keep UTC to within 0.9 s of UT1"
|
||||
print "# (a proxy for Earth's angle in space as measured by astronomers)"
|
||||
print "# and publishes leap second data in a copyrighted file"
|
||||
print "# <https://hpiers.obspm.fr/iers/bul/bulc/Leap_Second.dat>."
|
||||
print "# See: Levine J. Coordinated Universal Time and the leap second."
|
||||
print "# URSI Radio Sci Bull. 2016;89(4):30-6. doi:10.23919/URSIRSB.2016.7909995"
|
||||
print "# <https://ieeexplore.ieee.org/document/7909995>."
|
||||
print ""
|
||||
print "# There were no leap seconds before 1972, as no official mechanism"
|
||||
print "# accounted for the discrepancy between atomic time (TAI) and the earth's"
|
||||
print "# rotation. The first (\"1 Jan 1972\") data line in leap-seconds.list"
|
||||
print "# does not denote a leap second; it denotes the start of the current definition"
|
||||
print "# of UTC."
|
||||
print ""
|
||||
print "# All leap-seconds are Stationary (S) at the given UTC time."
|
||||
print "# The correction (+ or -) is made at the given time, so in the unlikely"
|
||||
print "# event of a negative leap second, a line would look like this:"
|
||||
print "# Leap YEAR MON DAY 23:59:59 - S"
|
||||
print "# Typical lines look like this:"
|
||||
print "# Leap YEAR MON DAY 23:59:60 + S"
|
||||
|
||||
monthabbr[ 1] = "Jan"
|
||||
monthabbr[ 2] = "Feb"
|
||||
monthabbr[ 3] = "Mar"
|
||||
monthabbr[ 4] = "Apr"
|
||||
monthabbr[ 5] = "May"
|
||||
monthabbr[ 6] = "Jun"
|
||||
monthabbr[ 7] = "Jul"
|
||||
monthabbr[ 8] = "Aug"
|
||||
monthabbr[ 9] = "Sep"
|
||||
monthabbr[10] = "Oct"
|
||||
monthabbr[11] = "Nov"
|
||||
monthabbr[12] = "Dec"
|
||||
|
||||
sstamp_init()
|
||||
}
|
||||
|
||||
# In case the input has CRLF form a la NIST.
|
||||
{ sub(/\r$/, "") }
|
||||
|
||||
/^#[ \t]*[Uu]pdated through/ || /^#[ \t]*[Ff]ile expires on/ {
|
||||
last_lines = last_lines $0 "\n"
|
||||
}
|
||||
|
||||
/^#[$][ \t]/ { updated = $2 }
|
||||
/^#[@][ \t]/ { expires = $2 }
|
||||
|
||||
/^[ \t]*#/ { next }
|
||||
|
||||
{
|
||||
NTP_timestamp = $1
|
||||
TAI_minus_UTC = $2
|
||||
if (old_TAI_minus_UTC) {
|
||||
if (old_TAI_minus_UTC < TAI_minus_UTC) {
|
||||
sign = "23:59:60\t+"
|
||||
} else {
|
||||
sign = "23:59:59\t-"
|
||||
}
|
||||
sstamp_to_ymdhMs(NTP_timestamp - 1, ss_NTP)
|
||||
printf "Leap\t%d\t%s\t%d\t%s\tS\n", \
|
||||
ss_year, monthabbr[ss_month], ss_mday, sign
|
||||
}
|
||||
old_TAI_minus_UTC = TAI_minus_UTC
|
||||
}
|
||||
|
||||
END {
|
||||
sstamp_to_ymdhMs(expires, ss_NTP)
|
||||
|
||||
print ""
|
||||
print "# UTC timestamp when this leap second list expires."
|
||||
print "# Any additional leap seconds will come after this."
|
||||
if (! EXPIRES_LINE) {
|
||||
print "# This Expires line is commented out for now,"
|
||||
print "# so that pre-2020a zic implementations do not reject this file."
|
||||
}
|
||||
printf "%sExpires %.4d\t%s\t%.2d\t%.2d:%.2d:%.2d\n", \
|
||||
EXPIRES_LINE ? "" : "#", \
|
||||
ss_year, monthabbr[ss_month], ss_mday, ss_hour, ss_min, ss_sec
|
||||
|
||||
# The difference between the NTP and POSIX epochs is 70 years
|
||||
# (including 17 leap days), each 24 hours of 60 minutes of 60
|
||||
# seconds each.
|
||||
epoch_minus_NTP = ((1970 - 1900) * 365 + 17) * 24 * 60 * 60
|
||||
|
||||
print ""
|
||||
print "# POSIX timestamps for the data in this file:"
|
||||
sstamp_to_ymdhMs(updated, ss_NTP)
|
||||
printf "#updated %d (%.4d-%.2d-%.2d %.2d:%.2d:%.2d UTC)\n", \
|
||||
updated - epoch_minus_NTP, \
|
||||
ss_year, ss_month, ss_mday, ss_hour, ss_min, ss_sec
|
||||
sstamp_to_ymdhMs(expires, ss_NTP)
|
||||
printf "#expires %d (%.4d-%.2d-%.2d %.2d:%.2d:%.2d UTC)\n", \
|
||||
expires - epoch_minus_NTP, \
|
||||
ss_year, ss_month, ss_mday, ss_hour, ss_min, ss_sec
|
||||
|
||||
printf "\n%s", last_lines
|
||||
}
|
||||
|
||||
# sstamp_to_ymdhMs - convert seconds timestamp to date and time
|
||||
#
|
||||
# Call as:
|
||||
#
|
||||
# sstamp_to_ymdhMs(sstamp, epoch_days)
|
||||
#
|
||||
# where:
|
||||
#
|
||||
# sstamp - is the seconds timestamp.
|
||||
# epoch_days - is the timestamp epoch in Gregorian days since 1600-03-01.
|
||||
# ss_NTP is appropriate for an NTP sstamp.
|
||||
#
|
||||
# Both arguments should be nonnegative integers.
|
||||
# On return, the following variables are set based on sstamp:
|
||||
#
|
||||
# ss_year - Gregorian calendar year
|
||||
# ss_month - month of the year (1-January to 12-December)
|
||||
# ss_mday - day of the month (1-31)
|
||||
# ss_hour - hour (0-23)
|
||||
# ss_min - minute (0-59)
|
||||
# ss_sec - second (0-59)
|
||||
# ss_wday - day of week (0-Sunday to 6-Saturday)
|
||||
#
|
||||
# The function sstamp_init should be called prior to using sstamp_to_ymdhMs.
|
||||
|
||||
function sstamp_init()
|
||||
{
|
||||
# Days in month N, where March is month 0 and January month 10.
|
||||
ss_mon_days[ 0] = 31
|
||||
ss_mon_days[ 1] = 30
|
||||
ss_mon_days[ 2] = 31
|
||||
ss_mon_days[ 3] = 30
|
||||
ss_mon_days[ 4] = 31
|
||||
ss_mon_days[ 5] = 31
|
||||
ss_mon_days[ 6] = 30
|
||||
ss_mon_days[ 7] = 31
|
||||
ss_mon_days[ 8] = 30
|
||||
ss_mon_days[ 9] = 31
|
||||
ss_mon_days[10] = 31
|
||||
|
||||
# Counts of days in a Gregorian year, quad-year, century, and quad-century.
|
||||
ss_year_days = 365
|
||||
ss_quadyear_days = ss_year_days * 4 + 1
|
||||
ss_century_days = ss_quadyear_days * 25 - 1
|
||||
ss_quadcentury_days = ss_century_days * 4 + 1
|
||||
|
||||
# Standard day epochs, suitable for epoch_days.
|
||||
# ss_MJD = 94493
|
||||
# ss_POSIX = 135080
|
||||
ss_NTP = 109513
|
||||
}
|
||||
|
||||
function sstamp_to_ymdhMs(sstamp, epoch_days, \
|
||||
quadcentury, century, quadyear, year, month, day)
|
||||
{
|
||||
ss_hour = int(sstamp / 3600) % 24
|
||||
ss_min = int(sstamp / 60) % 60
|
||||
ss_sec = sstamp % 60
|
||||
|
||||
# Start with a count of days since 1600-03-01 Gregorian.
|
||||
day = epoch_days + int(sstamp / (24 * 60 * 60))
|
||||
|
||||
# Compute a year-month-day date with days of the month numbered
|
||||
# 0-30, months (March-February) numbered 0-11, and years that start
|
||||
# start March 1 and end after the last day of February. A quad-year
|
||||
# starts on March 1 of a year evenly divisible by 4 and ends after
|
||||
# the last day of February 4 years later. A century starts on and
|
||||
# ends before March 1 in years evenly divisible by 100.
|
||||
# A quad-century starts on and ends before March 1 in years divisible
|
||||
# by 400. While the number of days in a quad-century is a constant,
|
||||
# the number of days in each other time period can vary by 1.
|
||||
# Any variation is in the last day of the time period (there might
|
||||
# or might not be a February 29) where it is easy to deal with.
|
||||
|
||||
quadcentury = int(day / ss_quadcentury_days)
|
||||
day -= quadcentury * ss_quadcentury_days
|
||||
ss_wday = (day + 3) % 7
|
||||
century = int(day / ss_century_days)
|
||||
century -= century == 4
|
||||
day -= century * ss_century_days
|
||||
quadyear = int(day / ss_quadyear_days)
|
||||
day -= quadyear * ss_quadyear_days
|
||||
year = int(day / ss_year_days)
|
||||
year -= year == 4
|
||||
day -= year * ss_year_days
|
||||
for (month = 0; month < 11; month++) {
|
||||
if (day < ss_mon_days[month])
|
||||
break
|
||||
day -= ss_mon_days[month]
|
||||
}
|
||||
|
||||
# Convert the date to a conventional day of month (1-31),
|
||||
# month (1-12, January-December) and Gregorian year.
|
||||
ss_mday = day + 1
|
||||
if (month <= 9) {
|
||||
ss_month = month + 3
|
||||
} else {
|
||||
ss_month = month - 9
|
||||
year++
|
||||
}
|
||||
ss_year = 1600 + quadcentury * 400 + century * 100 + quadyear * 4 + year
|
||||
}
|
||||
2499
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/localtime.c
vendored
Normal file
2499
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/localtime.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
344
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/newctime.3
vendored
Normal file
344
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/newctime.3
vendored
Normal file
@@ -0,0 +1,344 @@
|
||||
.\" This file is in the public domain, so clarified as of
|
||||
.\" 2009-05-17 by Arthur David Olson.
|
||||
.TH NEWCTIME 3
|
||||
.SH NAME
|
||||
asctime, ctime, difftime, gmtime, localtime, mktime \- convert date and time
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.ie \n(.g .ds - \f(CR-\fP
|
||||
.el .ds - \-
|
||||
.B #include <time.h>
|
||||
.PP
|
||||
.BR "extern char *tzname[];" " /\(** (optional) \(**/"
|
||||
.PP
|
||||
.B char *ctime(time_t const *clock);
|
||||
.PP
|
||||
.B char *ctime_r(time_t const *clock, char *buf);
|
||||
.PP
|
||||
.B double difftime(time_t time1, time_t time0);
|
||||
.PP
|
||||
.B char *asctime(struct tm const *tm);
|
||||
.PP
|
||||
.B "char *asctime_r(struct tm const *restrict tm,"
|
||||
.B " char *restrict result);"
|
||||
.PP
|
||||
.B struct tm *localtime(time_t const *clock);
|
||||
.PP
|
||||
.B "struct tm *localtime_r(time_t const *restrict clock,"
|
||||
.B " struct tm *restrict result);"
|
||||
.PP
|
||||
.B "struct tm *localtime_rz(timezone_t restrict zone,"
|
||||
.B " time_t const *restrict clock,"
|
||||
.B " struct tm *restrict result);"
|
||||
.PP
|
||||
.B struct tm *gmtime(time_t const *clock);
|
||||
.PP
|
||||
.B "struct tm *gmtime_r(time_t const *restrict clock,"
|
||||
.B " struct tm *restrict result);"
|
||||
.PP
|
||||
.B time_t mktime(struct tm *tm);
|
||||
.PP
|
||||
.B "time_t mktime_z(timezone_t restrict zone,"
|
||||
.B " struct tm *restrict tm);"
|
||||
.PP
|
||||
.B cc ... \*-ltz
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
.ie '\(en'' .ds en \-
|
||||
.el .ds en \(en
|
||||
.ie '\(lq'' .ds lq \&"\"
|
||||
.el .ds lq \(lq\"
|
||||
.ie '\(rq'' .ds rq \&"\"
|
||||
.el .ds rq \(rq\"
|
||||
.de q
|
||||
\\$3\*(lq\\$1\*(rq\\$2
|
||||
..
|
||||
The
|
||||
.B ctime
|
||||
function
|
||||
converts a long integer, pointed to by
|
||||
.IR clock ,
|
||||
and returns a pointer to a
|
||||
string of the form
|
||||
.br
|
||||
.ce
|
||||
.eo
|
||||
Thu Nov 24 18:22:48 1986\n\0
|
||||
.br
|
||||
.ec
|
||||
Years requiring fewer than four characters are padded with leading zeroes.
|
||||
For years longer than four characters, the string is of the form
|
||||
.br
|
||||
.ce
|
||||
.eo
|
||||
Thu Nov 24 18:22:48 81986\n\0
|
||||
.ec
|
||||
.br
|
||||
with five spaces before the year.
|
||||
These unusual formats are designed to make it less likely that older
|
||||
software that expects exactly 26 bytes of output will mistakenly output
|
||||
misleading values for out-of-range years.
|
||||
.PP
|
||||
The
|
||||
.BI * clock
|
||||
timestamp represents the time in seconds since 1970-01-01 00:00:00
|
||||
Coordinated Universal Time (UTC).
|
||||
The POSIX standard says that timestamps must be nonnegative
|
||||
and must ignore leap seconds.
|
||||
Many implementations extend POSIX by allowing negative timestamps,
|
||||
and can therefore represent timestamps that predate the
|
||||
introduction of UTC and are some other flavor of Universal Time (UT).
|
||||
Some implementations support leap seconds, in contradiction to POSIX.
|
||||
.PP
|
||||
The
|
||||
.B localtime
|
||||
and
|
||||
.B gmtime
|
||||
functions
|
||||
return pointers to
|
||||
.q "tm"
|
||||
structures, described below.
|
||||
The
|
||||
.B localtime
|
||||
function
|
||||
corrects for the time zone and any time zone adjustments
|
||||
(such as Daylight Saving Time in the United States).
|
||||
After filling in the
|
||||
.q "tm"
|
||||
structure,
|
||||
.B localtime
|
||||
sets the
|
||||
.BR tm_isdst 'th
|
||||
element of
|
||||
.B tzname
|
||||
to a pointer to a string that's the time zone abbreviation to be used with
|
||||
.BR localtime 's
|
||||
return value.
|
||||
.PP
|
||||
The
|
||||
.B gmtime
|
||||
function
|
||||
converts to Coordinated Universal Time.
|
||||
.PP
|
||||
The
|
||||
.B asctime
|
||||
function
|
||||
converts a time value contained in a
|
||||
.q "tm"
|
||||
structure to a string,
|
||||
as shown in the above example,
|
||||
and returns a pointer to the string.
|
||||
.PP
|
||||
The
|
||||
.B mktime
|
||||
function
|
||||
converts the broken-down time,
|
||||
expressed as local time,
|
||||
in the structure pointed to by
|
||||
.I tm
|
||||
into a calendar time value with the same encoding as that of the values
|
||||
returned by the
|
||||
.B time
|
||||
function.
|
||||
The original values of the
|
||||
.B tm_wday
|
||||
and
|
||||
.B tm_yday
|
||||
components of the structure are ignored,
|
||||
and the original values of the other components are not restricted
|
||||
to their normal ranges.
|
||||
(A positive or zero value for
|
||||
.B tm_isdst
|
||||
causes
|
||||
.B mktime
|
||||
to presume initially that daylight saving time
|
||||
respectively,
|
||||
is or is not in effect for the specified time.
|
||||
A negative value for
|
||||
.B tm_isdst
|
||||
causes the
|
||||
.B mktime
|
||||
function to attempt to divine whether daylight saving time is in effect
|
||||
for the specified time; in this case it does not use a consistent
|
||||
rule and may give a different answer when later
|
||||
presented with the same argument.)
|
||||
On successful completion, the values of the
|
||||
.B tm_wday
|
||||
and
|
||||
.B tm_yday
|
||||
components of the structure are set appropriately,
|
||||
and the other components are set to represent the specified calendar time,
|
||||
but with their values forced to their normal ranges; the final value of
|
||||
.B tm_mday
|
||||
is not set until
|
||||
.B tm_mon
|
||||
and
|
||||
.B tm_year
|
||||
are determined.
|
||||
The
|
||||
.B mktime
|
||||
function
|
||||
returns the specified calendar time;
|
||||
If the calendar time cannot be represented,
|
||||
it returns \-1.
|
||||
.PP
|
||||
The
|
||||
.B difftime
|
||||
function
|
||||
returns the difference between two calendar times,
|
||||
.RI ( time1
|
||||
\-
|
||||
.IR time0 ),
|
||||
expressed in seconds.
|
||||
.PP
|
||||
The
|
||||
.BR ctime_r ,
|
||||
.BR localtime_r ,
|
||||
.BR gmtime_r ,
|
||||
and
|
||||
.B asctime_r
|
||||
functions
|
||||
are like their unsuffixed counterparts, except that they accept an
|
||||
additional argument specifying where to store the result if successful.
|
||||
.PP
|
||||
The
|
||||
.B localtime_rz
|
||||
and
|
||||
.B mktime_z
|
||||
functions
|
||||
are like their unsuffixed counterparts, except that they accept an
|
||||
extra initial
|
||||
.B zone
|
||||
argument specifying the timezone to be used for conversion.
|
||||
If
|
||||
.B zone
|
||||
is null, UT is used; otherwise,
|
||||
.B zone
|
||||
should be have been allocated by
|
||||
.B tzalloc
|
||||
and should not be freed until after all uses (e.g., by calls to
|
||||
.BR strftime )
|
||||
of the filled-in
|
||||
.B tm_zone
|
||||
fields.
|
||||
.PP
|
||||
Declarations of all the functions and externals, and the
|
||||
.q "tm"
|
||||
structure,
|
||||
are in the
|
||||
.B <time.h>
|
||||
header file.
|
||||
The structure (of type)
|
||||
.B struct tm
|
||||
includes the following fields:
|
||||
.RS
|
||||
.PP
|
||||
.nf
|
||||
.ta 2n +\w'long tm_gmtoff;nn'u
|
||||
int tm_sec; /\(** seconds (0\*(en60) \(**/
|
||||
int tm_min; /\(** minutes (0\*(en59) \(**/
|
||||
int tm_hour; /\(** hours (0\*(en23) \(**/
|
||||
int tm_mday; /\(** day of month (1\*(en31) \(**/
|
||||
int tm_mon; /\(** month of year (0\*(en11) \(**/
|
||||
int tm_year; /\(** year \- 1900 \(**/
|
||||
int tm_wday; /\(** day of week (Sunday = 0) \(**/
|
||||
int tm_yday; /\(** day of year (0\*(en365) \(**/
|
||||
int tm_isdst; /\(** is daylight saving time in effect? \(**/
|
||||
char \(**tm_zone; /\(** time zone abbreviation (optional) \(**/
|
||||
long tm_gmtoff; /\(** offset from UT in seconds (optional) \(**/
|
||||
.fi
|
||||
.RE
|
||||
.PP
|
||||
The
|
||||
.B tm_isdst
|
||||
field
|
||||
is non-zero if daylight saving time is in effect.
|
||||
.PP
|
||||
The
|
||||
.B tm_gmtoff
|
||||
field
|
||||
is the offset (in seconds) of the time represented
|
||||
from UT, with positive values indicating east
|
||||
of the Prime Meridian.
|
||||
The field's name is derived from Greenwich Mean Time, a precursor of UT.
|
||||
.PP
|
||||
In
|
||||
.B "struct tm"
|
||||
the
|
||||
.B tm_zone
|
||||
and
|
||||
.B tm_gmtoff
|
||||
fields exist, and are filled in, only if arrangements to do
|
||||
so were made when the library containing these functions was
|
||||
created.
|
||||
Similarly, the
|
||||
.B tzname
|
||||
variable is optional; also, there is no guarantee that
|
||||
.B tzname
|
||||
will
|
||||
continue to exist in this form in future releases of this code.
|
||||
.SH FILES
|
||||
.ta \w'/usr/share/zoneinfo/posixrules\0\0'u
|
||||
/usr/share/zoneinfo timezone information directory
|
||||
.br
|
||||
/usr/share/zoneinfo/localtime local timezone file
|
||||
.br
|
||||
/usr/share/zoneinfo/posixrules used with POSIX-style TZ's
|
||||
.br
|
||||
/usr/share/zoneinfo/GMT for UTC leap seconds
|
||||
.sp
|
||||
If
|
||||
.B /usr/share/zoneinfo/GMT
|
||||
is absent,
|
||||
UTC leap seconds are loaded from
|
||||
.BR /usr/share/zoneinfo/posixrules .
|
||||
.SH SEE ALSO
|
||||
getenv(3),
|
||||
newstrftime(3),
|
||||
newtzset(3),
|
||||
time(2),
|
||||
tzfile(5)
|
||||
.SH NOTES
|
||||
The return values of
|
||||
.BR asctime ,
|
||||
.BR ctime ,
|
||||
.BR gmtime ,
|
||||
and
|
||||
.B localtime
|
||||
point to static data
|
||||
overwritten by each call.
|
||||
The
|
||||
.B tzname
|
||||
variable (once set) and the
|
||||
.B tm_zone
|
||||
field of a returned
|
||||
.B "struct tm"
|
||||
both point to an array of characters that
|
||||
can be freed or overwritten by later calls to the functions
|
||||
.BR localtime ,
|
||||
.BR tzfree ,
|
||||
and
|
||||
.BR tzset ,
|
||||
if these functions affect the timezone information that specifies the
|
||||
abbreviation in question.
|
||||
The remaining functions and data are thread-safe.
|
||||
.PP
|
||||
The
|
||||
.BR asctime ,
|
||||
.BR asctime_r ,
|
||||
.BR ctime ,
|
||||
and
|
||||
.B ctime_r
|
||||
functions
|
||||
behave strangely for years before 1000 or after 9999.
|
||||
The 1989 and 1999 editions of the C Standard say
|
||||
that years from \-99 through 999 are converted without
|
||||
extra spaces, but this conflicts with longstanding
|
||||
tradition and with this implementation.
|
||||
The 2011 edition says that the behavior
|
||||
is undefined if the year is before 1000 or after 9999.
|
||||
Traditional implementations of these two functions are
|
||||
restricted to years in the range 1900 through 2099.
|
||||
To avoid this portability mess, new programs should use
|
||||
.B strftime
|
||||
instead.
|
||||
290
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/newstrftime.3
vendored
Normal file
290
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/newstrftime.3
vendored
Normal file
@@ -0,0 +1,290 @@
|
||||
.\" strftime man page
|
||||
.\"
|
||||
.\" Based on the UCB file whose corrected copyright information appears below.
|
||||
.\" Copyright 1989, 1991 The Regents of the University of California.
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" This code is derived from software contributed to Berkeley by
|
||||
.\" the American National Standards Committee X3, on Information
|
||||
.\" Processing Systems.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" from: @(#)strftime.3 5.12 (Berkeley) 6/29/91
|
||||
.\" $Id: strftime.3,v 1.4 1993/12/15 20:33:00 jtc Exp $
|
||||
.\"
|
||||
.TH NEWSTRFTIME 3
|
||||
.SH NAME
|
||||
strftime \- format date and time
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.ie \n(.g .ds - \f(CR-\fP
|
||||
.el .ds - \-
|
||||
.B #include <time.h>
|
||||
.PP
|
||||
.B "size_t strftime(char *restrict buf, size_t maxsize,"
|
||||
.B " char const *restrict format, struct tm const *restrict timeptr);"
|
||||
.PP
|
||||
.B cc ... \-ltz
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
.ie '\(lq'' .ds lq \&"\"
|
||||
.el .ds lq \(lq\"
|
||||
.ie '\(rq'' .ds rq \&"\"
|
||||
.el .ds rq \(rq\"
|
||||
.de c
|
||||
.ie \n(.g \f(CR\\$1\fP\\$2
|
||||
.el \\$1\\$2
|
||||
..
|
||||
.de q
|
||||
\\$3\*(lq\\$1\*(rq\\$2
|
||||
..
|
||||
The
|
||||
.B strftime
|
||||
function formats the information from
|
||||
.I timeptr
|
||||
into the array pointed to by
|
||||
.I buf
|
||||
according to the string pointed to by
|
||||
.IR format .
|
||||
.PP
|
||||
The
|
||||
.I format
|
||||
string consists of zero or more conversion specifications and
|
||||
ordinary characters.
|
||||
All ordinary characters are copied directly into the array.
|
||||
A conversion specification consists of a percent sign
|
||||
.Ql %
|
||||
and one other character.
|
||||
.PP
|
||||
No more than
|
||||
.I maxsize
|
||||
bytes are placed into the array.
|
||||
.PP
|
||||
Each conversion specification is replaced by the characters as
|
||||
follows which are then copied into the array.
|
||||
.TP
|
||||
%A
|
||||
is replaced by the locale's full weekday name.
|
||||
.TP
|
||||
%a
|
||||
is replaced by the locale's abbreviated weekday name.
|
||||
.TP
|
||||
%B
|
||||
is replaced by the locale's full month name.
|
||||
.TP
|
||||
%b or %h
|
||||
is replaced by the locale's abbreviated month name.
|
||||
.TP
|
||||
%C
|
||||
is replaced by the century (a year divided by 100 and truncated to an integer)
|
||||
as a decimal number [00,99].
|
||||
.TP
|
||||
%c
|
||||
is replaced by the locale's appropriate date and time representation.
|
||||
.TP
|
||||
%D
|
||||
is equivalent to
|
||||
.c %m/%d/%y .
|
||||
.TP
|
||||
%d
|
||||
is replaced by the day of the month as a decimal number [01,31].
|
||||
.TP
|
||||
%e
|
||||
is replaced by the day of month as a decimal number [1,31];
|
||||
single digits are preceded by a blank.
|
||||
.TP
|
||||
%F
|
||||
is equivalent to
|
||||
.c %Y-%m-%d
|
||||
(the ISO 8601 date format).
|
||||
.TP
|
||||
%G
|
||||
is replaced by the ISO 8601 year with century as a decimal number.
|
||||
See also the
|
||||
.c %V
|
||||
conversion specification.
|
||||
.TP
|
||||
%g
|
||||
is replaced by the ISO 8601 year without century as a decimal number [00,99].
|
||||
This is the year that includes the greater part of the week.
|
||||
(Monday as the first day of a week).
|
||||
See also the
|
||||
.c %V
|
||||
conversion specification.
|
||||
.TP
|
||||
%H
|
||||
is replaced by the hour (24-hour clock) as a decimal number [00,23].
|
||||
.TP
|
||||
%I
|
||||
is replaced by the hour (12-hour clock) as a decimal number [01,12].
|
||||
.TP
|
||||
%j
|
||||
is replaced by the day of the year as a decimal number [001,366].
|
||||
.TP
|
||||
%k
|
||||
is replaced by the hour (24-hour clock) as a decimal number [0,23];
|
||||
single digits are preceded by a blank.
|
||||
.TP
|
||||
%l
|
||||
is replaced by the hour (12-hour clock) as a decimal number [1,12];
|
||||
single digits are preceded by a blank.
|
||||
.TP
|
||||
%M
|
||||
is replaced by the minute as a decimal number [00,59].
|
||||
.TP
|
||||
%m
|
||||
is replaced by the month as a decimal number [01,12].
|
||||
.TP
|
||||
%n
|
||||
is replaced by a newline.
|
||||
.TP
|
||||
%p
|
||||
is replaced by the locale's equivalent of either
|
||||
.q AM
|
||||
or
|
||||
.q PM .
|
||||
.TP
|
||||
%R
|
||||
is replaced by the time in the format
|
||||
.c %H:%M .
|
||||
.TP
|
||||
%r
|
||||
is replaced by the locale's representation of 12-hour clock time
|
||||
using AM/PM notation.
|
||||
.TP
|
||||
%S
|
||||
is replaced by the second as a decimal number [00,60].
|
||||
The range of
|
||||
seconds is [00,60] instead of [00,59] to allow for the periodic occurrence
|
||||
of leap seconds.
|
||||
.TP
|
||||
%s
|
||||
is replaced by the number of seconds since the Epoch (see
|
||||
.BR ctime (3)).
|
||||
.TP
|
||||
%T
|
||||
is replaced by the time in the format
|
||||
.c %H:%M:%S .
|
||||
.TP
|
||||
%t
|
||||
is replaced by a tab.
|
||||
.TP
|
||||
%U
|
||||
is replaced by the week number of the year (Sunday as the first day of
|
||||
the week) as a decimal number [00,53].
|
||||
.TP
|
||||
%u
|
||||
is replaced by the weekday (Monday as the first day of the week)
|
||||
as a decimal number [1,7].
|
||||
.TP
|
||||
%V
|
||||
is replaced by the week number of the year (Monday as the first day of
|
||||
the week) as a decimal number [01,53]. If the week containing January
|
||||
1 has four or more days in the new year, then it is week 1; otherwise
|
||||
it is week 53 of the previous year, and the next week is week 1.
|
||||
The year is given by the
|
||||
.c %G
|
||||
conversion specification.
|
||||
.TP
|
||||
%W
|
||||
is replaced by the week number of the year (Monday as the first day of
|
||||
the week) as a decimal number [00,53].
|
||||
.TP
|
||||
%w
|
||||
is replaced by the weekday (Sunday as the first day of the week)
|
||||
as a decimal number [0,6].
|
||||
.TP
|
||||
%X
|
||||
is replaced by the locale's appropriate time representation.
|
||||
.TP
|
||||
%x
|
||||
is replaced by the locale's appropriate date representation.
|
||||
.TP
|
||||
%Y
|
||||
is replaced by the year with century as a decimal number.
|
||||
.TP
|
||||
%y
|
||||
is replaced by the year without century as a decimal number [00,99].
|
||||
.TP
|
||||
%Z
|
||||
is replaced by the time zone abbreviation,
|
||||
or by the empty string if this is not determinable.
|
||||
.TP
|
||||
%z
|
||||
is replaced by the offset from the Prime Meridian
|
||||
in the format +HHMM or \*-HHMM (ISO 8601) as appropriate,
|
||||
with positive values representing locations east of Greenwich,
|
||||
or by the empty string if this is not determinable.
|
||||
The numeric time zone abbreviation \*-0000 is used when the time is
|
||||
Universal Time
|
||||
but local time is indeterminate; by convention this is used for
|
||||
locations while uninhabited, and corresponds to a zero offset when the
|
||||
time zone abbreviation begins with
|
||||
.q "\*-" .
|
||||
.TP
|
||||
%%
|
||||
is replaced by a single %.
|
||||
.TP
|
||||
%+
|
||||
is replaced by the locale's date and time in
|
||||
.BR date (1)
|
||||
format.
|
||||
.SH "RETURN VALUE"
|
||||
If the conversion is successful,
|
||||
.B strftime
|
||||
returns the number of bytes placed into the array, not counting the
|
||||
terminating NUL;
|
||||
.B errno
|
||||
is unchanged if the returned value is zero.
|
||||
Otherwise,
|
||||
.B errno
|
||||
is set to indicate the error, zero is returned,
|
||||
and the array contents are unspecified.
|
||||
.SH ERRORS
|
||||
This function fails if:
|
||||
.TP
|
||||
[ERANGE]
|
||||
The total number of resulting bytes, including the terminating
|
||||
NUL character, is more than
|
||||
.IR maxsize .
|
||||
.PP
|
||||
This function may fail if:
|
||||
.TP
|
||||
[EOVERFLOW]
|
||||
The format includes an
|
||||
.c %s
|
||||
conversion and the number of seconds since the Epoch cannot be represented
|
||||
in a
|
||||
.c time_t .
|
||||
.SH SEE ALSO
|
||||
date(1),
|
||||
getenv(3),
|
||||
newctime(3),
|
||||
newtzset(3),
|
||||
time(2),
|
||||
tzfile(5)
|
||||
.SH BUGS
|
||||
There is no conversion specification for the phase of the moon.
|
||||
350
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/newtzset.3
vendored
Normal file
350
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/newtzset.3
vendored
Normal file
@@ -0,0 +1,350 @@
|
||||
.\" This file is in the public domain, so clarified as of
|
||||
.\" 2009-05-17 by Arthur David Olson.
|
||||
.TH NEWTZSET 3
|
||||
.SH NAME
|
||||
tzset \- initialize time conversion information
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.ie \n(.g .ds - \f(CR-\fP
|
||||
.el .ds - \-
|
||||
.B #include <time.h>
|
||||
.PP
|
||||
.B timezone_t tzalloc(char const *TZ);
|
||||
.PP
|
||||
.B void tzfree(timezone_t tz);
|
||||
.PP
|
||||
.B void tzset(void);
|
||||
.PP
|
||||
.B cc ... \*-ltz
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
.ie '\(en'' .ds en \-
|
||||
.el .ds en \(en
|
||||
.ie '\(lq'' .ds lq \&"\"
|
||||
.el .ds lq \(lq\"
|
||||
.ie '\(rq'' .ds rq \&"\"
|
||||
.el .ds rq \(rq\"
|
||||
.de q
|
||||
\\$3\*(lq\\$1\*(rq\\$2
|
||||
..
|
||||
The
|
||||
.B tzalloc
|
||||
function
|
||||
allocates and returns a timezone object described by
|
||||
.BR TZ .
|
||||
If
|
||||
.B TZ
|
||||
is not a valid timezone description, or if the object cannot be allocated,
|
||||
.B tzalloc
|
||||
returns a null pointer and sets
|
||||
.BR errno .
|
||||
.PP
|
||||
The
|
||||
.B tzfree
|
||||
function
|
||||
frees a timezone object
|
||||
.BR tz ,
|
||||
which should have been successfully allocated by
|
||||
.BR tzalloc .
|
||||
This invalidates any
|
||||
.B tm_zone
|
||||
pointers that
|
||||
.B tz
|
||||
was used to set.
|
||||
.PP
|
||||
The
|
||||
.B tzset
|
||||
function
|
||||
acts like
|
||||
.BR tzalloc(getenv("TZ")) ,
|
||||
except it saves any resulting timezone object into internal
|
||||
storage that is accessed by
|
||||
.BR localtime ,
|
||||
.BR localtime_r ,
|
||||
and
|
||||
.BR mktime .
|
||||
The anonymous shared timezone object is freed by the next call to
|
||||
.BR tzset .
|
||||
If the implied call to
|
||||
.B tzalloc
|
||||
fails,
|
||||
.B tzset
|
||||
falls back on Universal Time (UT).
|
||||
.PP
|
||||
If
|
||||
.B TZ
|
||||
is null, the best available approximation to local (wall
|
||||
clock) time, as specified by the
|
||||
.BR tzfile (5)-format
|
||||
file
|
||||
.B localtime
|
||||
in the system time conversion information directory, is used.
|
||||
If
|
||||
.B TZ
|
||||
is the empty string,
|
||||
UT is used, with the abbreviation "UTC"
|
||||
and without leap second correction; please see
|
||||
.BR newctime (3)
|
||||
for more about UT, UTC, and leap seconds. If
|
||||
.B TZ
|
||||
is nonnull and nonempty:
|
||||
.IP
|
||||
if the value begins with a colon, it is used as a pathname of a file
|
||||
from which to read the time conversion information;
|
||||
.IP
|
||||
if the value does not begin with a colon, it is first used as the
|
||||
pathname of a file from which to read the time conversion information,
|
||||
and, if that file cannot be read, is used directly as a specification of
|
||||
the time conversion information.
|
||||
.PP
|
||||
When
|
||||
.B TZ
|
||||
is used as a pathname, if it begins with a slash,
|
||||
it is used as an absolute pathname; otherwise,
|
||||
it is used as a pathname relative to a system time conversion information
|
||||
directory.
|
||||
The file must be in the format specified in
|
||||
.BR tzfile (5).
|
||||
.PP
|
||||
When
|
||||
.B TZ
|
||||
is used directly as a specification of the time conversion information,
|
||||
it must have the following syntax (spaces inserted for clarity):
|
||||
.IP
|
||||
\fIstd\|offset\fR[\fIdst\fR[\fIoffset\fR][\fB,\fIrule\fR]]
|
||||
.PP
|
||||
Where:
|
||||
.RS
|
||||
.TP 15
|
||||
.IR std " and " dst
|
||||
Three or more bytes that are the designation for the standard
|
||||
.RI ( std )
|
||||
or the alternative
|
||||
.RI ( dst ,
|
||||
such as daylight saving time)
|
||||
time zone. Only
|
||||
.I std
|
||||
is required; if
|
||||
.I dst
|
||||
is missing, then daylight saving time does not apply in this locale.
|
||||
Upper- and lowercase letters are explicitly allowed. Any characters
|
||||
except a leading colon
|
||||
.RB ( : ),
|
||||
digits, comma
|
||||
.RB ( , ),
|
||||
ASCII minus
|
||||
.RB ( \*- ),
|
||||
ASCII plus
|
||||
.RB ( + ),
|
||||
and NUL bytes are allowed.
|
||||
Alternatively, a designation can be surrounded by angle brackets
|
||||
.B <
|
||||
and
|
||||
.BR > ;
|
||||
in this case, the designation can contain any characters other than
|
||||
.B >
|
||||
and NUL.
|
||||
.TP
|
||||
.I offset
|
||||
Indicates the value one must add to the local time to arrive at
|
||||
Coordinated Universal Time. The
|
||||
.I offset
|
||||
has the form:
|
||||
.RS
|
||||
.IP
|
||||
\fIhh\fR[\fB:\fImm\fR[\fB:\fIss\fR]]
|
||||
.RE
|
||||
.IP
|
||||
The minutes
|
||||
.RI ( mm )
|
||||
and seconds
|
||||
.RI ( ss )
|
||||
are optional. The hour
|
||||
.RI ( hh )
|
||||
is required and may be a single digit. The
|
||||
.I offset
|
||||
following
|
||||
.I std
|
||||
is required. If no
|
||||
.I offset
|
||||
follows
|
||||
.IR dst ,
|
||||
daylight saving 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) \*(en if present \*(en between zero and 59. If preceded by a
|
||||
.q "\*-" ,
|
||||
the time zone shall be east of the Prime Meridian; otherwise it shall be
|
||||
west (which may be indicated by an optional preceding
|
||||
.q "+" .
|
||||
.TP
|
||||
.I rule
|
||||
Indicates when to change to and back from daylight saving time. The
|
||||
.I rule
|
||||
has the form:
|
||||
.RS
|
||||
.IP
|
||||
\fIdate\fB/\fItime\fB,\fIdate\fB/\fItime\fR
|
||||
.RE
|
||||
.IP
|
||||
where the first
|
||||
.I date
|
||||
describes when the change from standard to daylight saving time occurs and the
|
||||
second
|
||||
.I date
|
||||
describes when the change back happens. Each
|
||||
.I time
|
||||
field describes when, in current local time, the change to the other
|
||||
time is made.
|
||||
As an extension to POSIX, daylight saving is assumed to be in effect
|
||||
all year if it begins January 1 at 00:00 and ends December 31 at
|
||||
24:00 plus the difference between daylight saving and standard time,
|
||||
leaving no room for standard time in the calendar.
|
||||
.IP
|
||||
The format of
|
||||
.I date
|
||||
is one of the following:
|
||||
.RS
|
||||
.TP 10
|
||||
.BI J n
|
||||
The Julian day
|
||||
.I n
|
||||
.RI "(1\ \(<=" "\ n\ " "\(<=\ 365).
|
||||
Leap days are not counted; that is, in all years \*(en including leap
|
||||
years \*(en February 28 is day 59 and March 1 is day 60. It is
|
||||
impossible to explicitly refer to the occasional February 29.
|
||||
.TP
|
||||
.I n
|
||||
The zero-based Julian day
|
||||
.RI "(0\ \(<=" "\ n\ " "\(<=\ 365).
|
||||
Leap days are counted, and it is possible to refer to February 29.
|
||||
.TP
|
||||
.BI M m . n . d
|
||||
The
|
||||
.IR d' th
|
||||
day
|
||||
.RI "(0\ \(<=" "\ d\ " "\(<=\ 6)
|
||||
of week
|
||||
.I n
|
||||
of month
|
||||
.I m
|
||||
of the year
|
||||
.RI "(1\ \(<=" "\ n\ " "\(<=\ 5,
|
||||
.RI "1\ \(<=" "\ m\ " "\(<=\ 12,
|
||||
where week 5 means
|
||||
.q "the last \fId\fP day in month \fIm\fP"
|
||||
which may occur in either the fourth or the fifth week). Week 1 is the
|
||||
first week in which the
|
||||
.IR d' th
|
||||
day occurs. Day zero is Sunday.
|
||||
.RE
|
||||
.IP "" 15
|
||||
The
|
||||
.I time
|
||||
has the same format as
|
||||
.I offset
|
||||
except that POSIX does not allow a leading sign (\c
|
||||
.q "\*-"
|
||||
or
|
||||
.q "+" ).
|
||||
As an extension to POSIX, the hours part of
|
||||
.I time
|
||||
can range from \-167 through 167; this allows for unusual rules such
|
||||
as
|
||||
.q "the Saturday before the first Sunday of March" .
|
||||
The default, if
|
||||
.I time
|
||||
is not given, is
|
||||
.BR 02:00:00 .
|
||||
.RE
|
||||
.LP
|
||||
Here are some examples of
|
||||
.B TZ
|
||||
values that directly specify the timezone; they use some of the
|
||||
extensions to POSIX.
|
||||
.TP
|
||||
.B EST5
|
||||
stands for US Eastern Standard
|
||||
Time (EST), 5 hours behind UT, without daylight saving.
|
||||
.TP
|
||||
.B <+12>\*-12<+13>,M11.1.0,M1.2.1/147
|
||||
stands for Fiji time, 12 hours ahead
|
||||
of UT, springing forward on November's first Sunday at 02:00, and
|
||||
falling back on January's second Monday at 147:00 (i.e., 03:00 on the
|
||||
first Sunday on or after January 14). The abbreviations for standard
|
||||
and daylight saving time are
|
||||
.q "+12"
|
||||
and
|
||||
.q "+13".
|
||||
.TP
|
||||
.B IST\*-2IDT,M3.4.4/26,M10.5.0
|
||||
stands for Israel Standard Time (IST) and Israel Daylight Time (IDT),
|
||||
2 hours ahead of UT, springing forward on March's fourth
|
||||
Thursday at 26:00 (i.e., 02:00 on the first Friday on or after March
|
||||
23), and falling back on October's last Sunday at 02:00.
|
||||
.TP
|
||||
.B <\*-04>4<\*-03>,J1/0,J365/25
|
||||
stands for permanent daylight saving time, 3 hours behind UT with
|
||||
abbreviation
|
||||
.q "\*-03".
|
||||
There is a dummy fall-back transition on December 31 at 25:00 daylight
|
||||
saving time (i.e., 24:00 standard time, equivalent to January 1 at
|
||||
00:00 standard time), and a simultaneous spring-forward transition on
|
||||
January 1 at 00:00 standard time, so daylight saving time is in effect
|
||||
all year and the initial
|
||||
.B <\*-04>
|
||||
is a placeholder.
|
||||
.TP
|
||||
.B <\*-03>3<\*-02>,M3.5.0/\*-2,M10.5.0/\*-1
|
||||
stands for time in western Greenland, 3 hours behind UT, where clocks
|
||||
follow the EU rules of
|
||||
springing forward on March's last Sunday at 01:00 UT (\-02:00 local
|
||||
time, i.e., 22:00 the previous day) and falling back on October's last
|
||||
Sunday at 01:00 UT (\-01:00 local time, i.e., 23:00 the previous day).
|
||||
The abbreviations for standard and daylight saving time are
|
||||
.q "\*-03"
|
||||
and
|
||||
.q "\*-02".
|
||||
.PP
|
||||
If no
|
||||
.I rule
|
||||
is present in
|
||||
.BR TZ ,
|
||||
the rules specified
|
||||
by the
|
||||
.BR tzfile (5)-format
|
||||
file
|
||||
.B posixrules
|
||||
in the system time conversion information directory are used, with the
|
||||
standard and daylight saving time offsets from UT replaced by those specified by
|
||||
the
|
||||
.I offset
|
||||
values in
|
||||
.BR TZ .
|
||||
.PP
|
||||
For compatibility with System V Release 3.1, a semicolon
|
||||
.RB ( ; )
|
||||
may be used to separate the
|
||||
.I rule
|
||||
from the rest of the specification.
|
||||
.SH FILES
|
||||
.ta \w'/usr/share/zoneinfo/posixrules\0\0'u
|
||||
/usr/share/zoneinfo timezone information directory
|
||||
.br
|
||||
/usr/share/zoneinfo/localtime local timezone file
|
||||
.br
|
||||
/usr/share/zoneinfo/posixrules used with POSIX-style TZ
|
||||
.br
|
||||
/usr/share/zoneinfo/GMT for UTC leap seconds
|
||||
.sp
|
||||
If
|
||||
.B /usr/share/zoneinfo/GMT
|
||||
is absent,
|
||||
UTC leap seconds are loaded from
|
||||
.BR /usr/share/zoneinfo/posixrules .
|
||||
.SH SEE ALSO
|
||||
getenv(3),
|
||||
newctime(3),
|
||||
newstrftime(3),
|
||||
time(2),
|
||||
tzfile(5)
|
||||
3620
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/northamerica
vendored
Normal file
3620
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/northamerica
vendored
Normal file
File diff suppressed because it is too large
Load Diff
978
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/private.h
vendored
Normal file
978
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/private.h
vendored
Normal file
@@ -0,0 +1,978 @@
|
||||
/* Private header for tzdb code. */
|
||||
|
||||
#ifndef PRIVATE_H
|
||||
|
||||
#define PRIVATE_H
|
||||
|
||||
/*
|
||||
** This file is in the public domain, so clarified as of
|
||||
** 1996-06-05 by Arthur David Olson.
|
||||
*/
|
||||
|
||||
/*
|
||||
** This header is for use ONLY with the time conversion code.
|
||||
** There is no guarantee that it will remain unchanged,
|
||||
** or that it will remain at all.
|
||||
** Do NOT copy it to any system include directory.
|
||||
** Thank you!
|
||||
*/
|
||||
|
||||
/* PORT_TO_C89 means the code should work even if the underlying
|
||||
compiler and library support only C89. SUPPORT_C89 means the
|
||||
tzcode library should support C89 callers in addition to the usual
|
||||
support for C99-and-later callers. These macros are obsolescent,
|
||||
and the plan is to remove them along with any code needed only when
|
||||
they are nonzero. */
|
||||
#ifndef PORT_TO_C89
|
||||
# define PORT_TO_C89 0
|
||||
#endif
|
||||
#ifndef SUPPORT_C89
|
||||
# define SUPPORT_C89 0
|
||||
#endif
|
||||
|
||||
#ifndef __STDC_VERSION__
|
||||
# define __STDC_VERSION__ 0
|
||||
#endif
|
||||
|
||||
/* Define true, false and bool if they don't work out of the box. */
|
||||
#if PORT_TO_C89 && __STDC_VERSION__ < 199901
|
||||
# define true 1
|
||||
# define false 0
|
||||
# define bool int
|
||||
#elif __STDC_VERSION__ < 202311
|
||||
# include <stdbool.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
** zdump has been made independent of the rest of the time
|
||||
** conversion package to increase confidence in the verification it provides.
|
||||
** You can use zdump to help in verifying other implementations.
|
||||
** To do this, compile with -DUSE_LTZ=0 and link without the tz library.
|
||||
*/
|
||||
#ifndef USE_LTZ
|
||||
# define USE_LTZ 1
|
||||
#endif
|
||||
|
||||
/* This string was in the Factory zone through version 2016f. */
|
||||
#define GRANDPARENTED "Local time zone must be set--see zic manual page"
|
||||
|
||||
/*
|
||||
** Defaults for preprocessor symbols.
|
||||
** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_DECL_ASCTIME_R
|
||||
# define HAVE_DECL_ASCTIME_R 1
|
||||
#endif
|
||||
|
||||
#if !defined HAVE__GENERIC && defined __has_extension
|
||||
# if __has_extension(c_generic_selections)
|
||||
# define HAVE__GENERIC 1
|
||||
# else
|
||||
# define HAVE__GENERIC 0
|
||||
# endif
|
||||
#endif
|
||||
/* _Generic is buggy in pre-4.9 GCC. */
|
||||
#if !defined HAVE__GENERIC && defined __GNUC__ && !defined __STRICT_ANSI__
|
||||
# define HAVE__GENERIC (4 < __GNUC__ + (9 <= __GNUC_MINOR__))
|
||||
#endif
|
||||
#ifndef HAVE__GENERIC
|
||||
# define HAVE__GENERIC (201112 <= __STDC_VERSION__)
|
||||
#endif
|
||||
|
||||
#if !defined HAVE_GETTEXT && defined __has_include
|
||||
# if __has_include(<libintl.h>)
|
||||
# define HAVE_GETTEXT true
|
||||
# endif
|
||||
#endif
|
||||
#ifndef HAVE_GETTEXT
|
||||
# define HAVE_GETTEXT false
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_INCOMPATIBLE_CTIME_R
|
||||
# define HAVE_INCOMPATIBLE_CTIME_R 0
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_LINK
|
||||
# define HAVE_LINK 1
|
||||
#endif /* !defined HAVE_LINK */
|
||||
|
||||
#ifndef HAVE_MALLOC_ERRNO
|
||||
# define HAVE_MALLOC_ERRNO 1
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_POSIX_DECLS
|
||||
# define HAVE_POSIX_DECLS 1
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SETENV
|
||||
# define HAVE_SETENV 1
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRDUP
|
||||
# define HAVE_STRDUP 1
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SYMLINK
|
||||
# define HAVE_SYMLINK 1
|
||||
#endif /* !defined HAVE_SYMLINK */
|
||||
|
||||
#if !defined HAVE_SYS_STAT_H && defined __has_include
|
||||
# if !__has_include(<sys/stat.h>)
|
||||
# define HAVE_SYS_STAT_H false
|
||||
# endif
|
||||
#endif
|
||||
#ifndef HAVE_SYS_STAT_H
|
||||
# define HAVE_SYS_STAT_H true
|
||||
#endif
|
||||
|
||||
#if !defined HAVE_UNISTD_H && defined __has_include
|
||||
# if !__has_include(<unistd.h>)
|
||||
# define HAVE_UNISTD_H false
|
||||
# endif
|
||||
#endif
|
||||
#ifndef HAVE_UNISTD_H
|
||||
# define HAVE_UNISTD_H true
|
||||
#endif
|
||||
|
||||
#ifndef NETBSD_INSPIRED
|
||||
# define NETBSD_INSPIRED 1
|
||||
#endif
|
||||
|
||||
#if HAVE_INCOMPATIBLE_CTIME_R
|
||||
# define asctime_r _incompatible_asctime_r
|
||||
# define ctime_r _incompatible_ctime_r
|
||||
#endif /* HAVE_INCOMPATIBLE_CTIME_R */
|
||||
|
||||
/* Enable tm_gmtoff, tm_zone, and environ on GNUish systems. */
|
||||
#define _GNU_SOURCE 1
|
||||
/* Fix asctime_r on Solaris 11. */
|
||||
#define _POSIX_PTHREAD_SEMANTICS 1
|
||||
/* Enable strtoimax on pre-C99 Solaris 11. */
|
||||
#define __EXTENSIONS__ 1
|
||||
|
||||
/* On GNUish systems where time_t might be 32 or 64 bits, use 64.
|
||||
On these platforms _FILE_OFFSET_BITS must also be 64; otherwise
|
||||
setting _TIME_BITS to 64 does not work. The code does not
|
||||
otherwise rely on _FILE_OFFSET_BITS being 64, since it does not
|
||||
use off_t or functions like 'stat' that depend on off_t. */
|
||||
#ifndef _FILE_OFFSET_BITS
|
||||
# define _FILE_OFFSET_BITS 64
|
||||
#endif
|
||||
#if !defined _TIME_BITS && _FILE_OFFSET_BITS == 64
|
||||
# define _TIME_BITS 64
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Nested includes
|
||||
*/
|
||||
|
||||
/* Avoid clashes with NetBSD by renaming NetBSD's declarations.
|
||||
If defining the 'timezone' variable, avoid a clash with FreeBSD's
|
||||
'timezone' function by renaming its declaration. */
|
||||
#define localtime_rz sys_localtime_rz
|
||||
#define mktime_z sys_mktime_z
|
||||
#define posix2time_z sys_posix2time_z
|
||||
#define time2posix_z sys_time2posix_z
|
||||
#if defined USG_COMPAT && USG_COMPAT == 2
|
||||
# define timezone sys_timezone
|
||||
#endif
|
||||
#define timezone_t sys_timezone_t
|
||||
#define tzalloc sys_tzalloc
|
||||
#define tzfree sys_tzfree
|
||||
#include <time.h>
|
||||
#undef localtime_rz
|
||||
#undef mktime_z
|
||||
#undef posix2time_z
|
||||
#undef time2posix_z
|
||||
#if defined USG_COMPAT && USG_COMPAT == 2
|
||||
# undef timezone
|
||||
#endif
|
||||
#undef timezone_t
|
||||
#undef tzalloc
|
||||
#undef tzfree
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#if !PORT_TO_C89
|
||||
# include <inttypes.h>
|
||||
#endif
|
||||
#include <limits.h> /* for CHAR_BIT et al. */
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#ifndef EINVAL
|
||||
# define EINVAL ERANGE
|
||||
#endif
|
||||
|
||||
#ifndef ELOOP
|
||||
# define ELOOP EINVAL
|
||||
#endif
|
||||
#ifndef ENAMETOOLONG
|
||||
# define ENAMETOOLONG EINVAL
|
||||
#endif
|
||||
#ifndef ENOMEM
|
||||
# define ENOMEM EINVAL
|
||||
#endif
|
||||
#ifndef ENOTSUP
|
||||
# define ENOTSUP EINVAL
|
||||
#endif
|
||||
#ifndef EOVERFLOW
|
||||
# define EOVERFLOW EINVAL
|
||||
#endif
|
||||
|
||||
#if HAVE_GETTEXT
|
||||
# include <libintl.h>
|
||||
#endif /* HAVE_GETTEXT */
|
||||
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h> /* for R_OK, and other POSIX goodness */
|
||||
#endif /* HAVE_UNISTD_H */
|
||||
|
||||
#ifndef HAVE_STRFTIME_L
|
||||
# if _POSIX_VERSION < 200809
|
||||
# define HAVE_STRFTIME_L 0
|
||||
# else
|
||||
# define HAVE_STRFTIME_L 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef USG_COMPAT
|
||||
# ifndef _XOPEN_VERSION
|
||||
# define USG_COMPAT 0
|
||||
# else
|
||||
# define USG_COMPAT 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_TZNAME
|
||||
# if _POSIX_VERSION < 198808 && !USG_COMPAT
|
||||
# define HAVE_TZNAME 0
|
||||
# else
|
||||
# define HAVE_TZNAME 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef ALTZONE
|
||||
# if defined __sun || defined _M_XENIX
|
||||
# define ALTZONE 1
|
||||
# else
|
||||
# define ALTZONE 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef R_OK
|
||||
# define R_OK 4
|
||||
#endif /* !defined R_OK */
|
||||
|
||||
#if PORT_TO_C89
|
||||
|
||||
/*
|
||||
** Define HAVE_STDINT_H's default value here, rather than at the
|
||||
** start, since __GLIBC__ and INTMAX_MAX's values depend on
|
||||
** previously-included files. glibc 2.1 and Solaris 10 and later have
|
||||
** stdint.h, even with pre-C99 compilers.
|
||||
*/
|
||||
#if !defined HAVE_STDINT_H && defined __has_include
|
||||
# define HAVE_STDINT_H true /* C23 __has_include implies C99 stdint.h. */
|
||||
#endif
|
||||
#ifndef HAVE_STDINT_H
|
||||
# define HAVE_STDINT_H \
|
||||
(199901 <= __STDC_VERSION__ \
|
||||
|| 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
|
||||
|| __CYGWIN__ || INTMAX_MAX)
|
||||
#endif /* !defined HAVE_STDINT_H */
|
||||
|
||||
#if HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
#endif /* !HAVE_STDINT_H */
|
||||
|
||||
#ifndef HAVE_INTTYPES_H
|
||||
# define HAVE_INTTYPES_H HAVE_STDINT_H
|
||||
#endif
|
||||
#if HAVE_INTTYPES_H
|
||||
# include <inttypes.h>
|
||||
#endif
|
||||
|
||||
/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX. */
|
||||
#if defined __LONG_LONG_MAX__ && !defined __STRICT_ANSI__
|
||||
# ifndef LLONG_MAX
|
||||
# define LLONG_MAX __LONG_LONG_MAX__
|
||||
# endif
|
||||
# ifndef LLONG_MIN
|
||||
# define LLONG_MIN (-1 - LLONG_MAX)
|
||||
# endif
|
||||
# ifndef ULLONG_MAX
|
||||
# define ULLONG_MAX (LLONG_MAX * 2ull + 1)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef INT_FAST64_MAX
|
||||
# if 1 <= LONG_MAX >> 31 >> 31
|
||||
typedef long int_fast64_t;
|
||||
# define INT_FAST64_MIN LONG_MIN
|
||||
# define INT_FAST64_MAX LONG_MAX
|
||||
# else
|
||||
/* If this fails, compile with -DHAVE_STDINT_H or with a better compiler. */
|
||||
typedef long long int_fast64_t;
|
||||
# define INT_FAST64_MIN LLONG_MIN
|
||||
# define INT_FAST64_MAX LLONG_MAX
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef PRIdFAST64
|
||||
# if INT_FAST64_MAX == LONG_MAX
|
||||
# define PRIdFAST64 "ld"
|
||||
# else
|
||||
# define PRIdFAST64 "lld"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef SCNdFAST64
|
||||
# define SCNdFAST64 PRIdFAST64
|
||||
#endif
|
||||
|
||||
#ifndef INT_FAST32_MAX
|
||||
# if INT_MAX >> 31 == 0
|
||||
typedef long int_fast32_t;
|
||||
# define INT_FAST32_MAX LONG_MAX
|
||||
# define INT_FAST32_MIN LONG_MIN
|
||||
# else
|
||||
typedef int int_fast32_t;
|
||||
# define INT_FAST32_MAX INT_MAX
|
||||
# define INT_FAST32_MIN INT_MIN
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef INTMAX_MAX
|
||||
# ifdef LLONG_MAX
|
||||
typedef long long intmax_t;
|
||||
# ifndef HAVE_STRTOLL
|
||||
# define HAVE_STRTOLL true
|
||||
# endif
|
||||
# if HAVE_STRTOLL
|
||||
# define strtoimax strtoll
|
||||
# endif
|
||||
# define INTMAX_MAX LLONG_MAX
|
||||
# define INTMAX_MIN LLONG_MIN
|
||||
# else
|
||||
typedef long intmax_t;
|
||||
# define INTMAX_MAX LONG_MAX
|
||||
# define INTMAX_MIN LONG_MIN
|
||||
# endif
|
||||
# ifndef strtoimax
|
||||
# define strtoimax strtol
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef PRIdMAX
|
||||
# if INTMAX_MAX == LLONG_MAX
|
||||
# define PRIdMAX "lld"
|
||||
# else
|
||||
# define PRIdMAX "ld"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef PTRDIFF_MAX
|
||||
# define PTRDIFF_MAX MAXVAL(ptrdiff_t, TYPE_BIT(ptrdiff_t))
|
||||
#endif
|
||||
|
||||
#ifndef UINT_FAST32_MAX
|
||||
typedef unsigned long uint_fast32_t;
|
||||
#endif
|
||||
|
||||
#ifndef UINT_FAST64_MAX
|
||||
# if 3 <= ULONG_MAX >> 31 >> 31
|
||||
typedef unsigned long uint_fast64_t;
|
||||
# define UINT_FAST64_MAX ULONG_MAX
|
||||
# else
|
||||
/* If this fails, compile with -DHAVE_STDINT_H or with a better compiler. */
|
||||
typedef unsigned long long uint_fast64_t;
|
||||
# define UINT_FAST64_MAX ULLONG_MAX
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef UINTMAX_MAX
|
||||
# ifdef ULLONG_MAX
|
||||
typedef unsigned long long uintmax_t;
|
||||
# else
|
||||
typedef unsigned long uintmax_t;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef PRIuMAX
|
||||
# ifdef ULLONG_MAX
|
||||
# define PRIuMAX "llu"
|
||||
# else
|
||||
# define PRIuMAX "lu"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef SIZE_MAX
|
||||
# define SIZE_MAX ((size_t) -1)
|
||||
#endif
|
||||
|
||||
#endif /* PORT_TO_C89 */
|
||||
|
||||
/* Support ckd_add, ckd_sub, ckd_mul on C23 or recent-enough GCC-like
|
||||
hosts, unless compiled with -DHAVE_STDCKDINT_H=0 or with pre-C23 EDG. */
|
||||
#if !defined HAVE_STDCKDINT_H && defined __has_include
|
||||
# if __has_include(<stdckdint.h>)
|
||||
# define HAVE_STDCKDINT_H true
|
||||
# endif
|
||||
#endif
|
||||
#ifdef HAVE_STDCKDINT_H
|
||||
# if HAVE_STDCKDINT_H
|
||||
# include <stdckdint.h>
|
||||
# endif
|
||||
#elif defined __EDG__
|
||||
/* Do nothing, to work around EDG bug <https://bugs.gnu.org/53256>. */
|
||||
#elif defined __has_builtin
|
||||
# if __has_builtin(__builtin_add_overflow)
|
||||
# define ckd_add(r, a, b) __builtin_add_overflow(a, b, r)
|
||||
# endif
|
||||
# if __has_builtin(__builtin_sub_overflow)
|
||||
# define ckd_sub(r, a, b) __builtin_sub_overflow(a, b, r)
|
||||
# endif
|
||||
# if __has_builtin(__builtin_mul_overflow)
|
||||
# define ckd_mul(r, a, b) __builtin_mul_overflow(a, b, r)
|
||||
# endif
|
||||
#elif 7 <= __GNUC__
|
||||
# define ckd_add(r, a, b) __builtin_add_overflow(a, b, r)
|
||||
# define ckd_sub(r, a, b) __builtin_sub_overflow(a, b, r)
|
||||
# define ckd_mul(r, a, b) __builtin_mul_overflow(a, b, r)
|
||||
#endif
|
||||
|
||||
#if 3 <= __GNUC__
|
||||
# define ATTRIBUTE_MALLOC __attribute__((malloc))
|
||||
# define ATTRIBUTE_FORMAT(spec) __attribute__((format spec))
|
||||
#else
|
||||
# define ATTRIBUTE_MALLOC /* empty */
|
||||
# define ATTRIBUTE_FORMAT(spec) /* empty */
|
||||
#endif
|
||||
|
||||
#if (defined __has_c_attribute \
|
||||
&& (202311 <= __STDC_VERSION__ || !defined __STRICT_ANSI__))
|
||||
# define HAVE___HAS_C_ATTRIBUTE true
|
||||
#else
|
||||
# define HAVE___HAS_C_ATTRIBUTE false
|
||||
#endif
|
||||
|
||||
#if HAVE___HAS_C_ATTRIBUTE
|
||||
# if __has_c_attribute(deprecated)
|
||||
# define ATTRIBUTE_DEPRECATED [[deprecated]]
|
||||
# endif
|
||||
#endif
|
||||
#ifndef ATTRIBUTE_DEPRECATED
|
||||
# if 3 < __GNUC__ + (2 <= __GNUC_MINOR__)
|
||||
# define ATTRIBUTE_DEPRECATED __attribute__((deprecated))
|
||||
# else
|
||||
# define ATTRIBUTE_DEPRECATED /* empty */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if HAVE___HAS_C_ATTRIBUTE
|
||||
# if __has_c_attribute(fallthrough)
|
||||
# define ATTRIBUTE_FALLTHROUGH [[fallthrough]]
|
||||
# endif
|
||||
#endif
|
||||
#ifndef ATTRIBUTE_FALLTHROUGH
|
||||
# if 7 <= __GNUC__
|
||||
# define ATTRIBUTE_FALLTHROUGH __attribute__((fallthrough))
|
||||
# else
|
||||
# define ATTRIBUTE_FALLTHROUGH ((void) 0)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if HAVE___HAS_C_ATTRIBUTE
|
||||
# if __has_c_attribute(maybe_unused)
|
||||
# define ATTRIBUTE_MAYBE_UNUSED [[maybe_unused]]
|
||||
# endif
|
||||
#endif
|
||||
#ifndef ATTRIBUTE_MAYBE_UNUSED
|
||||
# if 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
|
||||
# define ATTRIBUTE_MAYBE_UNUSED __attribute__((unused))
|
||||
# else
|
||||
# define ATTRIBUTE_MAYBE_UNUSED /* empty */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if HAVE___HAS_C_ATTRIBUTE
|
||||
# if __has_c_attribute(noreturn)
|
||||
# define ATTRIBUTE_NORETURN [[noreturn]]
|
||||
# endif
|
||||
#endif
|
||||
#ifndef ATTRIBUTE_NORETURN
|
||||
# if 201112 <= __STDC_VERSION__
|
||||
# define ATTRIBUTE_NORETURN _Noreturn
|
||||
# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__)
|
||||
# define ATTRIBUTE_NORETURN __attribute__((noreturn))
|
||||
# else
|
||||
# define ATTRIBUTE_NORETURN /* empty */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if HAVE___HAS_C_ATTRIBUTE
|
||||
# if __has_c_attribute(reproducible)
|
||||
# define ATTRIBUTE_REPRODUCIBLE [[reproducible]]
|
||||
# endif
|
||||
#endif
|
||||
#ifndef ATTRIBUTE_REPRODUCIBLE
|
||||
# if 3 <= __GNUC__
|
||||
# define ATTRIBUTE_REPRODUCIBLE __attribute__((pure))
|
||||
# else
|
||||
# define ATTRIBUTE_REPRODUCIBLE /* empty */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if HAVE___HAS_C_ATTRIBUTE
|
||||
# if __has_c_attribute(unsequenced)
|
||||
# define ATTRIBUTE_UNSEQUENCED [[unsequenced]]
|
||||
# endif
|
||||
#endif
|
||||
#ifndef ATTRIBUTE_UNSEQUENCED
|
||||
# if 3 <= __GNUC__
|
||||
# define ATTRIBUTE_UNSEQUENCED __attribute__((const))
|
||||
# else
|
||||
# define ATTRIBUTE_UNSEQUENCED /* empty */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if PORT_TO_C89 && __STDC_VERSION__ < 199901 && !defined restrict
|
||||
# define restrict /* empty */
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Workarounds for compilers/systems.
|
||||
*/
|
||||
|
||||
#ifndef EPOCH_LOCAL
|
||||
# define EPOCH_LOCAL 0
|
||||
#endif
|
||||
#ifndef EPOCH_OFFSET
|
||||
# define EPOCH_OFFSET 0
|
||||
#endif
|
||||
#ifndef RESERVE_STD_EXT_IDS
|
||||
# define RESERVE_STD_EXT_IDS 0
|
||||
#endif
|
||||
|
||||
/* If standard C identifiers with external linkage (e.g., localtime)
|
||||
are reserved and are not already being renamed anyway, rename them
|
||||
as if compiling with '-Dtime_tz=time_t'. */
|
||||
#if !defined time_tz && RESERVE_STD_EXT_IDS && USE_LTZ
|
||||
# define time_tz time_t
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Compile with -Dtime_tz=T to build the tz package with a private
|
||||
** time_t type equivalent to T rather than the system-supplied time_t.
|
||||
** This debugging feature can test unusual design decisions
|
||||
** (e.g., time_t wider than 'long', or unsigned time_t) even on
|
||||
** typical platforms.
|
||||
*/
|
||||
#if defined time_tz || EPOCH_LOCAL || EPOCH_OFFSET != 0
|
||||
# define TZ_TIME_T 1
|
||||
#else
|
||||
# define TZ_TIME_T 0
|
||||
#endif
|
||||
|
||||
#if defined LOCALTIME_IMPLEMENTATION && TZ_TIME_T
|
||||
static time_t sys_time(time_t *x) { return time(x); }
|
||||
#endif
|
||||
|
||||
#if TZ_TIME_T
|
||||
|
||||
typedef time_tz tz_time_t;
|
||||
|
||||
# undef asctime
|
||||
# define asctime tz_asctime
|
||||
# undef asctime_r
|
||||
# define asctime_r tz_asctime_r
|
||||
# undef ctime
|
||||
# define ctime tz_ctime
|
||||
# undef ctime_r
|
||||
# define ctime_r tz_ctime_r
|
||||
# undef difftime
|
||||
# define difftime tz_difftime
|
||||
# undef gmtime
|
||||
# define gmtime tz_gmtime
|
||||
# undef gmtime_r
|
||||
# define gmtime_r tz_gmtime_r
|
||||
# undef localtime
|
||||
# define localtime tz_localtime
|
||||
# undef localtime_r
|
||||
# define localtime_r tz_localtime_r
|
||||
# undef localtime_rz
|
||||
# define localtime_rz tz_localtime_rz
|
||||
# undef mktime
|
||||
# define mktime tz_mktime
|
||||
# undef mktime_z
|
||||
# define mktime_z tz_mktime_z
|
||||
# undef offtime
|
||||
# define offtime tz_offtime
|
||||
# undef posix2time
|
||||
# define posix2time tz_posix2time
|
||||
# undef posix2time_z
|
||||
# define posix2time_z tz_posix2time_z
|
||||
# undef strftime
|
||||
# define strftime tz_strftime
|
||||
# undef time
|
||||
# define time tz_time
|
||||
# undef time2posix
|
||||
# define time2posix tz_time2posix
|
||||
# undef time2posix_z
|
||||
# define time2posix_z tz_time2posix_z
|
||||
# undef time_t
|
||||
# define time_t tz_time_t
|
||||
# undef timegm
|
||||
# define timegm tz_timegm
|
||||
# undef timelocal
|
||||
# define timelocal tz_timelocal
|
||||
# undef timeoff
|
||||
# define timeoff tz_timeoff
|
||||
# undef tzalloc
|
||||
# define tzalloc tz_tzalloc
|
||||
# undef tzfree
|
||||
# define tzfree tz_tzfree
|
||||
# undef tzset
|
||||
# define tzset tz_tzset
|
||||
# if HAVE_STRFTIME_L
|
||||
# undef strftime_l
|
||||
# define strftime_l tz_strftime_l
|
||||
# endif
|
||||
# if HAVE_TZNAME
|
||||
# undef tzname
|
||||
# define tzname tz_tzname
|
||||
# endif
|
||||
# if USG_COMPAT
|
||||
# undef daylight
|
||||
# define daylight tz_daylight
|
||||
# undef timezone
|
||||
# define timezone tz_timezone
|
||||
# endif
|
||||
# if ALTZONE
|
||||
# undef altzone
|
||||
# define altzone tz_altzone
|
||||
# endif
|
||||
|
||||
# if __STDC_VERSION__ < 202311
|
||||
# define DEPRECATED_IN_C23 /* empty */
|
||||
# else
|
||||
# define DEPRECATED_IN_C23 ATTRIBUTE_DEPRECATED
|
||||
# endif
|
||||
DEPRECATED_IN_C23 char *asctime(struct tm const *);
|
||||
char *asctime_r(struct tm const *restrict, char *restrict);
|
||||
DEPRECATED_IN_C23 char *ctime(time_t const *);
|
||||
char *ctime_r(time_t const *, char *);
|
||||
ATTRIBUTE_UNSEQUENCED double difftime(time_t, time_t);
|
||||
size_t strftime(char *restrict, size_t, char const *restrict,
|
||||
struct tm const *restrict);
|
||||
# if HAVE_STRFTIME_L
|
||||
size_t strftime_l(char *restrict, size_t, char const *restrict,
|
||||
struct tm const *restrict, locale_t);
|
||||
# endif
|
||||
struct tm *gmtime(time_t const *);
|
||||
struct tm *gmtime_r(time_t const *restrict, struct tm *restrict);
|
||||
struct tm *localtime(time_t const *);
|
||||
struct tm *localtime_r(time_t const *restrict, struct tm *restrict);
|
||||
time_t mktime(struct tm *);
|
||||
time_t time(time_t *);
|
||||
time_t timegm(struct tm *);
|
||||
void tzset(void);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DECL_TIMEGM
|
||||
# if (202311 <= __STDC_VERSION__ \
|
||||
|| defined __GLIBC__ || defined __tm_zone /* musl */ \
|
||||
|| defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
|
||||
|| (defined __APPLE__ && defined __MACH__))
|
||||
# define HAVE_DECL_TIMEGM true
|
||||
# else
|
||||
# define HAVE_DECL_TIMEGM false
|
||||
# endif
|
||||
#endif
|
||||
#if !HAVE_DECL_TIMEGM && !defined timegm
|
||||
time_t timegm(struct tm *);
|
||||
#endif
|
||||
|
||||
#if !HAVE_DECL_ASCTIME_R && !defined asctime_r
|
||||
extern char *asctime_r(struct tm const *restrict, char *restrict);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DECL_ENVIRON
|
||||
# if defined environ || defined __USE_GNU
|
||||
# define HAVE_DECL_ENVIRON 1
|
||||
# else
|
||||
# define HAVE_DECL_ENVIRON 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !HAVE_DECL_ENVIRON
|
||||
extern char **environ;
|
||||
#endif
|
||||
|
||||
#if 2 <= HAVE_TZNAME + (TZ_TIME_T || !HAVE_POSIX_DECLS)
|
||||
extern char *tzname[];
|
||||
#endif
|
||||
#if 2 <= USG_COMPAT + (TZ_TIME_T || !HAVE_POSIX_DECLS)
|
||||
extern long timezone;
|
||||
extern int daylight;
|
||||
#endif
|
||||
#if 2 <= ALTZONE + (TZ_TIME_T || !HAVE_POSIX_DECLS)
|
||||
extern long altzone;
|
||||
#endif
|
||||
|
||||
/*
|
||||
** The STD_INSPIRED functions are similar, but most also need
|
||||
** declarations if time_tz is defined.
|
||||
*/
|
||||
|
||||
#ifndef STD_INSPIRED
|
||||
# define STD_INSPIRED 0
|
||||
#endif
|
||||
#if STD_INSPIRED
|
||||
# if TZ_TIME_T || !defined offtime
|
||||
struct tm *offtime(time_t const *, long);
|
||||
# endif
|
||||
# if TZ_TIME_T || !defined timelocal
|
||||
time_t timelocal(struct tm *);
|
||||
# endif
|
||||
# if TZ_TIME_T || !defined timeoff
|
||||
time_t timeoff(struct tm *, long);
|
||||
# endif
|
||||
# if TZ_TIME_T || !defined time2posix
|
||||
time_t time2posix(time_t);
|
||||
# endif
|
||||
# if TZ_TIME_T || !defined posix2time
|
||||
time_t posix2time(time_t);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Infer TM_ZONE on systems where this information is known, but suppress
|
||||
guessing if NO_TM_ZONE is defined. Similarly for TM_GMTOFF. */
|
||||
#if (defined __GLIBC__ \
|
||||
|| defined __tm_zone /* musl */ \
|
||||
|| defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
|
||||
|| (defined __APPLE__ && defined __MACH__))
|
||||
# if !defined TM_GMTOFF && !defined NO_TM_GMTOFF
|
||||
# define TM_GMTOFF tm_gmtoff
|
||||
# endif
|
||||
# if !defined TM_ZONE && !defined NO_TM_ZONE
|
||||
# define TM_ZONE tm_zone
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Define functions that are ABI compatible with NetBSD but have
|
||||
** better prototypes. NetBSD 6.1.4 defines a pointer type timezone_t
|
||||
** and labors under the misconception that 'const timezone_t' is a
|
||||
** pointer to a constant. This use of 'const' is ineffective, so it
|
||||
** is not done here. What we call 'struct state' NetBSD calls
|
||||
** 'struct __state', but this is a private name so it doesn't matter.
|
||||
*/
|
||||
#if NETBSD_INSPIRED
|
||||
typedef struct state *timezone_t;
|
||||
struct tm *localtime_rz(timezone_t restrict, time_t const *restrict,
|
||||
struct tm *restrict);
|
||||
time_t mktime_z(timezone_t restrict, struct tm *restrict);
|
||||
timezone_t tzalloc(char const *);
|
||||
void tzfree(timezone_t);
|
||||
# if STD_INSPIRED
|
||||
# if TZ_TIME_T || !defined posix2time_z
|
||||
ATTRIBUTE_REPRODUCIBLE time_t posix2time_z(timezone_t, time_t);
|
||||
# endif
|
||||
# if TZ_TIME_T || !defined time2posix_z
|
||||
ATTRIBUTE_REPRODUCIBLE time_t time2posix_z(timezone_t, time_t);
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Finally, some convenience items.
|
||||
*/
|
||||
|
||||
#define TYPE_BIT(type) (sizeof(type) * CHAR_BIT)
|
||||
#define TYPE_SIGNED(type) (((type) -1) < 0)
|
||||
#define TWOS_COMPLEMENT(t) ((t) ~ (t) 0 < 0)
|
||||
|
||||
/* Minimum and maximum of two values. Use lower case to avoid
|
||||
naming clashes with standard include files. */
|
||||
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define min(a, b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
/* Max and min values of the integer type T, of which only the bottom
|
||||
B bits are used, and where the highest-order used bit is considered
|
||||
to be a sign bit if T is signed. */
|
||||
#define MAXVAL(t, b) \
|
||||
((t) (((t) 1 << ((b) - 1 - TYPE_SIGNED(t))) \
|
||||
- 1 + ((t) 1 << ((b) - 1 - TYPE_SIGNED(t)))))
|
||||
#define MINVAL(t, b) \
|
||||
((t) (TYPE_SIGNED(t) ? - TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0))
|
||||
|
||||
/* The extreme time values, assuming no padding. */
|
||||
#define TIME_T_MIN_NO_PADDING MINVAL(time_t, TYPE_BIT(time_t))
|
||||
#define TIME_T_MAX_NO_PADDING MAXVAL(time_t, TYPE_BIT(time_t))
|
||||
|
||||
/* The extreme time values. These are macros, not constants, so that
|
||||
any portability problems occur only when compiling .c files that use
|
||||
the macros, which is safer for applications that need only zdump and zic.
|
||||
This implementation assumes no padding if time_t is signed and
|
||||
either the compiler lacks support for _Generic or time_t is not one
|
||||
of the standard signed integer types. */
|
||||
#if HAVE__GENERIC
|
||||
# define TIME_T_MIN \
|
||||
_Generic((time_t) 0, \
|
||||
signed char: SCHAR_MIN, short: SHRT_MIN, \
|
||||
int: INT_MIN, long: LONG_MIN, long long: LLONG_MIN, \
|
||||
default: TIME_T_MIN_NO_PADDING)
|
||||
# define TIME_T_MAX \
|
||||
(TYPE_SIGNED(time_t) \
|
||||
? _Generic((time_t) 0, \
|
||||
signed char: SCHAR_MAX, short: SHRT_MAX, \
|
||||
int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, \
|
||||
default: TIME_T_MAX_NO_PADDING) \
|
||||
: (time_t) -1)
|
||||
#else
|
||||
# define TIME_T_MIN TIME_T_MIN_NO_PADDING
|
||||
# define TIME_T_MAX TIME_T_MAX_NO_PADDING
|
||||
#endif
|
||||
|
||||
/*
|
||||
** 302 / 1000 is log10(2.0) rounded up.
|
||||
** Subtract one for the sign bit if the type is signed;
|
||||
** add one for integer division truncation;
|
||||
** add one more for a minus sign if the type is signed.
|
||||
*/
|
||||
#define INT_STRLEN_MAXIMUM(type) \
|
||||
((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \
|
||||
1 + TYPE_SIGNED(type))
|
||||
|
||||
/*
|
||||
** INITIALIZE(x)
|
||||
*/
|
||||
|
||||
#ifdef GCC_LINT
|
||||
# define INITIALIZE(x) ((x) = 0)
|
||||
#else
|
||||
# define INITIALIZE(x)
|
||||
#endif
|
||||
|
||||
/* Whether memory access must strictly follow the C standard.
|
||||
If 0, it's OK to read uninitialized storage so long as the value is
|
||||
not relied upon. Defining it to 0 lets mktime access parts of
|
||||
struct tm that might be uninitialized, as a heuristic when the
|
||||
standard doesn't say what to return and when tm_gmtoff can help
|
||||
mktime likely infer a better value. */
|
||||
#ifndef UNINIT_TRAP
|
||||
# define UNINIT_TRAP 0
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
# undef unreachable
|
||||
# define unreachable() abort()
|
||||
#elif !defined unreachable
|
||||
# ifdef __has_builtin
|
||||
# if __has_builtin(__builtin_unreachable)
|
||||
# define unreachable() __builtin_unreachable()
|
||||
# endif
|
||||
# elif 4 < __GNUC__ + (5 <= __GNUC_MINOR__)
|
||||
# define unreachable() __builtin_unreachable()
|
||||
# endif
|
||||
# ifndef unreachable
|
||||
# define unreachable() ((void) 0)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
** For the benefit of GNU folk...
|
||||
** '_(MSGID)' uses the current locale's message library string for MSGID.
|
||||
** The default is to use gettext if available, and use MSGID otherwise.
|
||||
*/
|
||||
|
||||
#if HAVE_GETTEXT
|
||||
#define _(msgid) gettext(msgid)
|
||||
#else /* !HAVE_GETTEXT */
|
||||
#define _(msgid) msgid
|
||||
#endif /* !HAVE_GETTEXT */
|
||||
|
||||
#if !defined TZ_DOMAIN && defined HAVE_GETTEXT
|
||||
# define TZ_DOMAIN "tz"
|
||||
#endif
|
||||
|
||||
#if HAVE_INCOMPATIBLE_CTIME_R
|
||||
#undef asctime_r
|
||||
#undef ctime_r
|
||||
char *asctime_r(struct tm const *, char *);
|
||||
char *ctime_r(time_t const *, char *);
|
||||
#endif /* HAVE_INCOMPATIBLE_CTIME_R */
|
||||
|
||||
/* Handy macros that are independent of tzfile implementation. */
|
||||
|
||||
enum {
|
||||
SECSPERMIN = 60,
|
||||
MINSPERHOUR = 60,
|
||||
SECSPERHOUR = SECSPERMIN * MINSPERHOUR,
|
||||
HOURSPERDAY = 24,
|
||||
DAYSPERWEEK = 7,
|
||||
DAYSPERNYEAR = 365,
|
||||
DAYSPERLYEAR = DAYSPERNYEAR + 1,
|
||||
MONSPERYEAR = 12,
|
||||
YEARSPERREPEAT = 400 /* years before a Gregorian repeat */
|
||||
};
|
||||
|
||||
#define SECSPERDAY ((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
|
||||
|
||||
#define DAYSPERREPEAT ((int_fast32_t) 400 * 365 + 100 - 4 + 1)
|
||||
#define SECSPERREPEAT ((int_fast64_t) DAYSPERREPEAT * SECSPERDAY)
|
||||
#define AVGSECSPERYEAR (SECSPERREPEAT / YEARSPERREPEAT)
|
||||
|
||||
enum {
|
||||
TM_SUNDAY,
|
||||
TM_MONDAY,
|
||||
TM_TUESDAY,
|
||||
TM_WEDNESDAY,
|
||||
TM_THURSDAY,
|
||||
TM_FRIDAY,
|
||||
TM_SATURDAY
|
||||
};
|
||||
|
||||
enum {
|
||||
TM_JANUARY,
|
||||
TM_FEBRUARY,
|
||||
TM_MARCH,
|
||||
TM_APRIL,
|
||||
TM_MAY,
|
||||
TM_JUNE,
|
||||
TM_JULY,
|
||||
TM_AUGUST,
|
||||
TM_SEPTEMBER,
|
||||
TM_OCTOBER,
|
||||
TM_NOVEMBER,
|
||||
TM_DECEMBER
|
||||
};
|
||||
|
||||
enum {
|
||||
TM_YEAR_BASE = 1900,
|
||||
TM_WDAY_BASE = TM_MONDAY,
|
||||
EPOCH_YEAR = 1970,
|
||||
EPOCH_WDAY = TM_THURSDAY
|
||||
};
|
||||
|
||||
#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
|
||||
|
||||
/*
|
||||
** Since everything in isleap is modulo 400 (or a factor of 400), we know that
|
||||
** isleap(y) == isleap(y % 400)
|
||||
** and so
|
||||
** isleap(a + b) == isleap((a + b) % 400)
|
||||
** or
|
||||
** isleap(a + b) == isleap(a % 400 + b % 400)
|
||||
** This is true even if % means modulo rather than Fortran remainder
|
||||
** (which is allowed by C89 but not by C99 or later).
|
||||
** We use this to avoid addition overflow problems.
|
||||
*/
|
||||
|
||||
#define isleap_sum(a, b) isleap((a) % 400 + (b) % 400)
|
||||
|
||||
#endif /* !defined PRIVATE_H */
|
||||
2010
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/southamerica
vendored
Normal file
2010
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/southamerica
vendored
Normal file
File diff suppressed because it is too large
Load Diff
657
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/strftime.c
vendored
Normal file
657
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/strftime.c
vendored
Normal file
@@ -0,0 +1,657 @@
|
||||
/* Convert a broken-down timestamp to a string. */
|
||||
|
||||
/* Copyright 1989 The Regents of the University of California.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. Neither the name of the University nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE. */
|
||||
|
||||
/*
|
||||
** Based on the UCB version with the copyright notice appearing above.
|
||||
**
|
||||
** This is ANSIish only when "multibyte character == plain character".
|
||||
*/
|
||||
|
||||
#include "private.h"
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <locale.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef DEPRECATE_TWO_DIGIT_YEARS
|
||||
# define DEPRECATE_TWO_DIGIT_YEARS false
|
||||
#endif
|
||||
|
||||
struct lc_time_T {
|
||||
const char * mon[MONSPERYEAR];
|
||||
const char * month[MONSPERYEAR];
|
||||
const char * wday[DAYSPERWEEK];
|
||||
const char * weekday[DAYSPERWEEK];
|
||||
const char * X_fmt;
|
||||
const char * x_fmt;
|
||||
const char * c_fmt;
|
||||
const char * am;
|
||||
const char * pm;
|
||||
const char * date_fmt;
|
||||
};
|
||||
|
||||
static const struct lc_time_T C_time_locale = {
|
||||
{
|
||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
||||
}, {
|
||||
"January", "February", "March", "April", "May", "June",
|
||||
"July", "August", "September", "October", "November", "December"
|
||||
}, {
|
||||
"Sun", "Mon", "Tue", "Wed",
|
||||
"Thu", "Fri", "Sat"
|
||||
}, {
|
||||
"Sunday", "Monday", "Tuesday", "Wednesday",
|
||||
"Thursday", "Friday", "Saturday"
|
||||
},
|
||||
|
||||
/* X_fmt */
|
||||
"%H:%M:%S",
|
||||
|
||||
/*
|
||||
** x_fmt
|
||||
** C99 and later require this format.
|
||||
** Using just numbers (as here) makes Quakers happier;
|
||||
** it's also compatible with SVR4.
|
||||
*/
|
||||
"%m/%d/%y",
|
||||
|
||||
/*
|
||||
** c_fmt
|
||||
** C99 and later require this format.
|
||||
** Previously this code used "%D %X", but we now conform to C99.
|
||||
** Note that
|
||||
** "%a %b %d %H:%M:%S %Y"
|
||||
** is used by Solaris 2.3.
|
||||
*/
|
||||
"%a %b %e %T %Y",
|
||||
|
||||
/* am */
|
||||
"AM",
|
||||
|
||||
/* pm */
|
||||
"PM",
|
||||
|
||||
/* date_fmt */
|
||||
"%a %b %e %H:%M:%S %Z %Y"
|
||||
};
|
||||
|
||||
enum warn { IN_NONE, IN_SOME, IN_THIS, IN_ALL };
|
||||
|
||||
static char * _add(const char *, char *, const char *);
|
||||
static char * _conv(int, const char *, char *, const char *);
|
||||
static char * _fmt(const char *, const struct tm *, char *, const char *,
|
||||
enum warn *);
|
||||
static char * _yconv(int, int, bool, bool, char *, char const *);
|
||||
|
||||
#ifndef YEAR_2000_NAME
|
||||
# define YEAR_2000_NAME "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"
|
||||
#endif /* !defined YEAR_2000_NAME */
|
||||
|
||||
#if HAVE_STRFTIME_L
|
||||
size_t
|
||||
strftime_l(char *s, size_t maxsize, char const *format, struct tm const *t,
|
||||
ATTRIBUTE_MAYBE_UNUSED locale_t locale)
|
||||
{
|
||||
/* Just call strftime, as only the C locale is supported. */
|
||||
return strftime(s, maxsize, format, t);
|
||||
}
|
||||
#endif
|
||||
|
||||
size_t
|
||||
strftime(char *s, size_t maxsize, const char *format, const struct tm *t)
|
||||
{
|
||||
char * p;
|
||||
int saved_errno = errno;
|
||||
enum warn warn = IN_NONE;
|
||||
|
||||
tzset();
|
||||
p = _fmt(format, t, s, s + maxsize, &warn);
|
||||
if (!p) {
|
||||
errno = EOVERFLOW;
|
||||
return 0;
|
||||
}
|
||||
if (DEPRECATE_TWO_DIGIT_YEARS
|
||||
&& warn != IN_NONE && getenv(YEAR_2000_NAME)) {
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "strftime format \"%s\" ", format);
|
||||
fprintf(stderr, "yields only two digits of years in ");
|
||||
if (warn == IN_SOME)
|
||||
fprintf(stderr, "some locales");
|
||||
else if (warn == IN_THIS)
|
||||
fprintf(stderr, "the current locale");
|
||||
else fprintf(stderr, "all locales");
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
if (p == s + maxsize) {
|
||||
errno = ERANGE;
|
||||
return 0;
|
||||
}
|
||||
*p = '\0';
|
||||
errno = saved_errno;
|
||||
return p - s;
|
||||
}
|
||||
|
||||
static char *
|
||||
_fmt(const char *format, const struct tm *t, char *pt,
|
||||
const char *ptlim, enum warn *warnp)
|
||||
{
|
||||
struct lc_time_T const *Locale = &C_time_locale;
|
||||
|
||||
for ( ; *format; ++format) {
|
||||
if (*format == '%') {
|
||||
label:
|
||||
switch (*++format) {
|
||||
case '\0':
|
||||
--format;
|
||||
break;
|
||||
case 'A':
|
||||
pt = _add((t->tm_wday < 0 ||
|
||||
t->tm_wday >= DAYSPERWEEK) ?
|
||||
"?" : Locale->weekday[t->tm_wday],
|
||||
pt, ptlim);
|
||||
continue;
|
||||
case 'a':
|
||||
pt = _add((t->tm_wday < 0 ||
|
||||
t->tm_wday >= DAYSPERWEEK) ?
|
||||
"?" : Locale->wday[t->tm_wday],
|
||||
pt, ptlim);
|
||||
continue;
|
||||
case 'B':
|
||||
pt = _add((t->tm_mon < 0 ||
|
||||
t->tm_mon >= MONSPERYEAR) ?
|
||||
"?" : Locale->month[t->tm_mon],
|
||||
pt, ptlim);
|
||||
continue;
|
||||
case 'b':
|
||||
case 'h':
|
||||
pt = _add((t->tm_mon < 0 ||
|
||||
t->tm_mon >= MONSPERYEAR) ?
|
||||
"?" : Locale->mon[t->tm_mon],
|
||||
pt, ptlim);
|
||||
continue;
|
||||
case 'C':
|
||||
/*
|
||||
** %C used to do a...
|
||||
** _fmt("%a %b %e %X %Y", t);
|
||||
** ...whereas now POSIX 1003.2 calls for
|
||||
** something completely different.
|
||||
** (ado, 1993-05-24)
|
||||
*/
|
||||
pt = _yconv(t->tm_year, TM_YEAR_BASE,
|
||||
true, false, pt, ptlim);
|
||||
continue;
|
||||
case 'c':
|
||||
{
|
||||
enum warn warn2 = IN_SOME;
|
||||
|
||||
pt = _fmt(Locale->c_fmt, t, pt, ptlim, &warn2);
|
||||
if (warn2 == IN_ALL)
|
||||
warn2 = IN_THIS;
|
||||
if (warn2 > *warnp)
|
||||
*warnp = warn2;
|
||||
}
|
||||
continue;
|
||||
case 'D':
|
||||
pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp);
|
||||
continue;
|
||||
case 'd':
|
||||
pt = _conv(t->tm_mday, "%02d", pt, ptlim);
|
||||
continue;
|
||||
case 'E':
|
||||
case 'O':
|
||||
/*
|
||||
** Locale modifiers of C99 and later.
|
||||
** The sequences
|
||||
** %Ec %EC %Ex %EX %Ey %EY
|
||||
** %Od %oe %OH %OI %Om %OM
|
||||
** %OS %Ou %OU %OV %Ow %OW %Oy
|
||||
** are supposed to provide alternative
|
||||
** representations.
|
||||
*/
|
||||
goto label;
|
||||
case 'e':
|
||||
pt = _conv(t->tm_mday, "%2d", pt, ptlim);
|
||||
continue;
|
||||
case 'F':
|
||||
pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp);
|
||||
continue;
|
||||
case 'H':
|
||||
pt = _conv(t->tm_hour, "%02d", pt, ptlim);
|
||||
continue;
|
||||
case 'I':
|
||||
pt = _conv((t->tm_hour % 12) ?
|
||||
(t->tm_hour % 12) : 12,
|
||||
"%02d", pt, ptlim);
|
||||
continue;
|
||||
case 'j':
|
||||
pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim);
|
||||
continue;
|
||||
case 'k':
|
||||
/*
|
||||
** This used to be...
|
||||
** _conv(t->tm_hour % 12 ?
|
||||
** t->tm_hour % 12 : 12, 2, ' ');
|
||||
** ...and has been changed to the below to
|
||||
** match SunOS 4.1.1 and Arnold Robbins'
|
||||
** strftime version 3.0. That is, "%k" and
|
||||
** "%l" have been swapped.
|
||||
** (ado, 1993-05-24)
|
||||
*/
|
||||
pt = _conv(t->tm_hour, "%2d", pt, ptlim);
|
||||
continue;
|
||||
#ifdef KITCHEN_SINK
|
||||
case 'K':
|
||||
/*
|
||||
** After all this time, still unclaimed!
|
||||
*/
|
||||
pt = _add("kitchen sink", pt, ptlim);
|
||||
continue;
|
||||
#endif /* defined KITCHEN_SINK */
|
||||
case 'l':
|
||||
/*
|
||||
** This used to be...
|
||||
** _conv(t->tm_hour, 2, ' ');
|
||||
** ...and has been changed to the below to
|
||||
** match SunOS 4.1.1 and Arnold Robbin's
|
||||
** strftime version 3.0. That is, "%k" and
|
||||
** "%l" have been swapped.
|
||||
** (ado, 1993-05-24)
|
||||
*/
|
||||
pt = _conv((t->tm_hour % 12) ?
|
||||
(t->tm_hour % 12) : 12,
|
||||
"%2d", pt, ptlim);
|
||||
continue;
|
||||
case 'M':
|
||||
pt = _conv(t->tm_min, "%02d", pt, ptlim);
|
||||
continue;
|
||||
case 'm':
|
||||
pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim);
|
||||
continue;
|
||||
case 'n':
|
||||
pt = _add("\n", pt, ptlim);
|
||||
continue;
|
||||
case 'p':
|
||||
pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ?
|
||||
Locale->pm :
|
||||
Locale->am,
|
||||
pt, ptlim);
|
||||
continue;
|
||||
case 'R':
|
||||
pt = _fmt("%H:%M", t, pt, ptlim, warnp);
|
||||
continue;
|
||||
case 'r':
|
||||
pt = _fmt("%I:%M:%S %p", t, pt, ptlim, warnp);
|
||||
continue;
|
||||
case 'S':
|
||||
pt = _conv(t->tm_sec, "%02d", pt, ptlim);
|
||||
continue;
|
||||
case 's':
|
||||
{
|
||||
struct tm tm;
|
||||
char buf[INT_STRLEN_MAXIMUM(
|
||||
time_t) + 1];
|
||||
time_t mkt;
|
||||
|
||||
tm.tm_sec = t->tm_sec;
|
||||
tm.tm_min = t->tm_min;
|
||||
tm.tm_hour = t->tm_hour;
|
||||
tm.tm_mday = t->tm_mday;
|
||||
tm.tm_mon = t->tm_mon;
|
||||
tm.tm_year = t->tm_year;
|
||||
tm.tm_isdst = t->tm_isdst;
|
||||
#if defined TM_GMTOFF && ! UNINIT_TRAP
|
||||
tm.TM_GMTOFF = t->TM_GMTOFF;
|
||||
#endif
|
||||
mkt = mktime(&tm);
|
||||
/* If mktime fails, %s expands to the
|
||||
value of (time_t) -1 as a failure
|
||||
marker; this is better in practice
|
||||
than strftime failing. */
|
||||
if (TYPE_SIGNED(time_t)) {
|
||||
intmax_t n = mkt;
|
||||
sprintf(buf, "%"PRIdMAX, n);
|
||||
} else {
|
||||
uintmax_t n = mkt;
|
||||
sprintf(buf, "%"PRIuMAX, n);
|
||||
}
|
||||
pt = _add(buf, pt, ptlim);
|
||||
}
|
||||
continue;
|
||||
case 'T':
|
||||
pt = _fmt("%H:%M:%S", t, pt, ptlim, warnp);
|
||||
continue;
|
||||
case 't':
|
||||
pt = _add("\t", pt, ptlim);
|
||||
continue;
|
||||
case 'U':
|
||||
pt = _conv((t->tm_yday + DAYSPERWEEK -
|
||||
t->tm_wday) / DAYSPERWEEK,
|
||||
"%02d", pt, ptlim);
|
||||
continue;
|
||||
case 'u':
|
||||
/*
|
||||
** From Arnold Robbins' strftime version 3.0:
|
||||
** "ISO 8601: Weekday as a decimal number
|
||||
** [1 (Monday) - 7]"
|
||||
** (ado, 1993-05-24)
|
||||
*/
|
||||
pt = _conv((t->tm_wday == 0) ?
|
||||
DAYSPERWEEK : t->tm_wday,
|
||||
"%d", pt, ptlim);
|
||||
continue;
|
||||
case 'V': /* ISO 8601 week number */
|
||||
case 'G': /* ISO 8601 year (four digits) */
|
||||
case 'g': /* ISO 8601 year (two digits) */
|
||||
/*
|
||||
** From Arnold Robbins' strftime version 3.0: "the week number of the
|
||||
** year (the first Monday as the first day of week 1) as a decimal number
|
||||
** (01-53)."
|
||||
** (ado, 1993-05-24)
|
||||
**
|
||||
** From <https://www.cl.cam.ac.uk/~mgk25/iso-time.html> by Markus Kuhn:
|
||||
** "Week 01 of a year is per definition the first week which has the
|
||||
** Thursday in this year, which is equivalent to the week which contains
|
||||
** the fourth day of January. In other words, the first week of a new year
|
||||
** is the week which has the majority of its days in the new year. Week 01
|
||||
** might also contain days from the previous year and the week before week
|
||||
** 01 of a year is the last week (52 or 53) of the previous year even if
|
||||
** it contains days from the new year. A week starts with Monday (day 1)
|
||||
** and ends with Sunday (day 7). For example, the first week of the year
|
||||
** 1997 lasts from 1996-12-30 to 1997-01-05..."
|
||||
** (ado, 1996-01-02)
|
||||
*/
|
||||
{
|
||||
int year;
|
||||
int base;
|
||||
int yday;
|
||||
int wday;
|
||||
int w;
|
||||
|
||||
year = t->tm_year;
|
||||
base = TM_YEAR_BASE;
|
||||
yday = t->tm_yday;
|
||||
wday = t->tm_wday;
|
||||
for ( ; ; ) {
|
||||
int len;
|
||||
int bot;
|
||||
int top;
|
||||
|
||||
len = isleap_sum(year, base) ?
|
||||
DAYSPERLYEAR :
|
||||
DAYSPERNYEAR;
|
||||
/*
|
||||
** What yday (-3 ... 3) does
|
||||
** the ISO year begin on?
|
||||
*/
|
||||
bot = ((yday + 11 - wday) %
|
||||
DAYSPERWEEK) - 3;
|
||||
/*
|
||||
** What yday does the NEXT
|
||||
** ISO year begin on?
|
||||
*/
|
||||
top = bot -
|
||||
(len % DAYSPERWEEK);
|
||||
if (top < -3)
|
||||
top += DAYSPERWEEK;
|
||||
top += len;
|
||||
if (yday >= top) {
|
||||
++base;
|
||||
w = 1;
|
||||
break;
|
||||
}
|
||||
if (yday >= bot) {
|
||||
w = 1 + ((yday - bot) /
|
||||
DAYSPERWEEK);
|
||||
break;
|
||||
}
|
||||
--base;
|
||||
yday += isleap_sum(year, base) ?
|
||||
DAYSPERLYEAR :
|
||||
DAYSPERNYEAR;
|
||||
}
|
||||
#ifdef XPG4_1994_04_09
|
||||
if ((w == 52 &&
|
||||
t->tm_mon == TM_JANUARY) ||
|
||||
(w == 1 &&
|
||||
t->tm_mon == TM_DECEMBER))
|
||||
w = 53;
|
||||
#endif /* defined XPG4_1994_04_09 */
|
||||
if (*format == 'V')
|
||||
pt = _conv(w, "%02d",
|
||||
pt, ptlim);
|
||||
else if (*format == 'g') {
|
||||
*warnp = IN_ALL;
|
||||
pt = _yconv(year, base,
|
||||
false, true,
|
||||
pt, ptlim);
|
||||
} else pt = _yconv(year, base,
|
||||
true, true,
|
||||
pt, ptlim);
|
||||
}
|
||||
continue;
|
||||
case 'v':
|
||||
/*
|
||||
** From Arnold Robbins' strftime version 3.0:
|
||||
** "date as dd-bbb-YYYY"
|
||||
** (ado, 1993-05-24)
|
||||
*/
|
||||
pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp);
|
||||
continue;
|
||||
case 'W':
|
||||
pt = _conv((t->tm_yday + DAYSPERWEEK -
|
||||
(t->tm_wday ?
|
||||
(t->tm_wday - 1) :
|
||||
(DAYSPERWEEK - 1))) / DAYSPERWEEK,
|
||||
"%02d", pt, ptlim);
|
||||
continue;
|
||||
case 'w':
|
||||
pt = _conv(t->tm_wday, "%d", pt, ptlim);
|
||||
continue;
|
||||
case 'X':
|
||||
pt = _fmt(Locale->X_fmt, t, pt, ptlim, warnp);
|
||||
continue;
|
||||
case 'x':
|
||||
{
|
||||
enum warn warn2 = IN_SOME;
|
||||
|
||||
pt = _fmt(Locale->x_fmt, t, pt, ptlim, &warn2);
|
||||
if (warn2 == IN_ALL)
|
||||
warn2 = IN_THIS;
|
||||
if (warn2 > *warnp)
|
||||
*warnp = warn2;
|
||||
}
|
||||
continue;
|
||||
case 'y':
|
||||
*warnp = IN_ALL;
|
||||
pt = _yconv(t->tm_year, TM_YEAR_BASE,
|
||||
false, true,
|
||||
pt, ptlim);
|
||||
continue;
|
||||
case 'Y':
|
||||
pt = _yconv(t->tm_year, TM_YEAR_BASE,
|
||||
true, true,
|
||||
pt, ptlim);
|
||||
continue;
|
||||
case 'Z':
|
||||
#ifdef TM_ZONE
|
||||
pt = _add(t->TM_ZONE, pt, ptlim);
|
||||
#elif HAVE_TZNAME
|
||||
if (t->tm_isdst >= 0)
|
||||
pt = _add(tzname[t->tm_isdst != 0],
|
||||
pt, ptlim);
|
||||
#endif
|
||||
/*
|
||||
** C99 and later say that %Z must be
|
||||
** replaced by the empty string if the
|
||||
** time zone abbreviation is not
|
||||
** determinable.
|
||||
*/
|
||||
continue;
|
||||
case 'z':
|
||||
#if defined TM_GMTOFF || USG_COMPAT || ALTZONE
|
||||
{
|
||||
long diff;
|
||||
char const * sign;
|
||||
bool negative;
|
||||
|
||||
# ifdef TM_GMTOFF
|
||||
diff = t->TM_GMTOFF;
|
||||
# else
|
||||
/*
|
||||
** C99 and later say that the UT offset must
|
||||
** be computed by looking only at
|
||||
** tm_isdst. This requirement is
|
||||
** incorrect, since it means the code
|
||||
** must rely on magic (in this case
|
||||
** altzone and timezone), and the
|
||||
** magic might not have the correct
|
||||
** offset. Doing things correctly is
|
||||
** tricky and requires disobeying the standard;
|
||||
** see GNU C strftime for details.
|
||||
** For now, punt and conform to the
|
||||
** standard, even though it's incorrect.
|
||||
**
|
||||
** C99 and later say that %z must be replaced by
|
||||
** the empty string if the time zone is not
|
||||
** determinable, so output nothing if the
|
||||
** appropriate variables are not available.
|
||||
*/
|
||||
if (t->tm_isdst < 0)
|
||||
continue;
|
||||
if (t->tm_isdst == 0)
|
||||
# if USG_COMPAT
|
||||
diff = -timezone;
|
||||
# else
|
||||
continue;
|
||||
# endif
|
||||
else
|
||||
# if ALTZONE
|
||||
diff = -altzone;
|
||||
# else
|
||||
continue;
|
||||
# endif
|
||||
# endif
|
||||
negative = diff < 0;
|
||||
if (diff == 0) {
|
||||
# ifdef TM_ZONE
|
||||
negative = t->TM_ZONE[0] == '-';
|
||||
# else
|
||||
negative = t->tm_isdst < 0;
|
||||
# if HAVE_TZNAME
|
||||
if (tzname[t->tm_isdst != 0][0] == '-')
|
||||
negative = true;
|
||||
# endif
|
||||
# endif
|
||||
}
|
||||
if (negative) {
|
||||
sign = "-";
|
||||
diff = -diff;
|
||||
} else sign = "+";
|
||||
pt = _add(sign, pt, ptlim);
|
||||
diff /= SECSPERMIN;
|
||||
diff = (diff / MINSPERHOUR) * 100 +
|
||||
(diff % MINSPERHOUR);
|
||||
pt = _conv(diff, "%04d", pt, ptlim);
|
||||
}
|
||||
#endif
|
||||
continue;
|
||||
case '+':
|
||||
pt = _fmt(Locale->date_fmt, t, pt, ptlim,
|
||||
warnp);
|
||||
continue;
|
||||
case '%':
|
||||
/*
|
||||
** X311J/88-090 (4.12.3.5): if conversion char is
|
||||
** undefined, behavior is undefined. Print out the
|
||||
** character itself as printf(3) also does.
|
||||
*/
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (pt == ptlim)
|
||||
break;
|
||||
*pt++ = *format;
|
||||
}
|
||||
return pt;
|
||||
}
|
||||
|
||||
static char *
|
||||
_conv(int n, const char *format, char *pt, const char *ptlim)
|
||||
{
|
||||
char buf[INT_STRLEN_MAXIMUM(int) + 1];
|
||||
|
||||
sprintf(buf, format, n);
|
||||
return _add(buf, pt, ptlim);
|
||||
}
|
||||
|
||||
static char *
|
||||
_add(const char *str, char *pt, const char *ptlim)
|
||||
{
|
||||
while (pt < ptlim && (*pt = *str++) != '\0')
|
||||
++pt;
|
||||
return pt;
|
||||
}
|
||||
|
||||
/*
|
||||
** POSIX and the C Standard are unclear or inconsistent about
|
||||
** what %C and %y do if the year is negative or exceeds 9999.
|
||||
** Use the convention that %C concatenated with %y yields the
|
||||
** same output as %Y, and that %Y contains at least 4 bytes,
|
||||
** with more only if necessary.
|
||||
*/
|
||||
|
||||
static char *
|
||||
_yconv(int a, int b, bool convert_top, bool convert_yy,
|
||||
char *pt, const char *ptlim)
|
||||
{
|
||||
register int lead;
|
||||
register int trail;
|
||||
|
||||
int DIVISOR = 100;
|
||||
trail = a % DIVISOR + b % DIVISOR;
|
||||
lead = a / DIVISOR + b / DIVISOR + trail / DIVISOR;
|
||||
trail %= DIVISOR;
|
||||
if (trail < 0 && lead > 0) {
|
||||
trail += DIVISOR;
|
||||
--lead;
|
||||
} else if (lead < 0 && trail > 0) {
|
||||
trail -= DIVISOR;
|
||||
++lead;
|
||||
}
|
||||
if (convert_top) {
|
||||
if (lead == 0 && trail < 0)
|
||||
pt = _add("-0", pt, ptlim);
|
||||
else pt = _conv(lead, "%02d", pt, ptlim);
|
||||
}
|
||||
if (convert_yy)
|
||||
pt = _conv(((trail < 0) ? -trail : trail), "%02d", pt, ptlim);
|
||||
return pt;
|
||||
}
|
||||
1479
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/theory.html
vendored
Normal file
1479
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/theory.html
vendored
Normal file
File diff suppressed because it is too large
Load Diff
133
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/time2posix.3
vendored
Normal file
133
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/time2posix.3
vendored
Normal file
@@ -0,0 +1,133 @@
|
||||
.\" This file is in the public domain, so clarified as of
|
||||
.\" 1996-06-05 by Arthur David Olson.
|
||||
.TH time2posix 3
|
||||
.SH NAME
|
||||
time2posix, posix2time \- convert seconds since the Epoch
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.ie \n(.g .ds - \f(CR-\fP
|
||||
.el .ds - \-
|
||||
.B #include <time.h>
|
||||
.PP
|
||||
.B time_t time2posix(time_t t);
|
||||
.PP
|
||||
.B time_t posix2time(time_t t);
|
||||
.PP
|
||||
.B cc ... \*-ltz
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
.ie '\(en'' .ds en \-
|
||||
.el .ds en \(en
|
||||
.ie '\(lq'' .ds lq \&"\"
|
||||
.el .ds lq \(lq\"
|
||||
.ie '\(rq'' .ds rq \&"\"
|
||||
.el .ds rq \(rq\"
|
||||
.de q
|
||||
\\$3\*(lq\\$1\*(rq\\$2
|
||||
..
|
||||
IEEE Standard 1003.1
|
||||
(POSIX)
|
||||
requires the time_t value 536457599 to stand for 1986-12-31 23:59:59 UTC.
|
||||
This effectively implies that POSIX time_t values cannot include leap
|
||||
seconds and,
|
||||
therefore,
|
||||
that the system time must be adjusted as each leap occurs.
|
||||
.PP
|
||||
If the time package is configured with leap-second support
|
||||
enabled,
|
||||
however,
|
||||
no such adjustment is needed and
|
||||
time_t values continue to increase over leap events
|
||||
(as a true
|
||||
.q "seconds since...\&"
|
||||
value).
|
||||
This means that these values will differ from those required by POSIX
|
||||
by the net number of leap seconds inserted since the Epoch.
|
||||
.PP
|
||||
Typically this is not a problem as the type time_t is intended
|
||||
to be
|
||||
(mostly)
|
||||
opaque \*(en time_t values should only be obtained-from and
|
||||
passed-to functions such as
|
||||
.BR time(2) ,
|
||||
.BR localtime(3) ,
|
||||
.BR mktime(3) ,
|
||||
and
|
||||
.BR difftime(3) .
|
||||
However,
|
||||
POSIX gives an arithmetic
|
||||
expression for directly computing a time_t value from a given date/time,
|
||||
and the same relationship is assumed by some
|
||||
(usually older)
|
||||
applications.
|
||||
Any programs creating/dissecting time_t values
|
||||
using such a relationship will typically not handle intervals
|
||||
over leap seconds correctly.
|
||||
.PP
|
||||
The
|
||||
.B time2posix
|
||||
and
|
||||
.B posix2time
|
||||
functions are provided to address this time_t mismatch by converting
|
||||
between local time_t values and their POSIX equivalents.
|
||||
This is done by accounting for the number of time-base changes that
|
||||
would have taken place on a POSIX system as leap seconds were inserted
|
||||
or deleted.
|
||||
These converted values can then be used in lieu of correcting the older
|
||||
applications,
|
||||
or when communicating with POSIX-compliant systems.
|
||||
.PP
|
||||
The
|
||||
.B time2posix
|
||||
function
|
||||
is single-valued.
|
||||
That is,
|
||||
every local time_t
|
||||
corresponds to a single POSIX time_t.
|
||||
The
|
||||
.B posix2time
|
||||
function
|
||||
is less well-behaved:
|
||||
for a positive leap second hit the result is not unique,
|
||||
and for a negative leap second hit the corresponding
|
||||
POSIX time_t doesn't exist so an adjacent value is returned.
|
||||
Both of these are good indicators of the inferiority of the
|
||||
POSIX representation.
|
||||
.PP
|
||||
The following table summarizes the relationship between a time
|
||||
T and its conversion to,
|
||||
and back from,
|
||||
the POSIX representation over the leap second inserted at the end of June,
|
||||
1993.
|
||||
.nf
|
||||
.ta \w'93/06/30 'u +\w'23:59:59 'u +\w'A+0 'u +\w'X=time2posix(T) 'u
|
||||
DATE TIME T X=time2posix(T) posix2time(X)
|
||||
93/06/30 23:59:59 A+0 B+0 A+0
|
||||
93/06/30 23:59:60 A+1 B+1 A+1 or A+2
|
||||
93/07/01 00:00:00 A+2 B+1 A+1 or A+2
|
||||
93/07/01 00:00:01 A+3 B+2 A+3
|
||||
|
||||
A leap second deletion would look like...
|
||||
|
||||
DATE TIME T X=time2posix(T) posix2time(X)
|
||||
??/06/30 23:59:58 A+0 B+0 A+0
|
||||
??/07/01 00:00:00 A+1 B+2 A+1
|
||||
??/07/01 00:00:01 A+2 B+3 A+2
|
||||
.sp
|
||||
.ce
|
||||
[Note: posix2time(B+1) => A+0 or A+1]
|
||||
.fi
|
||||
.PP
|
||||
If leap-second support is not enabled,
|
||||
local time_t and
|
||||
POSIX time_t values are equivalent,
|
||||
and both
|
||||
.B time2posix
|
||||
and
|
||||
.B posix2time
|
||||
degenerate to the identity function.
|
||||
.SH SEE ALSO
|
||||
difftime(3),
|
||||
localtime(3),
|
||||
mktime(3),
|
||||
time(2)
|
||||
636
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tz-art.html
vendored
Normal file
636
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tz-art.html
vendored
Normal file
@@ -0,0 +1,636 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Time and the Arts</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Time and the Arts</h1>
|
||||
<h2>Documentaries</h2>
|
||||
<ul>
|
||||
<li>
|
||||
"<a href="https://www.youtube.com/watch?v=84aWtseb2-4">Daylight
|
||||
Saving Time Explained</a>" (2011; 6:39) lightly covers daylight saving
|
||||
time's theory, history, pros and cons. Among other things, it explains
|
||||
Arizona's daylight-saving enclaves quite well.</li>
|
||||
<li>
|
||||
"<a href="https://www.youtube.com/watch?v=-5wpm-gesOY">The Problem
|
||||
with Time & Timezones – Computerphile</a>" (2013; 10:12) delves
|
||||
into problems that programmers have with timekeeping.</li>
|
||||
<li>
|
||||
"<a href="https://www.rferl.org/a/28375932.html">All The Time In The World:
|
||||
Explaining The Mysteries Of Time Zones</a>" (2017; 2:15)
|
||||
briefly says why France has more time zones than Russia.
|
||||
<li>
|
||||
"<a href="https://www.youtube.com/watch?v=yRz-Dl60Lfc">Why Denmark is
|
||||
.17 Seconds Behind The World</a>" (2019; 6:29) explains why Denmark and
|
||||
the United Kingdom don't exactly follow their own law about civil time.
|
||||
<li>
|
||||
"About Time" (1962; 59 minutes) is part of the
|
||||
Bell Science extravaganza, with Frank Baxter, Richard Deacon, and Les Tremayne.
|
||||
Its advisor was Richard Feynman, and it was voiced by Mel Blanc.
|
||||
(<a href="https://www.imdb.com/title/tt0154110/">IMDb entry</a>.)</li>
|
||||
</ul>
|
||||
<h2>Movies</h2>
|
||||
<ul>
|
||||
<li>
|
||||
In the 1946 movie <em>A Matter of Life and Death</em>
|
||||
(U.S. title <em>Stairway to Heaven</em>)
|
||||
there is a reference to British Double Summer Time.
|
||||
The time does not play a large part in the plot;
|
||||
it's just a passing reference to the time when one of the
|
||||
characters was supposed to have died (but didn't).
|
||||
(<a href="https://www.imdb.com/title/tt0038733/">IMDb entry.</a>)
|
||||
(Dave Cantor)
|
||||
<li>
|
||||
The 1953 railway comedy movie <em>The Titfield Thunderbolt</em> includes a
|
||||
play on words on British Double Summer Time. Valentine's wife wants
|
||||
him to leave the pub and asks him, "Do you know what time it is?"
|
||||
And he, happy where he is, replies: "Yes, my love. Summer double time."
|
||||
(<a href="https://www.imdb.com/title/tt0046436/">IMDb entry.</a>)
|
||||
(Mark Brader, 2009-10-02)
|
||||
</li>
|
||||
<li>
|
||||
The premise of the 1999 caper movie <em>Entrapment</em> involves computers
|
||||
in an international banking network being shut down briefly at
|
||||
midnight in each time zone to avoid any problems at the transition
|
||||
from the year 1999 to 2000 in that zone. (Hmmmm.) If this shutdown
|
||||
is extended by 10 seconds, it will create a one-time opportunity for
|
||||
a gigantic computerized theft. To achieve this, at one location the
|
||||
crooks interfere with the microwave system supplying time signals to
|
||||
the computer, advancing the time by 0.1 second each minute over the
|
||||
last hour of 1999. (So this movie teaches us that 0.1 × 60 = 10.)
|
||||
(<a href="https://www.imdb.com/title/tt0137494/">IMDb entry.</a>)
|
||||
(Mark Brader, 2009-10-02)
|
||||
</li>
|
||||
<li>
|
||||
One mustn't forget the
|
||||
<a href="https://www.youtube.com/watch?v=k4EUTMPuvHo">trailer</a>
|
||||
(2014; 2:23) for the movie <em>Daylight Saving</em>.
|
||||
</li>
|
||||
</ul>
|
||||
<h2>TV episodes</h2>
|
||||
<ul>
|
||||
<li>
|
||||
An episode of <em>The Adventures of Superman</em> entitled "The Mysterious
|
||||
Cube," first aired 1958-02-24, had Superman convincing the controllers
|
||||
of the Arlington Time Signal to broadcast ahead of actual time;
|
||||
doing so got a crook trying to be declared dead to
|
||||
emerge a bit too early from the titular enclosure.
|
||||
(<a href="https://www.imdb.com/title/tt0506628/">IMDb entry</a>.)
|
||||
</li>
|
||||
<li>
|
||||
"<a href="https://en.wikipedia.org/wiki/The_Chimes_of_Big_Ben">The Chimes
|
||||
of Big Ben</a>", <em>The Prisoner</em>, episode 2, ITC, 1967-10-06.
|
||||
Our protagonist tumbles to
|
||||
the fraudulent nature of a Poland-to-England escape upon hearing "Big
|
||||
Ben" chiming on Polish local time.
|
||||
(<a href="https://www.imdb.com/title/tt0679185/">IMDb entry.</a>)
|
||||
</li>
|
||||
<li>
|
||||
"The Susie", <em>Seinfeld</em>, season 8, episode 15, NBC, 1997-02-13.
|
||||
Kramer decides that daylight saving time
|
||||
isn't coming fast enough, so he sets his watch ahead an hour.
|
||||
</li>
|
||||
<li>
|
||||
"20 Hours in America", <em>The West Wing</em>, season 4, episodes 1–2,
|
||||
2002-09-25, contained a <a
|
||||
href="https://www.youtube.com/watch?v=-J1NHzQ1sgc">scene</a> that
|
||||
saw White House staffers stranded in Indiana; they thought they had time to
|
||||
catch Air Force One but were done in by intra-Indiana local time changes.
|
||||
</li>
|
||||
<li>
|
||||
"In what time zone would you find New York City?" was a $200 question on
|
||||
the 1999-11-13 United States airing of <em>Who Wants to Be a Millionaire?</em>,
|
||||
and "In 1883, what industry led the movement to divide the U.S. into four time
|
||||
zones?" was a $32,000 question on the 2001-05-23 United States airing of
|
||||
the same show. At this rate, the million-dollar time-zone
|
||||
question should have been asked 2002-06-04.
|
||||
</li>
|
||||
<li>
|
||||
A private jet's mid-flight change of time zones distorts Alison Dubois'
|
||||
premonition in the "We Had a Dream" episode of <em>Medium</em>
|
||||
(originally aired 2007-02-28).
|
||||
</li>
|
||||
<li>
|
||||
A criminal's failure to account for the start of daylight saving is pivotal
|
||||
in "<a href="https://monk.fandom.com/wiki/Mr._Monk_and_the_Rapper">Mr. Monk
|
||||
and the Rapper</a>" (first aired 2007-07-20).
|
||||
</li>
|
||||
<li>
|
||||
In the <em>30 Rock</em> episode "Anna Howard Shaw Day"
|
||||
(first broadcast 2010-02-11),
|
||||
Jack Donaghy's date realizes that a Geneva-to-New-York business phone call
|
||||
received in the evening must be fake given the difference in local times.
|
||||
</li>
|
||||
<li>
|
||||
In the "Run by the Monkeys" episode of <em>Da Vinci's Inquest</em>
|
||||
(first broadcast 2002-11-17),
|
||||
a witness in a five-year-old fire case realizes they may not have set
|
||||
their clock back when daylight saving ended on the day of the fire,
|
||||
introducing the possibility of an hour when arson might have occurred.
|
||||
</li>
|
||||
<li>
|
||||
In "The Todd Couple" episode of <em>Outsourced</em> (first aired 2011-02-10),
|
||||
Manmeet sets up Valentine's Day teledates for 6:00 and 9:00pm;
|
||||
since one is with a New Yorker and the other with a San Franciscan,
|
||||
hilarity ensues.
|
||||
(Never mind that this should be 7:30am in Mumbai, yet for some reason the show
|
||||
proceeds as though it's also mid-evening there.)
|
||||
</li>
|
||||
<li>
|
||||
In the "14 Days to Go"/"T Minus..." episode of
|
||||
<em>You, Me and the Apocalypse</em>
|
||||
(first aired 2015-11-11 in the UK, 2016-03-10 in the US),
|
||||
the success of a mission to deal with a comet
|
||||
hinges on whether or not Russia observes daylight saving time.
|
||||
(In the US,
|
||||
the episode first aired in the week before the switch to <abbr>DST</abbr>.)
|
||||
</li>
|
||||
<li>
|
||||
"The Lost Hour", <em>Eerie, Indiana</em>, episode 10, NBC, 1991-12-01.
|
||||
Despite Indiana's then-lack of <abbr>DST</abbr>,
|
||||
Marshall changes his clock with unusual consequences.
|
||||
See "<a
|
||||
href="https://www.avclub.com/eerie-indiana-was-a-few-dimensions-ahead-of-its-time-1819833380"><em>Eerie,
|
||||
Indiana</em> was a few dimensions ahead of its time</a>".
|
||||
</li>
|
||||
<li>
|
||||
"Time Tunnel", <em>The Adventures of Pete & Pete</em>, season 2, episode 5,
|
||||
Nickelodeon, 1994-10-23.
|
||||
The two Petes travel back in time an hour
|
||||
on the day that <abbr>DST</abbr> ends.
|
||||
</li>
|
||||
<li>
|
||||
"King-Size Homer", <em>The Simpsons</em>, episode 135, Fox, 1995-11-05.
|
||||
Homer, working from home, remarks "8:58, first
|
||||
time I've ever been early for work. Except for all those daylight
|
||||
savings days. Lousy farmers."
|
||||
</li>
|
||||
<li>
|
||||
<em>Last Week Tonight with John Oliver</em>, season 2, episode 5, 2015-03-08,
|
||||
asked, "<a href="https://www.youtube.com/watch?v=br0NW9ufUUw">Daylight Saving
|
||||
Time – How Is This Still A Thing?</a>"
|
||||
</li>
|
||||
<li>
|
||||
"Tracks", <em>The Good Wife</em>, season 7, episode 12,
|
||||
CBS, 2016-01-17.
|
||||
The applicability of a contract hinges on the
|
||||
time zone associated with a video timestamp.
|
||||
</li>
|
||||
<li>
|
||||
"Justice", <em>Veep</em>, season 6, episode 4, HBO, 2017-05-07.
|
||||
Jonah's inability to understand <abbr>DST</abbr> ends up impressing a wealthy
|
||||
backer who sets him up for a 2020 presidential run.
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Books, plays, and magazines</h2>
|
||||
<ul>
|
||||
<li>
|
||||
Jules Verne, <em>Around the World in Eighty Days</em>
|
||||
(<em>Le tour du monde en quatre-vingts jours</em>), 1873.
|
||||
Wall-clock time plays a central role in the plot.
|
||||
European readers of the 1870s clearly held the U.S. press in
|
||||
deep contempt; the protagonists cross the U.S. without once
|
||||
reading a paper.
|
||||
Available versions include
|
||||
<a href="https://www.gutenberg.org/ebooks/103">an English
|
||||
translation</a>, and
|
||||
<a href="https://fourmilab.ch/etexts/www/tdm80j">the original French</a>
|
||||
"with illustrations from the original 1873 French-language edition".
|
||||
</li>
|
||||
<li>
|
||||
Nick Enright, <em>Daylight Saving</em>, 1989.
|
||||
A fast-paced comedy about love and loneliness as the clocks turn back.
|
||||
</li>
|
||||
<li>
|
||||
Umberto Eco,
|
||||
<a href="https://en.wikipedia.org/wiki/The_Island_of_the_Day_Before"><em>The
|
||||
Island of the Day Before</em></a>
|
||||
(<em>L'isola del giorno prima</em>), 1994.
|
||||
"...the story of a 17th century Italian nobleman trapped near an island
|
||||
on the International Date Line. Time and time zones play an integral
|
||||
part in the novel." (Paul Eggert, 2006-04-22)
|
||||
</li>
|
||||
<li>
|
||||
John Dunning, <a
|
||||
href="https://www.simonandschuster.com/books/Two-OClock-Eastern-Wartime/John-Dunning/9781439171530"><em>Two
|
||||
O'Clock, Eastern Wartime</em></a>, 2001.
|
||||
Mystery, history, daylight saving time, and old-time radio.
|
||||
</li>
|
||||
<li>
|
||||
Surrealist artist Guy Billout's work "Date Line" appeared on page 103
|
||||
of the 1999-11 <em>Atlantic Monthly</em>.
|
||||
</li>
|
||||
<li>
|
||||
"Gloom, Gloom, Go Away" by Walter Kirn appeared on page 106 of <em>Time</em>
|
||||
magazine's 2002-11-11 issue; among other things, it proposed
|
||||
year-round <abbr>DST</abbr> as a way of lessening wintertime despair.
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Music</h2>
|
||||
<p>
|
||||
Data on recordings of "Save That Time," Russ Long, Serrob Publishing, BMI:</p>
|
||||
<table>
|
||||
<tr><td>Artist</td><td>Karrin Allyson</td></tr>
|
||||
<tr><td>CD</td><td>I Didn't Know About You</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1993</td></tr>
|
||||
<tr><td>Label</td><td>Concord Jazz, Inc.</td></tr>
|
||||
<tr><td>ID</td><td>CCD-4543</td></tr>
|
||||
<tr><td>Track Time</td><td>3:44</td></tr>
|
||||
<tr><td>Personnel</td><td>Karrin Allyson, vocal;
|
||||
Russ Long, piano;
|
||||
Gerald Spaits, bass;
|
||||
Todd Strait, drums</td></tr>
|
||||
<tr><td>Notes</td><td>CD notes "additional lyric by Karrin Allyson;
|
||||
arranged by Russ Long and Karrin Allyson"</td></tr>
|
||||
<tr><td>ADO Rating</td><td>1 star</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/i-didnt-know-about-you-mw0000618657">AMG Rating</a></td><td>4 stars</td></tr>
|
||||
<tr><td>Penguin Rating</td><td>3.5 stars</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
<tr><td>Artist</td><td>Kevin Mahogany</td></tr>
|
||||
<tr><td>CD</td><td>Double Rainbow</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1993</td></tr>
|
||||
<tr><td>Label</td><td>Enja Records</td></tr>
|
||||
<tr><td>ID</td><td>ENJ-7097 2</td></tr>
|
||||
<tr><td>Track Time</td><td>6:27</td></tr>
|
||||
<tr><td>Personnel</td><td>Kevin Mahogany, vocal;
|
||||
Kenny Barron, piano;
|
||||
Ray Drummond, bass;
|
||||
Ralph Moore, tenor saxophone;
|
||||
Lewis Nash, drums</td></tr>
|
||||
<tr><td>ADO Rating</td><td>1.5 stars</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/double-rainbow-mw0000620371">AMG Rating</a></td><td>3 stars</td></tr>
|
||||
<tr><td>Penguin Rating</td><td>3 stars</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
<tr><td>Artist</td><td>Joe Williams</td></tr>
|
||||
<tr><td>CD</td><td>Here's to Life</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1994</td></tr>
|
||||
<tr><td>Label</td><td>Telarc International Corporation</td></tr>
|
||||
<tr><td>ID</td><td>CD-83357</td></tr>
|
||||
<tr><td>Track Time</td><td>3:58</td></tr>
|
||||
<tr><td>Personnel</td><td>Joe Williams, vocal
|
||||
The Robert Farnon [39 piece] Orchestra</td></tr>
|
||||
<tr><td>Notes</td><td>This CD is also available as part of a 3-CD package from
|
||||
Telarc, "Triple Play" (CD-83461)</td></tr>
|
||||
<tr><td>ADO Rating</td><td>black dot</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/heres-to-life-mw0000623648">AMG Rating</a></td><td>2 stars</td></tr>
|
||||
<tr><td>Penguin Rating</td><td>3 stars</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
<tr><td>Artist</td><td>Charles Fambrough</td></tr>
|
||||
<tr><td>CD</td><td>Keeper of the Spirit</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1995</td></tr>
|
||||
<tr><td>Label</td><td>AudioQuest Music</td></tr>
|
||||
<tr><td>ID</td><td>AQ-CD1033</td></tr>
|
||||
<tr><td>Track Time</td><td>7:07</td></tr>
|
||||
<tr><td>Personnel</td><td>Charles Fambrough, bass;
|
||||
Joel Levine, tenor recorder;
|
||||
Edward Simon, piano;
|
||||
Lenny White, drums;
|
||||
Marion Simon, percussion</td></tr>
|
||||
<tr><td>ADO Rating</td><td>2 stars</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/keeper-of-the-spirit-mw0000176559">AMG Rating</a></td><td>unrated</td></tr>
|
||||
<tr><td>Penguin Rating</td><td>3 stars</td></tr>
|
||||
</table>
|
||||
<hr>
|
||||
<p>Also of note:</p>
|
||||
<table>
|
||||
<tr><td>Artist</td><td>Holly Cole Trio</td></tr>
|
||||
<tr><td>CD</td><td>Blame It On My Youth</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1992</td></tr>
|
||||
<tr><td>Label</td><td>Manhattan</td></tr>
|
||||
<tr><td>ID</td><td>CDP 7 97349 2</td></tr>
|
||||
<tr><td>Total Time</td><td>37:45</td></tr>
|
||||
<tr><td>Personnel</td><td>Holly Cole, voice;
|
||||
Aaron Davis, piano;
|
||||
David Piltch, string bass</td></tr>
|
||||
<tr><td>Notes</td><td>Lyrical reference to "Eastern Standard Time" in
|
||||
Tom Waits' "Purple Avenue"</td></tr>
|
||||
<tr><td>ADO Rating</td><td>2.5 stars</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/blame-it-on-my-youth-mw0000274303">AMG Rating</a></td><td>3 stars</td></tr>
|
||||
<tr><td>Penguin Rating</td><td>unrated</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
<tr><td>Artist</td><td>Milt Hinton</td></tr>
|
||||
<tr><td>CD</td><td>Old Man Time</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1990</td></tr>
|
||||
<tr><td>Label</td><td>Chiaroscuro</td></tr>
|
||||
<tr><td>ID</td><td>CR(D) 310</td></tr>
|
||||
<tr><td>Total Time</td><td>149:38 (two CDs)</td></tr>
|
||||
<tr><td>Personnel</td><td>Milt Hinton, bass;
|
||||
Doc Cheatham, Dizzy Gillespie, Clark Terry, trumpet;
|
||||
Al Grey, trombone;
|
||||
Eddie Barefield, Joe Camel (Flip Phillips), Buddy Tate,
|
||||
clarinet and saxophone;
|
||||
John Bunch, Red Richards, Norman Simmons, Derek Smith,
|
||||
Ralph Sutton, piano;
|
||||
Danny Barker, Al Casey, guitar;
|
||||
Gus Johnson, Gerryck King, Bob Rosengarden, Jackie Williams,
|
||||
drums;
|
||||
Lionel Hampton, vibraphone;
|
||||
Cab Calloway, Joe Williams, vocal;
|
||||
Buck Clayton, arrangements</td></tr>
|
||||
<tr><td>Notes</td><td>tunes include Old Man Time, Time After Time,
|
||||
Sometimes I'm Happy,
|
||||
A Hot Time in the Old Town Tonight,
|
||||
Four or Five Times, Now's the Time,
|
||||
Time on My Hands, This Time It's Us,
|
||||
and Good Time Charlie.
|
||||
<a href="http://www.chiaroscurojazz.com/album.php?C=310">Album info</a>
|
||||
is available.</td></tr>
|
||||
<tr><td>ADO Rating</td><td>3 stars</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/old-man-time-mw0000269353">AMG Rating</a></td><td>4.5 stars</td></tr>
|
||||
<tr><td>Penguin Rating</td><td>3 stars</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
<tr><td>Artist</td><td>Alan Broadbent</td></tr>
|
||||
<tr><td>CD</td><td>Pacific Standard Time</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1995</td></tr>
|
||||
<tr><td>Label</td><td>Concord Jazz, Inc.</td></tr>
|
||||
<tr><td>ID</td><td>CCD-4664</td></tr>
|
||||
<tr><td>Total Time</td><td>62:42</td></tr>
|
||||
<tr><td>Personnel</td><td>Alan Broadbent, piano;
|
||||
Putter Smith, Bass;
|
||||
Frank Gibson, Jr., drums</td></tr>
|
||||
<tr><td>Notes</td><td>The CD cover features an analemma for equation-of-time fans</td></tr>
|
||||
<tr><td>ADO Rating</td><td>1 star</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/pacific-standard-time-mw0000645433">AMG Rating</a></td><td>4 stars</td></tr>
|
||||
<tr><td>Penguin Rating</td><td>3.5 stars</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
<tr><td>Artist</td><td>Anthony Braxton/Richard Teitelbaum</td></tr>
|
||||
<tr><td>CD</td><td>Silence/Time Zones</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1996</td></tr>
|
||||
<tr><td>Label</td><td>Black Lion</td></tr>
|
||||
<tr><td>ID</td><td>BLCD 760221</td></tr>
|
||||
<tr><td>Total Time</td><td>72:58</td></tr>
|
||||
<tr><td>Personnel</td><td>Anthony Braxton, sopranino and alto saxophones,
|
||||
contrebasse clarinet, miscellaneous instruments;
|
||||
Leo Smith, trumpet and miscellaneous instruments;
|
||||
Leroy Jenkins, violin and miscellaneous instruments;
|
||||
Richard Teitelbaum, modular moog and micromoog synthesizer</td></tr>
|
||||
<tr><td>ADO Rating</td><td>black dot</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/silence-time-zones-mw0000595735">AMG Rating</a></td><td>4 stars</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
<tr><td>Artist</td><td>Charles Gayle</td></tr>
|
||||
<tr><td>CD</td><td>Time Zones</td></tr>
|
||||
<tr><td>Copyright Date</td><td>2006</td></tr>
|
||||
<tr><td>Label</td><td>Tompkins Square</td></tr>
|
||||
<tr><td>ID</td><td>TSQ2839</td></tr>
|
||||
<tr><td>Total Time</td><td>49:06</td></tr>
|
||||
<tr><td>Personnel</td><td>Charles Gayle, piano</td></tr>
|
||||
<tr><td>ADO Rating</td><td>1 star</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/time-zones-mw0000349642">AMG Rating</a></td><td>4.5 stars</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
<tr><td>Artist</td><td>The Get Up Kids</td></tr>
|
||||
<tr><td>CD</td><td>Eudora</td></tr>
|
||||
<tr><td>Copyright Date</td><td>2001</td></tr>
|
||||
<tr><td>Label</td><td>Vagrant</td></tr>
|
||||
<tr><td>ID</td><td>357</td></tr>
|
||||
<tr><td>Total Time</td><td>65:12</td></tr>
|
||||
<tr><td>Notes</td><td>Includes the song "Central Standard Time." Thanks to Colin Bowern for this information.</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/eudora-mw0000592063">AMG Rating</a></td><td>2.5 stars</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
|
||||
<tr><td>Artist</td><td>Coldplay</td></tr>
|
||||
<tr><td>Song</td><td>Clocks</td></tr>
|
||||
<tr><td>Copyright Date</td><td>2003</td></tr>
|
||||
<tr><td>Label</td><td>Capitol Records</td></tr>
|
||||
<tr><td>ID</td><td>52608</td></tr>
|
||||
<tr><td>Total Time</td><td>4:13</td></tr>
|
||||
<tr><td>Notes</td><td>Won the 2004 Record of the Year honor at the
|
||||
Grammy Awards. Co-written and performed by Chris Martin,
|
||||
great-great-grandson of <abbr>DST</abbr> inventor William Willett.
|
||||
The song's first line is "Lights go out and I can't be saved".</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
|
||||
<tr><td>Artist</td><td>Jaime Guevara</td></tr>
|
||||
<tr><td>Song</td><td><a
|
||||
href="https://www.youtube.com/watch?v=ZfN4Fe_A50U">Qué
|
||||
hora es</a></td></tr>
|
||||
<tr><td>Date</td><td>1993</td></tr>
|
||||
<tr><td>Total Time</td><td>3:04</td></tr>
|
||||
<tr><td>Notes</td><td>The song protested "Sixto Hour" in Ecuador
|
||||
(1992–3). Its lyrics include "Amanecía en mitad de la noche, los
|
||||
guaguas iban a clase sin sol" ("It was dawning in the middle of the
|
||||
night, the buses went to class without sun").
|
||||
<tr><td> </td><td></td></tr>
|
||||
|
||||
<tr><td>Artist</td><td>Irving Kahal and Harry Richman</td></tr>
|
||||
<tr><td>Song</td><td>There Ought to be a Moonlight Saving Time</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1931</td>
|
||||
<tr><td>Notes</td><td>This musical standard was a No. 1 hit for Guy Lombardo
|
||||
in 1931, and was also performed by Maurice Chevalier, Blossom Dearie
|
||||
and many others. The phrase "Moonlight saving time" also appears in
|
||||
the 1995 country song "Not Enough Hours in the Night" written by Aaron
|
||||
Barker, Kim Williams and Rob Harbin and performed by Doug
|
||||
Supernaw.</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
|
||||
<tr><td>Artist</td><td>The Microscopic Septet</td></tr>
|
||||
<tr><td>CD</td><td>Lobster Leaps In</td></tr>
|
||||
<tr><td>Copyright Date</td><td>2008</td></tr>
|
||||
<tr><td>Label</td><td>Cuneiform</td></tr>
|
||||
<tr><td>ID</td><td>272</td></tr>
|
||||
<tr><td>Total Time</td><td>73:05</td></tr>
|
||||
<tr><td>Notes</td><td>Includes the song "Twilight Time Zone."</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/lobster-leaps-in-mw0000794929">AMG Rating</a></td><td>3.5 stars</td></tr>
|
||||
<tr><td>ADO Rating</td><td>2 stars</td></tr>
|
||||
|
||||
<tr><td> </td><td></td></tr>
|
||||
|
||||
<tr><td>Artist</td><td>Bob Dylan</td></tr>
|
||||
<tr><td>CD</td><td>The Times They Are a-Changin'</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1964</td></tr>
|
||||
<tr><td>Label</td><td>Columbia</td></tr>
|
||||
<tr><td>ID</td><td>CK-8905</td></tr>
|
||||
<tr><td>Total Time</td><td>45:36</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/the-times-they-a-changin-mw0000202344">AMG Rating</a></td><td>4.5 stars</td></tr>
|
||||
<tr><td>ADO Rating</td><td>1.5 stars</td></tr>
|
||||
<tr><td>Notes<td>The title song is also available on "Bob Dylan's Greatest Hits" and "The Essential Bob Dylan."</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
|
||||
<tr><td>Artist</td><td>Luciana Souza</td></tr>
|
||||
<tr><td>CD</td><td>Tide</td></tr>
|
||||
<tr><td>Copyright Date</td><td>2009</td></tr>
|
||||
<tr><td>Label</td><td>Universal Jazz France</td></tr>
|
||||
<tr><td>ID</td><td>B0012688-02</td></tr>
|
||||
<tr><td>Total Time</td><td>42:31</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/tide-mw0000815692">AMG Rating</a></td><td>3.5 stars</td></tr>
|
||||
<tr><td>ADO Rating</td><td>2.5 stars</td></tr>
|
||||
<tr><td>Notes<td>Includes the song "Fire and Wood" with the lyric
|
||||
"The clocks were turned back you remember/Think it's still November."
|
||||
</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
<tr><td>Artist</td><td>Ken Nordine</td></tr>
|
||||
<tr><td>CD</td><td>You're Getting Better: The Word Jazz Dot Masters</td></tr>
|
||||
<tr><td>Copyright Date</td><td>2005</td></tr>
|
||||
<tr><td>Label</td><td>Geffen</td></tr>
|
||||
<tr><td>ID</td><td>B0005171-02</td></tr>
|
||||
<tr><td>Total Time</td><td>156:22</td></tr>
|
||||
<tr><td>ADO Rating</td><td>1 star</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/youre-getting-better-the-word-jazz-dot-masters-mw0000736197">AMG Rating</a></td><td>4.5 stars</td></tr>
|
||||
<tr><td>Notes</td><td>Includes the piece "What Time Is It"
|
||||
("He knew what time it was everywhere...that counted").</td></tr>
|
||||
<tr><td> </td><td></td></tr>
|
||||
<tr><td>Artist</td><td>Chicago</td></tr>
|
||||
<tr><td>CD</td><td>Chicago Transit Authority</td></tr>
|
||||
<tr><td>Copyright Date</td><td>1969</td></tr>
|
||||
<tr><td>Label</td><td>Columbia</td></tr>
|
||||
<tr><td>ID</td><td>64409</td></tr>
|
||||
<tr><td>Total Time</td><td>1:16:20</td></tr>
|
||||
<tr><td><a href="https://www.allmusic.com/album/chicago-transit-authority-mw0000189364">AMG Rating</a></td><td>4 stars</td></tr>
|
||||
<tr><td>Notes</td><td>Includes the song "Does Anybody Really Know What Time It Is?"</td></tr>
|
||||
</table>
|
||||
<h2>Comics</h2>
|
||||
<ul>
|
||||
<li>
|
||||
The webcomic <em>xkcd</em> has the strip
|
||||
"<a href="https://xkcd.com/673/">The Sun</a>" (2009-12-09) and the panels
|
||||
"<a href="https://xkcd.com/1017/">Backward in Time</a>" (2012-02-14),
|
||||
"<a href="https://xkcd.com/1061/">EST</a>" (2012-05-28),
|
||||
"<a href="https://xkcd.com/1179/">ISO 8601</a>" (2013-02-27),
|
||||
"<a href="https://xkcd.com/1335/">Now</a>" (2014-02-26),
|
||||
"<a href="https://xkcd.com/1655/">Doomsday Clock</a>" (2016-03-14),
|
||||
"<a href="https://xkcd.com/1799/">Bad Map Projection: Time Zones</a>"
|
||||
(2017-02-15),
|
||||
"<a href="https://xkcd.com/1883/">Supervillain Plan</a>" (2017-08-30),
|
||||
"<a href="https://xkcd.com/2050/">6/6 Time</a>" (2018-09-24),
|
||||
and "<a href="https://xkcd.com/2266/">Leap Smearing</a>" (2020-02-10).
|
||||
The related book <em>What If?</em> has an entry
|
||||
"<a href="https://what-if.xkcd.com/26/">Leap Seconds</a>" (2012-12-31).
|
||||
</li>
|
||||
<li>
|
||||
Pig kills time in <a
|
||||
href="https://www.gocomics.com/pearlsbeforeswine/2016/11/06"><em>Pearls
|
||||
Before Swine</em> (2016-11-06)</a>.
|
||||
</li>
|
||||
<li>
|
||||
Stonehenge is abandoned in <a
|
||||
href="https://www.gocomics.com/nonsequitur/2017/03/12"><em>Non Sequitur</em>
|
||||
(2017-03-12)</a>.
|
||||
<li>
|
||||
The boss freaks out in <a
|
||||
href="https://dilbert.com/strip/1998-03-14"><em>Dilbert</em> (1998-03-14)</a>.
|
||||
</li>
|
||||
<li>
|
||||
Peppermint Patty: "What if the world comes to an end tonight, Marcie?"
|
||||
<br>
|
||||
Marcie: "I promise there'll be a tomorrow, sir ... in fact,
|
||||
it's already tomorrow in Australia!"
|
||||
<br>
|
||||
(Charles M. Schulz, <a href="https://www.gocomics.com/peanuts/1980/06/13"><em>Peanuts</em>, 1980-06-13</a>)
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Jokes</h2>
|
||||
<ul>
|
||||
<li>
|
||||
The idea behind daylight saving time was first proposed as a joke by
|
||||
Benjamin Franklin. To enforce it, he suggested, "Every
|
||||
morning, as soon as the sun rises, let all the bells in every church
|
||||
be set ringing; and if that is not sufficient, let cannon be fired in
|
||||
every street, to wake the sluggards effectually, and make them open
|
||||
their eyes to see their true interest. All the difficulty will be in
|
||||
the first two or three days: after which the reformation will be as
|
||||
natural and easy as the present irregularity; for, <em>ce n'est que le
|
||||
premier pas qui coûte</em>."
|
||||
<a href="http://www.webexhibits.org/daylightsaving/franklin3.html">Franklin's
|
||||
joke</a> was first published on 1784-04-26 by the
|
||||
<em>Journal de Paris</em> as <a
|
||||
href="https://en.wikipedia.org/wiki/File:Franklin-Benjamin-Journal-de-Paris-1784.jpg">an
|
||||
anonymous letter translated into French</a>.
|
||||
</li>
|
||||
<li>
|
||||
"We've been using the five-cent nickel in this country since 1492.
|
||||
Now that's pretty near 100 years, daylight saving."
|
||||
(Groucho Marx as Captain Spaulding in <em>Animal Crackers</em>, 1930,
|
||||
as noted by Will Fitzgerald)
|
||||
</li>
|
||||
<li>
|
||||
BRADY. ...[Bishop Usher] determined that the Lord began the Creation
|
||||
on the 23rd of October in the Year 4,004 B.C. at – uh, 9 A.M.!
|
||||
<br>
|
||||
DRUMMOND. That Eastern Standard Time? (<em>Laughter.</em>) Or Rocky Mountain
|
||||
Time? (<em>More laughter.</em>) It wasn't daylight-saving time, was it? Because
|
||||
the Lord didn't make the sun until the fourth day!
|
||||
<br>
|
||||
(From the play <em>Inherit the Wind</em> by Jerome Lawrence and Robert E. Lee,
|
||||
filmed in 1960 with Spencer Tracy as Drummond and Fredric March as
|
||||
Brady, and several other times. Thanks to Mark Brader.)
|
||||
</li>
|
||||
<li>
|
||||
"Good news."
|
||||
"What did they do? Extend Daylight Saving Time year round?"
|
||||
(Professional tanner George Hamilton, in dialog from a
|
||||
May, 1999 episode of the syndicated television series <em>Baywatch</em>)
|
||||
</li>
|
||||
<li>
|
||||
"A fundamental belief held by Americans is that if you are on land, you
|
||||
cannot be killed by a fish...So most Americans remain on land, believing
|
||||
they're safe. Unfortunately, this belief – like so many myths, such as that
|
||||
there's a reason for 'Daylight Saving Time' – is false."
|
||||
(Dave Barry column, 2000-07-02)
|
||||
</li>
|
||||
<li>
|
||||
"I once had sex for an hour and five minutes, but that was on the day
|
||||
when you turn the clocks ahead."
|
||||
(Garry Shandling, 52nd Annual Emmys, 2000-09-10)
|
||||
</li>
|
||||
<li>
|
||||
"Would it impress you if I told you I invented Daylight Savings Time?"
|
||||
("Sahjhan" to "Lilah" in dialog from the "Loyalty" episode of <em>Angel</em>,
|
||||
originally aired 2002-02-25)
|
||||
</li>
|
||||
<li>
|
||||
"I thought you said Tulsa was a three-hour flight."
|
||||
"Well, you're forgetting about the time difference."
|
||||
("Joey" and "Chandler" in dialog from the episode of <em>Friends</em>
|
||||
entitled "The One With Rachel's Phone Number," originally aired 2002-12-05)
|
||||
</li>
|
||||
<li>
|
||||
"Is that a pertinent fact,
|
||||
or are you just trying to dazzle me with your command of time zones?"
|
||||
(Kelsey Grammer as "Frasier Crane" to "Roz" from the episode of <em>Frasier</em>
|
||||
entitled "The Kid," originally aired 1997-11-04)
|
||||
</li>
|
||||
<li>
|
||||
"I put myself and my staff through this crazy, huge ordeal, all because
|
||||
I refused to go on at midnight, okay? And so I work, you know, and
|
||||
then I get this job at eleven, supposed to be a big deal. Then
|
||||
yesterday daylight [saving] time ended. Right now it's basically
|
||||
midnight." (Conan O'Brien on the 2010-11-08 premiere of <em>Conan</em>.)
|
||||
</li>
|
||||
<li>
|
||||
"The best method, I told folks, was to hang a large clock high on a
|
||||
barn wall where all the cows could see it. If you have Holsteins, you
|
||||
will need to use an analog clock." (Jerry Nelson, <a
|
||||
href="http://www.agriculture.com/family/farm-humor/how-to-adjust-dairy-cows-to-daylight-savings-time">How
|
||||
to adjust dairy cows to daylight saving time</a>", <em>Successful Farming</em>,
|
||||
2017-10-09.)
|
||||
</li>
|
||||
<li>
|
||||
"And now, driving to California, I find that I must enter a password
|
||||
in order to change the time zone on my laptop clock. Evidently,
|
||||
someone is out to mess up my schedule and my clock must be secured."
|
||||
(Garrison Keillor,
|
||||
"<a href="http://www.garrisonkeillor.com/weve-never-been-here-before/">We've
|
||||
never been here before</a>", 2017-08-22)
|
||||
</li>
|
||||
<li>
|
||||
"Well, in my time zone that's all the time I have,
|
||||
but maybe in your time zone I haven't finished yet. So stay tuned!"
|
||||
(Goldie Hawn, <em>Rowan & Martin's Laugh-In</em> No. 65, 1970-03-09)
|
||||
</li>
|
||||
</ul>
|
||||
<h2>See also</h2>
|
||||
<ul>
|
||||
<li><a href="tz-link.html">Time Zone and Daylight Saving
|
||||
Time Data</a></li>
|
||||
</ul>
|
||||
<hr>
|
||||
<address>
|
||||
This web page is in the public domain, so clarified as of
|
||||
2009-05-17 by Arthur David Olson.
|
||||
<br>
|
||||
Please send corrections to this web page to the
|
||||
<a href="mailto:tz@iana.org">time zone mailing list</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
719
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tz-how-to.html
vendored
Normal file
719
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tz-how-to.html
vendored
Normal file
@@ -0,0 +1,719 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>How to Read the tz Database</title>
|
||||
<meta charset="UTF-8">
|
||||
<style>
|
||||
pre {margin-left: 2em; white-space: pre-wrap;}
|
||||
pre.td {margin-left: 0;}
|
||||
td {text-align: center;}
|
||||
table {border: 1px outset;}
|
||||
th, td {border: 1px inset;}
|
||||
table.rule {border: none; margin: auto;}
|
||||
td.footnote {text-align: left;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h2>How to Read the <a href="https://en.wikipedia.org/wiki/Tz_database">tz
|
||||
Database</a> Source Files</h2>
|
||||
<h3>by Bill Seymour</h3>
|
||||
<p>This guide uses the <code>America/Chicago</code> and
|
||||
<code>Pacific/Honolulu</code> zones as examples of how to infer
|
||||
times of day from the <a href="tz-link.html">tz database</a>
|
||||
source files. It might be helpful, but not absolutely necessary,
|
||||
for the reader to have already downloaded the
|
||||
latest release of the database and become familiar with the basic layout
|
||||
of the data files. The format is explained in the “man
|
||||
page” for the zic compiler, <code>zic.8.txt</code>, in
|
||||
the <code>code</code> subdirectory.
|
||||
Although this guide covers many of the common cases, it is not a
|
||||
complete summary of what zic accepts; the man page is the
|
||||
authoritative reference.</p>
|
||||
|
||||
<p>We’ll begin by talking about the rules for changing between standard
|
||||
and daylight saving time since we’ll need that information when we talk
|
||||
about the zones.</p>
|
||||
|
||||
<p>First, let’s consider the special daylight saving time rules
|
||||
for Chicago (from the <code>northamerica</code> file in
|
||||
the <code>data</code> subdirectory):</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th colspan="6">From the Source File</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="rule">
|
||||
<tr><td style="border:none;text-align:left">
|
||||
<pre class="td">
|
||||
#Rule NAME FROM TO - IN ON AT SAVE LETTER
|
||||
Rule Chicago 1920 only - Jun 13 2:00 1:00 D
|
||||
Rule Chicago 1920 1921 - Oct lastSun 2:00 0 S
|
||||
Rule Chicago 1921 only - Mar lastSun 2:00 1:00 D
|
||||
Rule Chicago 1922 1966 - Apr lastSun 2:00 1:00 D
|
||||
Rule Chicago 1922 1954 - Sep lastSun 2:00 0 S
|
||||
Rule Chicago 1955 1966 - Oct lastSun 2:00 0 S
|
||||
</pre>
|
||||
</td></tr></table></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="6">Reformatted a Bit</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>From</th>
|
||||
<th>To</th>
|
||||
<th colspan="2">On</th>
|
||||
<th>At</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">1920 only</td>
|
||||
<td colspan="2">June 13<small><sup>th</sup></small></td>
|
||||
<td rowspan="6">02:00 local</td>
|
||||
<td>go to daylight saving time</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1920</td>
|
||||
<td>1921</td>
|
||||
<td rowspan="5">last Sunday</td>
|
||||
<td>in October</td>
|
||||
<td>return to standard time</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">1921 only</td>
|
||||
<td>in March</td>
|
||||
<td rowspan="2">go to daylight saving time</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="2">1922</td>
|
||||
<td>1966</td>
|
||||
<td>in April</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1954</td>
|
||||
<td>in September</td>
|
||||
<td rowspan="2">return to standard time</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1955</td>
|
||||
<td>1966</td>
|
||||
<td>in October</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>The <code>FROM</code> and <code>TO</code> columns, respectively, specify the
|
||||
first and last calendar years defining a contiguous range over which a specific
|
||||
Rule line is to apply. The keyword <code>only</code> can be used in the
|
||||
<code>TO</code> field to repeat the value of the <code>FROM</code> field in the
|
||||
event that a rule should only apply to a single year. Often, the keyword
|
||||
<code>max</code> is used to extend a rule’s application into the
|
||||
indefinite future; it is a platform-agnostic stand-in for the largest
|
||||
representable year.
|
||||
|
||||
<p>The next column, <code>-</code>, is reserved; for compatibility with earlier
|
||||
releases, it always contains a hyphen, which acts as a kind of null value.
|
||||
Prior to the 2020b release, it was called the <code>TYPE</code> field, though
|
||||
it had not been used in the main data since the 2000e release.
|
||||
An obsolescent supplementary file used the
|
||||
field as a proof-of-concept to allow <code>zic</code> to apply a given Rule
|
||||
line only to certain “types” of years within the specified range as
|
||||
dictated by the output of a separate script, such as: only years which would
|
||||
have a US presidential election, or only years which wouldn’t.
|
||||
|
||||
<p>The <code>SAVE</code> column contains the local (wall clock) offset from
|
||||
local standard time.
|
||||
This is usually either zero for standard time or one hour for daylight
|
||||
saving time; but there’s no reason, in principle, why it can’t
|
||||
take on other values.
|
||||
|
||||
<p>The <code>LETTER</code> (sometimes called <code>LETTER/S</code>)
|
||||
column can contain a variable
|
||||
part of the usual abbreviation of the time zone’s name, or it can just
|
||||
be a hyphen if there’s no variable part. For example, the abbreviation
|
||||
used in the central time zone will be either “CST” or
|
||||
“CDT”. The variable part is ‘S’ or ‘D’;
|
||||
and, sure enough, that’s just what we find in
|
||||
the <code>LETTER</code> column
|
||||
in the <code>Chicago</code> rules. More about this when we talk about
|
||||
“Zone” lines.
|
||||
|
||||
<p>One important thing to notice is that “Rule” lines
|
||||
want at once to be both <i>transitions</i> and <i>steady states</i>:
|
||||
<ul>
|
||||
<li>On the one hand, they represent transitions between standard and
|
||||
daylight saving time; and any number of Rule lines can be in effect
|
||||
during a given period (which will always be a non-empty set of
|
||||
contiguous calendar years).</li>
|
||||
<li>On the other hand, the <code>SAVE</code> and <code>LETTER</code>
|
||||
columns contain state that exists between transitions. More about this
|
||||
when we talk about the US rules.</li>
|
||||
</ul>
|
||||
|
||||
<p>In the example above, the transition to daylight saving time
|
||||
happened on the 13<small><sup>th</sup></small> of June in 1920, and on
|
||||
the last Sunday in March in 1921; but the return to standard time
|
||||
happened on the last Sunday in October in both of those
|
||||
years. Similarly, the rule for changing to daylight saving time was
|
||||
the same from 1922 to 1966; but the rule for returning to standard
|
||||
time changed in 1955. Got it?</p>
|
||||
|
||||
<p>OK, now for the somewhat more interesting “US” rules:</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th colspan="6">From the Source File</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="rule">
|
||||
<tr><td style="border:none;text-align:left">
|
||||
<pre class="td">
|
||||
#Rule NAME FROM TO - IN ON AT SAVE LETTER/S
|
||||
Rule US 1918 1919 - Mar lastSun 2:00 1:00 D
|
||||
Rule US 1918 1919 - Oct lastSun 2:00 0 S
|
||||
Rule US 1942 only - Feb 9 2:00 1:00 W # War
|
||||
Rule US 1945 only - Aug 14 23:00u 1:00 P # Peace
|
||||
Rule US 1945 only - Sep 30 2:00 0 S
|
||||
Rule US 1967 2006 - Oct lastSun 2:00 0 S
|
||||
Rule US 1967 1973 - Apr lastSun 2:00 1:00 D
|
||||
Rule US 1974 only - Jan 6 2:00 1:00 D
|
||||
Rule US 1975 only - Feb 23 2:00 1:00 D
|
||||
Rule US 1976 1986 - Apr lastSun 2:00 1:00 D
|
||||
Rule US 1987 2006 - Apr Sun>=1 2:00 1:00 D
|
||||
Rule US 2007 max - Mar Sun>=8 2:00 1:00 D
|
||||
Rule US 2007 max - Nov Sun>=1 2:00 0 S
|
||||
</pre>
|
||||
</td></tr></table></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="6">Reformatted a Bit</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>From</th>
|
||||
<th>To</th>
|
||||
<th colspan="2">On</th>
|
||||
<th>At</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="2">1918</td>
|
||||
<td rowspan="2">1919</td>
|
||||
<td rowspan="2">last Sunday</td>
|
||||
<td>in March</td>
|
||||
<td rowspan="3">02:00 local</td>
|
||||
<td>go to daylight saving time</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>in October</td>
|
||||
<td>return to standard time</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">1942 only</td>
|
||||
<td colspan="2">February 9<small><sup>th</sup></small></td>
|
||||
<td>go to “war time”</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" rowspan="2">1945 only</td>
|
||||
<td colspan="2">August 14<small><sup>th</sup></small></td>
|
||||
<td>23:00 <a href="https://en.wikipedia.org/wiki/Universal_Time">UT</a></td>
|
||||
<td>
|
||||
rename “war time” to “peace<br>time;”
|
||||
clocks don’t change
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">September 30<small><sup>th</sup></small></td>
|
||||
<td rowspan="9">02:00 local</td>
|
||||
<td rowspan="2">return to standard time</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="2">1967</td>
|
||||
<td>2006</td>
|
||||
<td rowspan="2">last Sunday</td>
|
||||
<td>in October</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1973</td>
|
||||
<td>in April</td>
|
||||
<td rowspan="6">go to daylight saving time</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">1974 only</td>
|
||||
<td colspan="2">January 6<small><sup>th</sup></small></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">1975 only</td>
|
||||
<td colspan="2">February 23<small><sup>rd</sup></small></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1976</td>
|
||||
<td>1986</td>
|
||||
<td>last Sunday</td>
|
||||
<td rowspan="2">in April</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1987</td>
|
||||
<td>2006</td>
|
||||
<td>first Sunday</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="2">2007</td>
|
||||
<td rowspan="2">present</td>
|
||||
<td colspan="2">second Sunday in March</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">first Sunday in November</td>
|
||||
<td>return to standard time</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>There are two interesting things to note here.</p>
|
||||
|
||||
<p>First, the time that something happens (in the <code>AT</code>
|
||||
column) is not necessarily the local (wall clock) time. The time can be
|
||||
suffixed with ‘s’ (for “standard”) to mean
|
||||
local standard time, different from local (wall clock) time when observing
|
||||
daylight saving time; or it can be suffixed with ‘g’,
|
||||
‘u’, or ‘z’, all three of which mean the
|
||||
standard time at the
|
||||
<a href="https://en.wikipedia.org/wiki/Prime_Meridian">prime meridian</a>.
|
||||
‘g’ stands for “<a
|
||||
href="https://en.wikipedia.org/wiki/Greenwich_Mean_Time">GMT</a>”;
|
||||
‘u’ stands for “<a
|
||||
href="https://en.wikipedia.org/wiki/Universal_Time">UT</a>” or “<a
|
||||
href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time">UTC</a>”
|
||||
(whichever was official at the time); ‘z’ stands for the
|
||||
<a href="https://en.wikipedia.org/wiki/Nautical_time">nautical time zone</a>
|
||||
Z (a.k.a. “Zulu” which, in turn, stands for ‘Z’).
|
||||
The time can also be suffixed with ‘w’ meaning local (wall
|
||||
clock) time; but it usually isn’t because that’s the
|
||||
default.</p>
|
||||
|
||||
<p>Second, the day in the <code>ON</code> column, in addition to
|
||||
“<code>lastSun</code>” or a particular day of the month,
|
||||
can have the form, “<code>Sun>=</code><i>x</i>” or
|
||||
“<code>Sun<=</code><i>x</i>,” where <i>x</i> is a day
|
||||
of the month. For example, “<code>Sun>=8</code>” means
|
||||
“the first Sunday on or after the eighth of the month,” in
|
||||
other words, the second Sunday of the month. Furthermore, although
|
||||
there are no examples above, the weekday needn’t be
|
||||
“<code>Sun</code>” in either form, but can be the usual
|
||||
three-character English abbreviation for any day of the week.</p>
|
||||
|
||||
<p>And the US rules give us more examples of a couple of things
|
||||
already mentioned:</p>
|
||||
|
||||
<ul>
|
||||
<li>The rules for changing to and from daylight saving time are
|
||||
actually <i>different sets</i> of rules; and the two sets can change
|
||||
independently. Consider, for example, that the rule for the return to
|
||||
standard time stayed the same from 1967 to 2006; but the rule for the
|
||||
transition to daylight saving time changed several times in the same
|
||||
period. There can also be periods, 1946 to 1966 for example, when no
|
||||
rule from this group is in effect, and so either no transition
|
||||
happened in those years, or some other rule is in effect (perhaps a
|
||||
state or other more local rule).</li>
|
||||
|
||||
<li>The <code>SAVE</code> and <code>LETTER</code> columns
|
||||
contain <i>steady state</i>, not transitions. Consider, for example,
|
||||
the transition from “war time” to “peace time”
|
||||
that happened on August 14, 1945. The “1:00” in
|
||||
the <code>SAVE</code> column is <i>not</i> an instruction to advance
|
||||
the clock an hour. It means that clocks should <i>be</i> one hour
|
||||
ahead of standard time, which they already are because of the previous
|
||||
rule, so there should be no change.</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<p>OK, now let’s look at a Zone record:</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th colspan="5">From the Source File</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="5">
|
||||
<table class="rule">
|
||||
<tr><td style="border:none;text-align:left">
|
||||
<pre class="td">
|
||||
#Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Chicago -5:50:36 - LMT 1883 Nov 18 12:09:24
|
||||
-6:00 US C%sT 1920
|
||||
-6:00 Chicago C%sT 1936 Mar 1 2:00
|
||||
-5:00 - EST 1936 Nov 15 2:00
|
||||
-6:00 Chicago C%sT 1942
|
||||
-6:00 US C%sT 1946
|
||||
-6:00 Chicago C%sT 1967
|
||||
-6:00 US C%sT
|
||||
</pre>
|
||||
</td></tr></table></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="5">Columns Renamed</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th rowspan="2">Standard Offset<br>
|
||||
from <a href="https://en.wikipedia.org/wiki/Prime_Meridian">Prime
|
||||
Meridian</a></th>
|
||||
<th rowspan="2">Daylight<br>Saving Time</th>
|
||||
<th rowspan="2">Abbreviation(s)</th>
|
||||
<th colspan="2">Ending at Local Time</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Date</th>
|
||||
<th>Time</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>−5:50:36</td>
|
||||
<td>not observed</td>
|
||||
<td>LMT</td>
|
||||
<td>1883-11-18</td>
|
||||
<td>12:09:24</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="2">−6:00:00</td>
|
||||
<td>US rules</td>
|
||||
<td rowspan="2">CST or CDT</td>
|
||||
<td>1920-01-01</td>
|
||||
<td>00:00:00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Chicago rules</td>
|
||||
<td>1936-03-01</td>
|
||||
<td rowspan="2">02:00:00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>−5:00:00</td>
|
||||
<td>not observed</td>
|
||||
<td>EST</td>
|
||||
<td>1936-11-15</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="4">−6:00:00</td>
|
||||
<td>Chicago rules</td>
|
||||
<td>CST or CDT</td>
|
||||
<td>1942-01-01</td>
|
||||
<td rowspan="3">00:00:00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>US rules</td>
|
||||
<td>CST, CWT or CPT</td>
|
||||
<td>1946-01-01</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Chicago rules</td>
|
||||
<td rowspan="2">CST or CDT</td>
|
||||
<td>1967-01-01</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>US rules</td>
|
||||
<td colspan="2">—</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>There are a couple of interesting differences between Zones and Rules.</p>
|
||||
|
||||
<p>First, and somewhat trivially, whereas Rules are considered to
|
||||
contain one or more records, a Zone is considered to be a single
|
||||
record with zero or more <i>continuation lines</i>. Thus, the keyword,
|
||||
“<code>Zone</code>,” and the zone name are not
|
||||
repeated. The last line is the one without anything in
|
||||
the <code>[UNTIL]</code> column.</p>
|
||||
|
||||
<p>Second, and more fundamentally, each line of a Zone represents a
|
||||
steady state, not a transition between states. The state exists from
|
||||
the date and time in the previous line’s <code>[UNTIL]</code>
|
||||
column up to the date and time in the current
|
||||
line’s <code>[UNTIL]</code> column. In other words, the date and
|
||||
time in the <code>[UNTIL]</code> column is the instant that separates
|
||||
this state from the next. Where that would be ambiguous because
|
||||
we’re setting our clocks back, the <code>[UNTIL]</code> column
|
||||
specifies the first occurrence of the instant. The state specified by
|
||||
the last line, the one without anything in the <code>[UNTIL]</code>
|
||||
column, continues to the present.</p>
|
||||
|
||||
<p>The first line typically specifies the mean solar time observed
|
||||
before the introduction of standard time. Since there’s no line before
|
||||
that, it has no beginning. <code>8-) </code> For some places near the <a
|
||||
href="https://en.wikipedia.org/wiki/International_Date_Line">International
|
||||
Date Line</a>, the first <i>two</i> lines will show solar times
|
||||
differing by 24 hours; this corresponds to a movement of the Date
|
||||
Line. For example:</p>
|
||||
|
||||
<pre>
|
||||
#Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Juneau 15:02:19 - LMT 1867 Oct 18
|
||||
-8:57:41 - LMT ...
|
||||
</pre>
|
||||
|
||||
<p>When Alaska was purchased from Russia in 1867, the Date Line moved
|
||||
from the Alaska/Canada border to the Bering Strait; and the time in
|
||||
Alaska was then 24 hours earlier than it had
|
||||
been. <code><aside></code>(6 October in the Julian calendar,
|
||||
which Russia was still using then for religious reasons, was followed
|
||||
by <i>a second instance of the same day with a different name</i>, 18
|
||||
October in the Gregorian calendar. Isn’t civil time
|
||||
wonderful? <code>8-)</code>)<code></aside></code></p>
|
||||
|
||||
<p>The abbreviation, “LMT” stands for “local mean
|
||||
time”, which is an invention of
|
||||
the <a href="https://en.wikipedia.org/wiki/Tz_database">tz
|
||||
database</a> and was probably never actually used during the
|
||||
period. Furthermore, the value is almost certainly wrong except in the
|
||||
archetypal place after which the zone is named. (The tz database
|
||||
usually doesn’t provide a separate Zone record for places where
|
||||
nothing significant happened after 1970.)</p>
|
||||
|
||||
<p>The <code>RULES</code> column tells us whether daylight saving time is being observed:
|
||||
<ul>
|
||||
<li>A hyphen, a kind of null value, means that we have not set our
|
||||
clocks ahead of standard time.</li>
|
||||
|
||||
<li>An amount of time (usually but not necessarily “1:00”
|
||||
meaning one hour) means that we have set our clocks ahead by that
|
||||
amount.</li>
|
||||
|
||||
<li>Some alphabetic string means that we <i>might have</i> set our
|
||||
clocks ahead; and we need to check the rule the name of which is the
|
||||
given alphabetic string.</li>
|
||||
</ul>
|
||||
|
||||
<p>An example of a specific amount of time is:</p>
|
||||
<pre>
|
||||
#Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Honolulu ... 1933 Apr 30 2:00
|
||||
-10:30 1:00 HDT 1933 May 21 12:00
|
||||
...
|
||||
</pre>
|
||||
|
||||
<p>Hawaii tried daylight saving time for three weeks in 1933 and
|
||||
decided they didn’t like it. <code>8-) </code>Note that
|
||||
the <code>STDOFF</code> column always contains the standard time
|
||||
offset, so the local (wall clock) time during this period was GMT −
|
||||
10:30 + 1:00 = GMT − 9:30.</p>
|
||||
|
||||
<p>The <code>FORMAT</code> column specifies the usual abbreviation of
|
||||
the time zone name. It should have one of four forms:</p>
|
||||
<ul>
|
||||
|
||||
<li>a time zone abbreviation that is a string of three or more
|
||||
characters that are either ASCII alphanumerics,
|
||||
“<code>+</code>”, or “<code>-</code>”</li>
|
||||
|
||||
<li>the string “%z”, in which case the
|
||||
“<code>%z</code>” will be replaced by a numeric time zone
|
||||
abbreviation</li>
|
||||
|
||||
<li>a pair of time zone abbreviations separated by a slash
|
||||
(‘<code>/</code>’), in which case the first string is the
|
||||
abbreviation for the standard time name and the second string is the
|
||||
abbreviation for the daylight saving time name</li>
|
||||
|
||||
<li>a string containing “<code>%s</code>”, in which case
|
||||
the “<code>%s</code>” will be replaced by the text in the
|
||||
appropriate Rule’s <code>LETTER</code> column, and the resulting
|
||||
string should be a time zone abbreviation</li>
|
||||
</ul>
|
||||
|
||||
<p>The last two make sense only if there’s a named rule in effect.</p>
|
||||
|
||||
<p>An example of a slash is:</p>
|
||||
<pre>
|
||||
#Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Europe/London ... 1996
|
||||
0:00 EU GMT/BST
|
||||
</pre>
|
||||
|
||||
<p>The current time in the UK is called either Greenwich mean time or
|
||||
British summer time.</p>
|
||||
|
||||
<p>One wrinkle, not fully explained in <code>zic.8.txt</code>, is what
|
||||
happens when switching to a named rule. To what values should
|
||||
the <code>SAVE</code> and <code>LETTER</code> data be initialized?</p>
|
||||
|
||||
<ul>
|
||||
<li>If at least one transition has happened, use
|
||||
the <code>SAVE</code> and <code>LETTER</code> data from the most
|
||||
recent.</li>
|
||||
|
||||
<li>If switching to a named rule before any transition has happened,
|
||||
assume standard time (<code>SAVE</code> zero), and use
|
||||
the <code>LETTER</code> data from the earliest transition with
|
||||
a <code>SAVE</code> of zero.
|
||||
|
||||
</ul>
|
||||
|
||||
<p>And three last things about the <code>FORMAT</code> column:</p>
|
||||
<ul>
|
||||
|
||||
<li>The <a href="https://en.wikipedia.org/wiki/Tz_database">tz
|
||||
database</a> gives abbreviations for time zones in <i>popular
|
||||
usage</i>, which is not necessarily “correct” by law. For
|
||||
example, the last line in
|
||||
<code>Zone</code> <code>Pacific/Honolulu</code> (shown below) gives
|
||||
“HST” for “Hawaii standard time” even though the
|
||||
<a href="https://www.law.cornell.edu/uscode/text/15/263">legal</a>
|
||||
name for that time zone is “Hawaii-Aleutian standard time.”
|
||||
This author has read that there are also some places in Australia where
|
||||
popular time zone names differ from the legal ones.
|
||||
|
||||
<li>No attempt is made to <a
|
||||
href="https://en.wikipedia.org/wiki/Internationalization_and_localization">localize</a>
|
||||
the abbreviations. They are intended to be the values returned through the
|
||||
<code>"%Z"</code> format specifier to
|
||||
<a href="https://en.wikipedia.org/wiki/C_(programming_language)">C</a>’s
|
||||
<a href="https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html"><code>strftime</code></a>
|
||||
function in the
|
||||
<a href="https://kirste.userpage.fu-berlin.de/chemnet/use/info/libc/libc_19.html#SEC324">“C” locale</a>.
|
||||
|
||||
<li>If there is no generally-accepted abbreviation for a time zone,
|
||||
a numeric offset is used instead, e.g., <code>+07</code> for 7 hours
|
||||
ahead of Greenwich. By convention, <code>-00</code> is used in a
|
||||
zone while uninhabited, where the offset is zero but in some sense
|
||||
the true offset is undefined.
|
||||
</ul>
|
||||
|
||||
<p>As a final example, here’s the complete history for Hawaii:</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th colspan="6">Relevant Excerpts from the US Rules</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="rule">
|
||||
<tr><td style="border:none;text-align:left">
|
||||
<pre class="td">
|
||||
#Rule NAME FROM TO - IN ON AT SAVE LETTER/S
|
||||
Rule US 1918 1919 - Oct lastSun 2:00 0 S
|
||||
Rule US 1942 only - Feb 9 2:00 1:00 W # War
|
||||
Rule US 1945 only - Aug 14 23:00u 1:00 P # Peace
|
||||
Rule US 1945 only - Sep lastSun 2:00 0 S
|
||||
</pre>
|
||||
</td></tr></table></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="6">The Zone Record</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="rule">
|
||||
<tr><td style="border:none;text-align:left">
|
||||
<pre class="td">
|
||||
#Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Honolulu -10:31:26 - LMT 1896 Jan 13 12:00
|
||||
-10:30 - HST 1933 Apr 30 2:00
|
||||
-10:30 1:00 HDT 1933 May 21 2:00
|
||||
-10:30 US H%sT 1947 Jun 8 2:00
|
||||
-10:00 - HST
|
||||
</pre>
|
||||
</td></tr></table></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="6">What We Infer</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th rowspan="2">Wall-Clock<br>Offset from<br>Prime Meridian</th>
|
||||
<th rowspan="2">Adjust<br>Clocks</th>
|
||||
<th colspan="2">Time Zone</th>
|
||||
<th colspan="2">Ending at Local Time</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Abbrv.</th>
|
||||
<th>Name</th>
|
||||
<th>Date</th>
|
||||
<th>Time</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>−10:31:26</td>
|
||||
<td>—</td>
|
||||
<td>LMT</td>
|
||||
<td>local mean time</td>
|
||||
<td>1896-01-13</td>
|
||||
<td>12:00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>−10:30</td>
|
||||
<td>+0:01:26</td>
|
||||
<td>HST</td>
|
||||
<td>Hawaii standard time</td>
|
||||
<td>1933-04-30</td>
|
||||
<td>02:00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>−9:30</td>
|
||||
<td>+1:00</td>
|
||||
<td>HDT</td>
|
||||
<td>Hawaii daylight time</td>
|
||||
<td>1933-05-21</td>
|
||||
<td>12:00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>−10:30¹</td>
|
||||
<td>−1:00¹</td>
|
||||
<td>HST¹</td>
|
||||
<td>Hawaii standard time</td>
|
||||
<td>1942-02-09</td>
|
||||
<td>02:00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="2">−9:30</td>
|
||||
<td>+1:00</td>
|
||||
<td>HWT</td>
|
||||
<td>Hawaii war time</td>
|
||||
<td>1945-08-14</td>
|
||||
<td>13:30²</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>0</td>
|
||||
<td>HPT</td>
|
||||
<td>Hawaii peace time</td>
|
||||
<td>1945-09-30</td>
|
||||
<td rowspan="2">02:00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>−10:30</td>
|
||||
<td>−1:00</td>
|
||||
<td rowspan="2">HST</td>
|
||||
<td rowspan="2">Hawaii standard time</td>
|
||||
<td>1947-06-08</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>−10:00³</td>
|
||||
<td>+0:30³</td>
|
||||
<td colspan="2">—</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" class="footnote">
|
||||
¹Switching to US rules…most recent transition (in 1919) was to standard time
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" class="footnote">
|
||||
²23:00 <a href="https://en.wikipedia.org/wiki/Universal_Time">UT</a>
|
||||
+ (−9:30) = 13:30 local
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" class="footnote">
|
||||
³Since <a href="https://en.wikipedia.org/wiki/ISO_8601">1947–06–08T12:30Z</a>,
|
||||
the civil time in Hawaii has been
|
||||
<a href="https://en.wikipedia.org/wiki/Universal_Time">UT</a>/<a href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time">UTC</a>
|
||||
− 10:00 year-round.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>There will be a short quiz later. <code>8-)</code></p>
|
||||
|
||||
<hr>
|
||||
<address>
|
||||
This web page is in the public domain, so clarified as of
|
||||
2015-10-20 by Bill Seymour.
|
||||
<br>
|
||||
All suggestions and corrections will be welcome; all flames will be amusing.
|
||||
Mail to was at pobox dot com.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
1175
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tz-link.html
vendored
Normal file
1175
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tz-link.html
vendored
Normal file
File diff suppressed because it is too large
Load Diff
496
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tzfile.5
vendored
Normal file
496
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tzfile.5
vendored
Normal file
@@ -0,0 +1,496 @@
|
||||
.\" This file is in the public domain, so clarified as of
|
||||
.\" 1996-06-05 by Arthur David Olson.
|
||||
.TH TZFILE 5
|
||||
.SH NAME
|
||||
tzfile \- timezone information
|
||||
.SH DESCRIPTION
|
||||
.ie '\(lq'' .ds lq \&"\"
|
||||
.el .ds lq \(lq\"
|
||||
.ie '\(rq'' .ds rq \&"\"
|
||||
.el .ds rq \(rq\"
|
||||
.de q
|
||||
\\$3\*(lq\\$1\*(rq\\$2
|
||||
..
|
||||
.ie \n(.g .ds - \f(CR-\fP
|
||||
.el .ds - \-
|
||||
The timezone information files used by
|
||||
.BR tzset (3)
|
||||
are typically found under a directory with a name like
|
||||
.IR /usr/share/zoneinfo .
|
||||
These files use the format described in Internet RFC 8536.
|
||||
Each file is a sequence of 8-bit bytes.
|
||||
In a file, a binary integer is represented by a sequence of one or
|
||||
more bytes in network order (bigendian, or high-order byte first),
|
||||
with all bits significant,
|
||||
a signed binary integer is represented using two's complement,
|
||||
and a boolean is represented by a one-byte binary integer that is
|
||||
either 0 (false) or 1 (true).
|
||||
The format begins with a 44-byte header containing the following fields:
|
||||
.IP * 2
|
||||
The magic four-byte ASCII sequence
|
||||
.q "TZif"
|
||||
identifies the file as a timezone information file.
|
||||
.IP *
|
||||
A byte identifying the version of the file's format
|
||||
(as of 2021, either an ASCII NUL,
|
||||
.q "2",
|
||||
.q "3",
|
||||
or
|
||||
.q "4" ).
|
||||
.IP *
|
||||
Fifteen bytes containing zeros reserved for future use.
|
||||
.IP *
|
||||
Six four-byte integer values, in the following order:
|
||||
.RS
|
||||
.TP
|
||||
.B tzh_ttisutcnt
|
||||
The number of UT/local indicators stored in the file.
|
||||
(UT is Universal Time.)
|
||||
.TP
|
||||
.B tzh_ttisstdcnt
|
||||
The number of standard/wall indicators stored in the file.
|
||||
.TP
|
||||
.B tzh_leapcnt
|
||||
The number of leap seconds for which data entries are stored in the file.
|
||||
.TP
|
||||
.B tzh_timecnt
|
||||
The number of transition times for which data entries are stored
|
||||
in the file.
|
||||
.TP
|
||||
.B tzh_typecnt
|
||||
The number of local time types for which data entries are stored
|
||||
in the file (must not be zero).
|
||||
.TP
|
||||
.B tzh_charcnt
|
||||
The number of bytes of time zone abbreviation strings
|
||||
stored in the file.
|
||||
.RE
|
||||
.PP
|
||||
The above header is followed by the following fields, whose lengths
|
||||
depend on the contents of the header:
|
||||
.IP * 2
|
||||
.B tzh_timecnt
|
||||
four-byte signed integer values sorted in ascending order.
|
||||
These values are written in network byte order.
|
||||
Each is used as a transition time (as returned by
|
||||
.BR time (2))
|
||||
at which the rules for computing local time change.
|
||||
.IP *
|
||||
.B tzh_timecnt
|
||||
one-byte unsigned integer values;
|
||||
each one but the last tells which of the different types of local time types
|
||||
described in the file is associated with the time period
|
||||
starting with the same-indexed transition time
|
||||
and continuing up to but not including the next transition time.
|
||||
(The last time type is present only for consistency checking with the
|
||||
POSIX-style TZ string described below.)
|
||||
These values serve as indices into the next field.
|
||||
.IP *
|
||||
.B tzh_typecnt
|
||||
.B ttinfo
|
||||
entries, each defined as follows:
|
||||
.in +.5i
|
||||
.sp
|
||||
.nf
|
||||
.ta .5i +\w'unsigned char\0\0'u
|
||||
struct ttinfo {
|
||||
int32_t tt_utoff;
|
||||
unsigned char tt_isdst;
|
||||
unsigned char tt_desigidx;
|
||||
};
|
||||
.in -.5i
|
||||
.fi
|
||||
.sp
|
||||
Each structure is written as a four-byte signed integer value for
|
||||
.BR tt_utoff ,
|
||||
in network byte order, followed by a one-byte boolean for
|
||||
.B tt_isdst
|
||||
and a one-byte value for
|
||||
.BR tt_desigidx .
|
||||
In each structure,
|
||||
.B tt_utoff
|
||||
gives the number of seconds to be added to UT,
|
||||
.B tt_isdst
|
||||
tells whether
|
||||
.B tm_isdst
|
||||
should be set by
|
||||
.BR localtime (3)
|
||||
and
|
||||
.B tt_desigidx
|
||||
serves as an index into the array of time zone abbreviation bytes
|
||||
that follow the
|
||||
.B ttinfo
|
||||
entries in the file; if the designated string is "\*-00", the
|
||||
.B ttinfo
|
||||
entry is a placeholder indicating that local time is unspecified.
|
||||
The
|
||||
.B tt_utoff
|
||||
value is never equal to \-2**31, to let 32-bit clients negate it without
|
||||
overflow.
|
||||
Also, in realistic applications
|
||||
.B tt_utoff
|
||||
is in the range [\-89999, 93599] (i.e., more than \-25 hours and less
|
||||
than 26 hours); this allows easy support by implementations that
|
||||
already support the POSIX-required range [\-24:59:59, 25:59:59].
|
||||
.IP *
|
||||
.B tzh_charcnt
|
||||
bytes that represent time zone designations,
|
||||
which are null-terminated byte strings, each indexed by the
|
||||
.B tt_desigidx
|
||||
values mentioned above.
|
||||
The byte strings can overlap if one is a suffix of the other.
|
||||
The encoding of these strings is not specified.
|
||||
.IP *
|
||||
.B tzh_leapcnt
|
||||
pairs of four-byte values, written in network byte order;
|
||||
the first value of each pair gives the nonnegative time
|
||||
(as returned by
|
||||
.BR time (2))
|
||||
at which a leap second occurs or at which the leap second table expires;
|
||||
the second is a signed integer specifying the correction, which is the
|
||||
.I total
|
||||
number of leap seconds to be applied during the time period
|
||||
starting at the given time.
|
||||
The pairs of values are sorted in strictly ascending order by time.
|
||||
Each pair denotes one leap second, either positive or negative,
|
||||
except that if the last pair has the same correction as the previous one,
|
||||
the last pair denotes the leap second table's expiration time.
|
||||
Each leap second is at the end of a UTC calendar month.
|
||||
The first leap second has a nonnegative occurrence time,
|
||||
and is a positive leap second if and only if its correction is positive;
|
||||
the correction for each leap second after the first differs
|
||||
from the previous leap second by either 1 for a positive leap second,
|
||||
or \-1 for a negative leap second.
|
||||
If the leap second table is empty, the leap-second correction is zero
|
||||
for all timestamps;
|
||||
otherwise, for timestamps before the first occurrence time,
|
||||
the leap-second correction is zero if the first pair's correction is 1 or \-1,
|
||||
and is unspecified otherwise (which can happen only in files
|
||||
truncated at the start).
|
||||
.IP *
|
||||
.B tzh_ttisstdcnt
|
||||
standard/wall indicators, each stored as a one-byte boolean;
|
||||
they tell whether the transition times associated with local time types
|
||||
were specified as standard time or local (wall clock) time.
|
||||
.IP *
|
||||
.B tzh_ttisutcnt
|
||||
UT/local indicators, each stored as a one-byte boolean;
|
||||
they tell whether the transition times associated with local time types
|
||||
were specified as UT or local time.
|
||||
If a UT/local indicator is set, the corresponding standard/wall indicator
|
||||
must also be set.
|
||||
.PP
|
||||
The standard/wall and UT/local indicators were designed for
|
||||
transforming a TZif file's transition times into transitions appropriate
|
||||
for another time zone specified via a POSIX-style TZ string that lacks rules.
|
||||
For example, when TZ="EET\*-2EEST" and there is no TZif file "EET\*-2EEST",
|
||||
the idea was to adapt the transition times from a TZif file with the
|
||||
well-known name "posixrules" that is present only for this purpose and
|
||||
is a copy of the file "Europe/Brussels", a file with a different UT offset.
|
||||
POSIX does not specify this obsolete transformational behavior,
|
||||
the default rules are installation-dependent, and no implementation
|
||||
is known to support this feature for timestamps past 2037,
|
||||
so users desiring (say) Greek time should instead specify
|
||||
TZ="Europe/Athens" for better historical coverage, falling back on
|
||||
TZ="EET\*-2EEST,M3.5.0/3,M10.5.0/4" if POSIX conformance is required
|
||||
and older timestamps need not be handled accurately.
|
||||
.PP
|
||||
The
|
||||
.BR localtime (3)
|
||||
function
|
||||
normally uses the first
|
||||
.B ttinfo
|
||||
structure in the file
|
||||
if either
|
||||
.B tzh_timecnt
|
||||
is zero or the time argument is less than the first transition time recorded
|
||||
in the file.
|
||||
.SS Version 2 format
|
||||
For version-2-format timezone files,
|
||||
the above header and data are followed by a second header and data,
|
||||
identical in format except that
|
||||
eight bytes are used for each transition time or leap second time.
|
||||
(Leap second counts remain four bytes.)
|
||||
After the second header and data comes a newline-enclosed,
|
||||
POSIX-TZ-environment-variable-style string for use in handling instants
|
||||
after the last transition time stored in the file
|
||||
or for all instants if the file has no transitions.
|
||||
The POSIX-style TZ string is empty (i.e., nothing between the newlines)
|
||||
if there is no POSIX-style representation for such instants.
|
||||
If nonempty, the POSIX-style TZ string must agree with the local time
|
||||
type after the last transition time if present in the eight-byte data;
|
||||
for example, given the string
|
||||
.q "WET0WEST,M3.5.0,M10.5.0/3"
|
||||
then if a last transition time is in July, the transition's local time
|
||||
type must specify a daylight-saving time abbreviated
|
||||
.q "WEST"
|
||||
that is one hour east of UT.
|
||||
Also, if there is at least one transition, time type 0 is associated
|
||||
with the time period from the indefinite past up to but not including
|
||||
the earliest transition time.
|
||||
.SS Version 3 format
|
||||
For version-3-format timezone files, the POSIX-TZ-style string may
|
||||
use two minor extensions to the POSIX TZ format, as described in
|
||||
.BR newtzset (3).
|
||||
First, the hours part of its transition times may be signed and range from
|
||||
\-167 through 167 instead of the POSIX-required unsigned values
|
||||
from 0 through 24.
|
||||
Second, DST is in effect all year if it starts
|
||||
January 1 at 00:00 and ends December 31 at 24:00 plus the difference
|
||||
between daylight saving and standard time.
|
||||
.SS Version 4 format
|
||||
For version-4-format TZif files,
|
||||
the first leap second record can have a correction that is neither
|
||||
+1 nor \-1, to represent truncation of the TZif file at the start.
|
||||
Also, if two or more leap second transitions are present and the last
|
||||
entry's correction equals the previous one, the last entry
|
||||
denotes the expiration of the leap second table instead of a leap second;
|
||||
timestamps after this expiration are unreliable in that future
|
||||
releases will likely add leap second entries after the expiration, and
|
||||
the added leap seconds will change how post-expiration timestamps are treated.
|
||||
.SS Interoperability considerations
|
||||
Future changes to the format may append more data.
|
||||
.PP
|
||||
Version 1 files are considered a legacy format and
|
||||
should not be generated, as they do not support transition
|
||||
times after the year 2038.
|
||||
Readers that understand only Version 1 must ignore
|
||||
any data that extends beyond the calculated end of the version
|
||||
1 data block.
|
||||
.PP
|
||||
Other than version 1, writers should generate
|
||||
the lowest version number needed by a file's data.
|
||||
For example, a writer should generate a version 4 file
|
||||
only if its leap second table either expires or is truncated at the start.
|
||||
Likewise, a writer not generating a version 4 file
|
||||
should generate a version 3 file only if
|
||||
TZ string extensions are necessary to accurately
|
||||
model transition times.
|
||||
.PP
|
||||
The sequence of time changes defined by the version 1
|
||||
header and data block should be a contiguous sub-sequence
|
||||
of the time changes defined by the version 2+ header and data
|
||||
block, and by the footer.
|
||||
This guideline helps obsolescent version 1 readers
|
||||
agree with current readers about timestamps within the
|
||||
contiguous sub-sequence. It also lets writers not
|
||||
supporting obsolescent readers use a
|
||||
.B tzh_timecnt
|
||||
of zero
|
||||
in the version 1 data block to save space.
|
||||
.PP
|
||||
When a TZif file contains a leap second table expiration
|
||||
time, TZif readers should either refuse to process
|
||||
post-expiration timestamps, or process them as if the expiration
|
||||
time did not exist (possibly with an error indication).
|
||||
.PP
|
||||
Time zone designations should consist of at least three (3)
|
||||
and no more than six (6) ASCII characters from the set of
|
||||
alphanumerics,
|
||||
.q "\*-",
|
||||
and
|
||||
.q "+".
|
||||
This is for compatibility with POSIX requirements for
|
||||
time zone abbreviations.
|
||||
.PP
|
||||
When reading a version 2 or higher file, readers
|
||||
should ignore the version 1 header and data block except for
|
||||
the purpose of skipping over them.
|
||||
.PP
|
||||
Readers should calculate the total lengths of the
|
||||
headers and data blocks and check that they all fit within
|
||||
the actual file size, as part of a validity check for the file.
|
||||
.PP
|
||||
When a positive leap second occurs, readers should append an extra
|
||||
second to the local minute containing the second just before the leap
|
||||
second. If this occurs when the UTC offset is not a multiple of 60
|
||||
seconds, the leap second occurs earlier than the last second of the
|
||||
local minute and the minute's remaining local seconds are numbered
|
||||
through 60 instead of the usual 59; the UTC offset is unaffected.
|
||||
.SS Common interoperability issues
|
||||
This section documents common problems in reading or writing TZif files.
|
||||
Most of these are problems in generating TZif files for use by
|
||||
older readers.
|
||||
The goals of this section are:
|
||||
.IP * 2
|
||||
to help TZif writers output files that avoid common
|
||||
pitfalls in older or buggy TZif readers,
|
||||
.IP *
|
||||
to help TZif readers avoid common pitfalls when reading
|
||||
files generated by future TZif writers, and
|
||||
.IP *
|
||||
to help any future specification authors see what sort of
|
||||
problems arise when the TZif format is changed.
|
||||
.PP
|
||||
When new versions of the TZif format have been defined, a
|
||||
design goal has been that a reader can successfully use a TZif
|
||||
file even if the file is of a later TZif version than what the
|
||||
reader was designed for.
|
||||
When complete compatibility was not achieved, an attempt was
|
||||
made to limit glitches to rarely used timestamps and allow
|
||||
simple partial workarounds in writers designed to generate
|
||||
new-version data useful even for older-version readers.
|
||||
This section attempts to document these compatibility issues and
|
||||
workarounds, as well as to document other common bugs in
|
||||
readers.
|
||||
.PP
|
||||
Interoperability problems with TZif include the following:
|
||||
.IP * 2
|
||||
Some readers examine only version 1 data.
|
||||
As a partial workaround, a writer can output as much version 1
|
||||
data as possible.
|
||||
However, a reader should ignore version 1 data, and should use
|
||||
version 2+ data even if the reader's native timestamps have only
|
||||
32 bits.
|
||||
.IP *
|
||||
Some readers designed for version 2 might mishandle
|
||||
timestamps after a version 3 or higher file's last transition, because
|
||||
they cannot parse extensions to POSIX in the TZ-like string.
|
||||
As a partial workaround, a writer can output more transitions
|
||||
than necessary, so that only far-future timestamps are
|
||||
mishandled by version 2 readers.
|
||||
.IP *
|
||||
Some readers designed for version 2 do not support
|
||||
permanent daylight saving time with transitions after 24:00
|
||||
\(en e.g., a TZ string
|
||||
.q "EST5EDT,0/0,J365/25"
|
||||
denoting permanent Eastern Daylight Time
|
||||
(\-04).
|
||||
As a workaround, a writer can substitute standard time
|
||||
for two time zones east, e.g.,
|
||||
.q "XXX3EDT4,0/0,J365/23"
|
||||
for a time zone with a never-used standard time (XXX, \-03)
|
||||
and negative daylight saving time (EDT, \-04) all year.
|
||||
Alternatively,
|
||||
as a partial workaround a writer can substitute standard time
|
||||
for the next time zone east \(en e.g.,
|
||||
.q "AST4"
|
||||
for permanent
|
||||
Atlantic Standard Time (\-04).
|
||||
.IP *
|
||||
Some readers designed for version 2 or 3, and that require strict
|
||||
conformance to RFC 8536, reject version 4 files whose leap second
|
||||
tables are truncated at the start or that end in expiration times.
|
||||
.IP *
|
||||
Some readers ignore the footer, and instead predict future
|
||||
timestamps from the time type of the last transition.
|
||||
As a partial workaround, a writer can output more transitions
|
||||
than necessary.
|
||||
.IP *
|
||||
Some readers do not use time type 0 for timestamps before
|
||||
the first transition, in that they infer a time type using a
|
||||
heuristic that does not always select time type 0.
|
||||
As a partial workaround, a writer can output a dummy (no-op)
|
||||
first transition at an early time.
|
||||
.IP *
|
||||
Some readers mishandle timestamps before the first
|
||||
transition that has a timestamp not less than \-2**31.
|
||||
Readers that support only 32-bit timestamps are likely to be
|
||||
more prone to this problem, for example, when they process
|
||||
64-bit transitions only some of which are representable in 32
|
||||
bits.
|
||||
As a partial workaround, a writer can output a dummy
|
||||
transition at timestamp \-2**31.
|
||||
.IP *
|
||||
Some readers mishandle a transition if its timestamp has
|
||||
the minimum possible signed 64-bit value.
|
||||
Timestamps less than \-2**59 are not recommended.
|
||||
.IP *
|
||||
Some readers mishandle POSIX-style TZ strings that
|
||||
contain
|
||||
.q "<"
|
||||
or
|
||||
.q ">".
|
||||
As a partial workaround, a writer can avoid using
|
||||
.q "<"
|
||||
or
|
||||
.q ">"
|
||||
for time zone abbreviations containing only alphabetic
|
||||
characters.
|
||||
.IP *
|
||||
Many readers mishandle time zone abbreviations that contain
|
||||
non-ASCII characters.
|
||||
These characters are not recommended.
|
||||
.IP *
|
||||
Some readers may mishandle time zone abbreviations that
|
||||
contain fewer than 3 or more than 6 characters, or that
|
||||
contain ASCII characters other than alphanumerics,
|
||||
.q "\*-",
|
||||
and
|
||||
.q "+".
|
||||
These abbreviations are not recommended.
|
||||
.IP *
|
||||
Some readers mishandle TZif files that specify
|
||||
daylight-saving time UT offsets that are less than the UT
|
||||
offsets for the corresponding standard time.
|
||||
These readers do not support locations like Ireland, which
|
||||
uses the equivalent of the POSIX TZ string
|
||||
.q "IST\*-1GMT0,M10.5.0,M3.5.0/1",
|
||||
observing standard time
|
||||
(IST, +01) in summer and daylight saving time (GMT, +00) in winter.
|
||||
As a partial workaround, a writer can output data for the
|
||||
equivalent of the POSIX TZ string
|
||||
.q "GMT0IST,M3.5.0/1,M10.5.0",
|
||||
thus swapping standard and daylight saving time.
|
||||
Although this workaround misidentifies which part of the year
|
||||
uses daylight saving time, it records UT offsets and time zone
|
||||
abbreviations correctly.
|
||||
.IP *
|
||||
Some readers generate ambiguous timestamps for positive leap seconds
|
||||
that occur when the UTC offset is not a multiple of 60 seconds.
|
||||
For example, in a timezone with UTC offset +01:23:45 and with
|
||||
a positive leap second 78796801 (1972-06-30 23:59:60 UTC), some readers will
|
||||
map both 78796800 and 78796801 to 01:23:45 local time the next day
|
||||
instead of mapping the latter to 01:23:46, and they will map 78796815 to
|
||||
01:23:59 instead of to 01:23:60.
|
||||
This has not yet been a practical problem, since no civil authority
|
||||
has observed such UTC offsets since leap seconds were
|
||||
introduced in 1972.
|
||||
.PP
|
||||
Some interoperability problems are reader bugs that
|
||||
are listed here mostly as warnings to developers of readers.
|
||||
.IP * 2
|
||||
Some readers do not support negative timestamps.
|
||||
Developers of distributed applications should keep this
|
||||
in mind if they need to deal with pre-1970 data.
|
||||
.IP *
|
||||
Some readers mishandle timestamps before the first
|
||||
transition that has a nonnegative timestamp.
|
||||
Readers that do not support negative timestamps are likely to
|
||||
be more prone to this problem.
|
||||
.IP *
|
||||
Some readers mishandle time zone abbreviations like
|
||||
.q "\*-08"
|
||||
that contain
|
||||
.q "+",
|
||||
.q "\*-",
|
||||
or digits.
|
||||
.IP *
|
||||
Some readers mishandle UT offsets that are out of the
|
||||
traditional range of \-12 through +12 hours, and so do not
|
||||
support locations like Kiritimati that are outside this
|
||||
range.
|
||||
.IP *
|
||||
Some readers mishandle UT offsets in the range [\-3599, \-1]
|
||||
seconds from UT, because they integer-divide the offset by
|
||||
3600 to get 0 and then display the hour part as
|
||||
.q "+00".
|
||||
.IP *
|
||||
Some readers mishandle UT offsets that are not a multiple
|
||||
of one hour, or of 15 minutes, or of 1 minute.
|
||||
.SH SEE ALSO
|
||||
.BR time (2),
|
||||
.BR localtime (3),
|
||||
.BR tzset (3),
|
||||
.BR tzselect (8),
|
||||
.BR zdump (8),
|
||||
.BR zic (8).
|
||||
.PP
|
||||
Olson A, Eggert P, Murchison K. The Time Zone Information Format (TZif).
|
||||
2019 Feb.
|
||||
.UR https://\:datatracker.ietf.org/\:doc/\:html/\:rfc8536
|
||||
Internet RFC 8536
|
||||
.UE
|
||||
.UR https://\:doi.org/\:10.17487/\:RFC8536
|
||||
doi:10.17487/RFC8536
|
||||
.UE .
|
||||
123
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tzfile.h
vendored
Normal file
123
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tzfile.h
vendored
Normal file
@@ -0,0 +1,123 @@
|
||||
/* Layout and location of TZif files. */
|
||||
|
||||
#ifndef TZFILE_H
|
||||
|
||||
#define TZFILE_H
|
||||
|
||||
/*
|
||||
** This file is in the public domain, so clarified as of
|
||||
** 1996-06-05 by Arthur David Olson.
|
||||
*/
|
||||
|
||||
/*
|
||||
** This header is for use ONLY with the time conversion code.
|
||||
** There is no guarantee that it will remain unchanged,
|
||||
** or that it will remain at all.
|
||||
** Do NOT copy it to any system include directory.
|
||||
** Thank you!
|
||||
*/
|
||||
|
||||
/*
|
||||
** Information about time zone files.
|
||||
*/
|
||||
|
||||
#ifndef TZDIR
|
||||
# define TZDIR "/usr/share/zoneinfo" /* Time zone object file directory */
|
||||
#endif /* !defined TZDIR */
|
||||
|
||||
#ifndef TZDEFAULT
|
||||
# define TZDEFAULT "/etc/localtime"
|
||||
#endif /* !defined TZDEFAULT */
|
||||
|
||||
#ifndef TZDEFRULES
|
||||
# define TZDEFRULES "posixrules"
|
||||
#endif /* !defined TZDEFRULES */
|
||||
|
||||
|
||||
/* See Internet RFC 8536 for more details about the following format. */
|
||||
|
||||
/*
|
||||
** Each file begins with. . .
|
||||
*/
|
||||
|
||||
#define TZ_MAGIC "TZif"
|
||||
|
||||
struct tzhead {
|
||||
char tzh_magic[4]; /* TZ_MAGIC */
|
||||
char tzh_version[1]; /* '\0' or '2'-'4' as of 2021 */
|
||||
char tzh_reserved[15]; /* reserved; must be zero */
|
||||
char tzh_ttisutcnt[4]; /* coded number of trans. time flags */
|
||||
char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */
|
||||
char tzh_leapcnt[4]; /* coded number of leap seconds */
|
||||
char tzh_timecnt[4]; /* coded number of transition times */
|
||||
char tzh_typecnt[4]; /* coded number of local time types */
|
||||
char tzh_charcnt[4]; /* coded number of abbr. chars */
|
||||
};
|
||||
|
||||
/*
|
||||
** . . .followed by. . .
|
||||
**
|
||||
** tzh_timecnt (char [4])s coded transition times a la time(2)
|
||||
** tzh_timecnt (unsigned char)s types of local time starting at above
|
||||
** tzh_typecnt repetitions of
|
||||
** one (char [4]) coded UT offset in seconds
|
||||
** one (unsigned char) used to set tm_isdst
|
||||
** one (unsigned char) that's an abbreviation list index
|
||||
** tzh_charcnt (char)s '\0'-terminated zone abbreviations
|
||||
** tzh_leapcnt repetitions of
|
||||
** one (char [4]) coded leap second transition times
|
||||
** one (char [4]) total correction after above
|
||||
** tzh_ttisstdcnt (char)s indexed by type; if 1, transition
|
||||
** time is standard time, if 0,
|
||||
** transition time is local (wall clock)
|
||||
** time; if absent, transition times are
|
||||
** assumed to be local time
|
||||
** tzh_ttisutcnt (char)s indexed by type; if 1, transition
|
||||
** time is UT, if 0, transition time is
|
||||
** local time; if absent, transition
|
||||
** times are assumed to be local time.
|
||||
** When this is 1, the corresponding
|
||||
** std/wall indicator must also be 1.
|
||||
*/
|
||||
|
||||
/*
|
||||
** If tzh_version is '2' or greater, the above is followed by a second instance
|
||||
** of tzhead and a second instance of the data in which each coded transition
|
||||
** time uses 8 rather than 4 chars,
|
||||
** then a POSIX-TZ-environment-variable-style string for use in handling
|
||||
** instants after the last transition time stored in the file
|
||||
** (with nothing between the newlines if there is no POSIX representation for
|
||||
** such instants).
|
||||
**
|
||||
** If tz_version is '3' or greater, the above is extended as follows.
|
||||
** First, the POSIX TZ string's hour offset may range from -167
|
||||
** through 167 as compared to the POSIX-required 0 through 24.
|
||||
** Second, its DST start time may be January 1 at 00:00 and its stop
|
||||
** time December 31 at 24:00 plus the difference between DST and
|
||||
** standard time, indicating DST all year.
|
||||
*/
|
||||
|
||||
/*
|
||||
** In the current implementation, "tzset()" refuses to deal with files that
|
||||
** exceed any of the limits below.
|
||||
*/
|
||||
|
||||
#ifndef TZ_MAX_TIMES
|
||||
# define TZ_MAX_TIMES 2000
|
||||
#endif /* !defined TZ_MAX_TIMES */
|
||||
|
||||
#ifndef TZ_MAX_TYPES
|
||||
/* This must be at least 17 for Europe/Samara and Europe/Vilnius. */
|
||||
# define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */
|
||||
#endif /* !defined TZ_MAX_TYPES */
|
||||
|
||||
#ifndef TZ_MAX_CHARS
|
||||
# define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */
|
||||
/* (limited by what unsigned chars can hold) */
|
||||
#endif /* !defined TZ_MAX_CHARS */
|
||||
|
||||
#ifndef TZ_MAX_LEAPS
|
||||
# define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */
|
||||
#endif /* !defined TZ_MAX_LEAPS */
|
||||
|
||||
#endif /* !defined TZFILE_H */
|
||||
125
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tzselect.8
vendored
Normal file
125
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tzselect.8
vendored
Normal file
@@ -0,0 +1,125 @@
|
||||
.\" This file is in the public domain, so clarified as of
|
||||
.\" 2009-05-17 by Arthur David Olson.
|
||||
.TH TZSELECT 8
|
||||
.SH NAME
|
||||
tzselect \- select a timezone
|
||||
.SH SYNOPSIS
|
||||
.ie \n(.g .ds - \f(CR-\fP
|
||||
.el .ds - \-
|
||||
.ds d " degrees
|
||||
.ds m " minutes
|
||||
.ds s " seconds
|
||||
.ds _ " \&
|
||||
.if t \{\
|
||||
. if \n(.g .if c \(de .if c \(fm .if c \(sd \{\
|
||||
. ds d \(de
|
||||
. ds m \(fm
|
||||
. ds s \(sd
|
||||
. ds _ \|
|
||||
. \}
|
||||
.\}
|
||||
.B tzselect
|
||||
[
|
||||
.B \*-c
|
||||
.I coord
|
||||
] [
|
||||
.B \*-n
|
||||
.I limit
|
||||
] [
|
||||
.B \*-\*-help
|
||||
] [
|
||||
.B \*-\*-version
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B tzselect
|
||||
program asks the user for information about the current location,
|
||||
and outputs the resulting timezone to standard output.
|
||||
The output is suitable as a value for the TZ environment variable.
|
||||
.PP
|
||||
All interaction with the user is done via standard input and standard error.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.BI "\*-c " coord
|
||||
Instead of asking for continent and then country and then city,
|
||||
ask for selection from time zones whose largest cities
|
||||
are closest to the location with geographical coordinates
|
||||
.I coord.
|
||||
Use ISO 6709 notation for
|
||||
.I coord,
|
||||
that is, a latitude immediately followed by a longitude. The latitude
|
||||
and longitude should be signed integers followed by an optional
|
||||
decimal point and fraction: positive numbers represent north and east,
|
||||
negative south and west. Latitudes with two and longitudes with three
|
||||
integer digits are treated as degrees; latitudes with four or six and
|
||||
longitudes with five or seven integer digits are treated as
|
||||
.I "DDMM, DDDMM, DDMMSS,"
|
||||
or
|
||||
.I DDDMMSS
|
||||
representing
|
||||
.I DD
|
||||
or
|
||||
.I DDD
|
||||
degrees,
|
||||
.I MM
|
||||
minutes,
|
||||
and zero or
|
||||
.I SS
|
||||
seconds, with any trailing fractions represent fractional minutes or
|
||||
(if
|
||||
.I SS
|
||||
is present) seconds. The decimal point is that of the current locale.
|
||||
For example, in the (default) C locale,
|
||||
.B "\*-c\ +40.689\*-074.045"
|
||||
specifies 40.689\*d\*_N, 74.045\*d\*_W,
|
||||
.B "\*-c\ +4041.4\*-07402.7"
|
||||
specifies 40\*d\*_41.4\*m\*_N, 74\*d\*_2.7\*m\*_W, and
|
||||
.B "\*-c\ +404121\*-0740240"
|
||||
specifies 40\*d\*_41\*m\*_21\*s\*_N, 74\*d\*_2\*m\*_40\*s\*_W.
|
||||
If
|
||||
.I coord
|
||||
is not one of the documented forms, the resulting behavior is unspecified.
|
||||
.TP
|
||||
.BI "\*-n " limit
|
||||
When
|
||||
.B \*-c
|
||||
is used, display the closest
|
||||
.I limit
|
||||
locations (default 10).
|
||||
.TP
|
||||
.B "\*-\*-help"
|
||||
Output help information and exit.
|
||||
.TP
|
||||
.B "\*-\*-version"
|
||||
Output version information and exit.
|
||||
.SH "ENVIRONMENT VARIABLES"
|
||||
.TP
|
||||
\f3AWK\fP
|
||||
Name of a Posix-compliant
|
||||
.B awk
|
||||
program (default:
|
||||
.BR awk ).
|
||||
.TP
|
||||
\f3TZDIR\fP
|
||||
Name of the directory containing timezone data files (default:
|
||||
.BR /usr/share/zoneinfo ).
|
||||
.SH FILES
|
||||
.TP
|
||||
\f2TZDIR\fP\f3/iso3166.tab\fP
|
||||
Table of ISO 3166 2-letter country codes and country names.
|
||||
.TP
|
||||
\f2TZDIR\fP\f3/zone1970.tab\fP
|
||||
Table of country codes, latitude and longitude, timezones, and
|
||||
descriptive comments.
|
||||
.TP
|
||||
\f2TZDIR\fP\f3/\fP\f2TZ\fP
|
||||
Timezone data file for timezone \f2TZ\fP.
|
||||
.SH "EXIT STATUS"
|
||||
The exit status is zero if a timezone was successfully obtained from the user,
|
||||
nonzero otherwise.
|
||||
.SH "SEE ALSO"
|
||||
newctime(3), tzfile(5), zdump(8), zic(8)
|
||||
.SH NOTES
|
||||
Applications should not assume that
|
||||
.BR tzselect 's
|
||||
output matches the user's political preferences.
|
||||
586
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tzselect.ksh
vendored
Normal file
586
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/tzselect.ksh
vendored
Normal file
@@ -0,0 +1,586 @@
|
||||
#!/bin/bash
|
||||
# Ask the user about the time zone, and output the resulting TZ value to stdout.
|
||||
# Interact with the user via stderr and stdin.
|
||||
|
||||
PKGVERSION='(tzcode) '
|
||||
TZVERSION=see_Makefile
|
||||
REPORT_BUGS_TO=tz@iana.org
|
||||
|
||||
# Contributed by Paul Eggert. This file is in the public domain.
|
||||
|
||||
# Porting notes:
|
||||
#
|
||||
# This script requires a Posix-like shell and prefers the extension of a
|
||||
# 'select' statement. The 'select' statement was introduced in the
|
||||
# Korn shell and is available in Bash and other shell implementations.
|
||||
# If your host lacks both Bash and the Korn shell, you can get their
|
||||
# source from one of these locations:
|
||||
#
|
||||
# Bash <https://www.gnu.org/software/bash/>
|
||||
# Korn Shell <http://www.kornshell.com/>
|
||||
# MirBSD Korn Shell <http://www.mirbsd.org/mksh.htm>
|
||||
#
|
||||
# For portability to Solaris 10 /bin/sh (supported by Oracle through
|
||||
# January 2024) this script avoids some POSIX features and common
|
||||
# extensions, such as $(...) (which works sometimes but not others),
|
||||
# $((...)), ! CMD, ${#ID}, ${ID##PAT}, ${ID%%PAT}, and $10.
|
||||
|
||||
#
|
||||
# This script also uses several features of modern awk programs.
|
||||
# If your host lacks awk, or has an old awk that does not conform to Posix,
|
||||
# you can use either of the following free programs instead:
|
||||
#
|
||||
# Gawk (GNU awk) <https://www.gnu.org/software/gawk/>
|
||||
# mawk <https://invisible-island.net/mawk/>
|
||||
# nawk <https://github.com/onetrueawk/awk>
|
||||
|
||||
|
||||
# Specify default values for environment variables if they are unset.
|
||||
: ${AWK=awk}
|
||||
: ${TZDIR=`pwd`}
|
||||
|
||||
# Output one argument as-is to standard output.
|
||||
# Safer than 'echo', which can mishandle '\' or leading '-'.
|
||||
say() {
|
||||
printf '%s\n' "$1"
|
||||
}
|
||||
|
||||
# Check for awk Posix compliance.
|
||||
($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1
|
||||
[ $? = 123 ] || {
|
||||
say >&2 "$0: Sorry, your '$AWK' program is not Posix compatible."
|
||||
exit 1
|
||||
}
|
||||
|
||||
coord=
|
||||
location_limit=10
|
||||
zonetabtype=zone1970
|
||||
|
||||
usage="Usage: tzselect [--version] [--help] [-c COORD] [-n LIMIT]
|
||||
Select a timezone interactively.
|
||||
|
||||
Options:
|
||||
|
||||
-c COORD
|
||||
Instead of asking for continent and then country and then city,
|
||||
ask for selection from time zones whose largest cities
|
||||
are closest to the location with geographical coordinates COORD.
|
||||
COORD should use ISO 6709 notation, for example, '-c +4852+00220'
|
||||
for Paris (in degrees and minutes, North and East), or
|
||||
'-c -35-058' for Buenos Aires (in degrees, South and West).
|
||||
|
||||
-n LIMIT
|
||||
Display at most LIMIT locations when -c is used (default $location_limit).
|
||||
|
||||
--version
|
||||
Output version information.
|
||||
|
||||
--help
|
||||
Output this help.
|
||||
|
||||
Report bugs to $REPORT_BUGS_TO."
|
||||
|
||||
# Ask the user to select from the function's arguments,
|
||||
# and assign the selected argument to the variable 'select_result'.
|
||||
# Exit on EOF or I/O error. Use the shell's 'select' builtin if available,
|
||||
# falling back on a less-nice but portable substitute otherwise.
|
||||
if
|
||||
case $BASH_VERSION in
|
||||
?*) : ;;
|
||||
'')
|
||||
# '; exit' should be redundant, but Dash doesn't properly fail without it.
|
||||
(eval 'set --; select x; do break; done; exit') </dev/null 2>/dev/null
|
||||
esac
|
||||
then
|
||||
# Do this inside 'eval', as otherwise the shell might exit when parsing it
|
||||
# even though it is never executed.
|
||||
eval '
|
||||
doselect() {
|
||||
select select_result
|
||||
do
|
||||
case $select_result in
|
||||
"") echo >&2 "Please enter a number in range." ;;
|
||||
?*) break
|
||||
esac
|
||||
done || exit
|
||||
}
|
||||
'
|
||||
else
|
||||
doselect() {
|
||||
# Field width of the prompt numbers.
|
||||
select_width=`expr $# : '.*'`
|
||||
|
||||
select_i=
|
||||
|
||||
while :
|
||||
do
|
||||
case $select_i in
|
||||
'')
|
||||
select_i=0
|
||||
for select_word
|
||||
do
|
||||
select_i=`expr $select_i + 1`
|
||||
printf >&2 "%${select_width}d) %s\\n" $select_i "$select_word"
|
||||
done ;;
|
||||
*[!0-9]*)
|
||||
echo >&2 'Please enter a number in range.' ;;
|
||||
*)
|
||||
if test 1 -le $select_i && test $select_i -le $#; then
|
||||
shift `expr $select_i - 1`
|
||||
select_result=$1
|
||||
break
|
||||
fi
|
||||
echo >&2 'Please enter a number in range.'
|
||||
esac
|
||||
|
||||
# Prompt and read input.
|
||||
printf >&2 %s "${PS3-#? }"
|
||||
read select_i || exit
|
||||
done
|
||||
}
|
||||
fi
|
||||
|
||||
while getopts c:n:t:-: opt
|
||||
do
|
||||
case $opt$OPTARG in
|
||||
c*)
|
||||
coord=$OPTARG ;;
|
||||
n*)
|
||||
location_limit=$OPTARG ;;
|
||||
t*) # Undocumented option, used for developer testing.
|
||||
zonetabtype=$OPTARG ;;
|
||||
-help)
|
||||
exec echo "$usage" ;;
|
||||
-version)
|
||||
exec echo "tzselect $PKGVERSION$TZVERSION" ;;
|
||||
-*)
|
||||
say >&2 "$0: -$opt$OPTARG: unknown option; try '$0 --help'"; exit 1 ;;
|
||||
*)
|
||||
say >&2 "$0: try '$0 --help'"; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
shift `expr $OPTIND - 1`
|
||||
case $# in
|
||||
0) ;;
|
||||
*) say >&2 "$0: $1: unknown argument"; exit 1 ;;
|
||||
esac
|
||||
|
||||
# Make sure the tables are readable.
|
||||
TZ_COUNTRY_TABLE=$TZDIR/iso3166.tab
|
||||
TZ_ZONE_TABLE=$TZDIR/$zonetabtype.tab
|
||||
for f in $TZ_COUNTRY_TABLE $TZ_ZONE_TABLE
|
||||
do
|
||||
<"$f" || {
|
||||
say >&2 "$0: time zone files are not set up correctly"
|
||||
exit 1
|
||||
}
|
||||
done
|
||||
|
||||
# If the current locale does not support UTF-8, convert data to current
|
||||
# locale's format if possible, as the shell aligns columns better that way.
|
||||
# Check the UTF-8 of U+12345 CUNEIFORM SIGN URU TIMES KI.
|
||||
$AWK 'BEGIN { u12345 = "\360\222\215\205"; exit length(u12345) != 1 }' || {
|
||||
{ tmp=`(mktemp -d) 2>/dev/null` || {
|
||||
tmp=${TMPDIR-/tmp}/tzselect.$$ &&
|
||||
(umask 77 && mkdir -- "$tmp")
|
||||
};} &&
|
||||
trap 'status=$?; rm -fr -- "$tmp"; exit $status' 0 HUP INT PIPE TERM &&
|
||||
(iconv -f UTF-8 -t //TRANSLIT <"$TZ_COUNTRY_TABLE" >$tmp/iso3166.tab) \
|
||||
2>/dev/null &&
|
||||
TZ_COUNTRY_TABLE=$tmp/iso3166.tab &&
|
||||
iconv -f UTF-8 -t //TRANSLIT <"$TZ_ZONE_TABLE" >$tmp/$zonetabtype.tab &&
|
||||
TZ_ZONE_TABLE=$tmp/$zonetabtype.tab
|
||||
}
|
||||
|
||||
newline='
|
||||
'
|
||||
IFS=$newline
|
||||
|
||||
|
||||
# Awk script to read a time zone table and output the same table,
|
||||
# with each column preceded by its distance from 'here'.
|
||||
output_distances='
|
||||
BEGIN {
|
||||
FS = "\t"
|
||||
while (getline <TZ_COUNTRY_TABLE)
|
||||
if ($0 ~ /^[^#]/)
|
||||
country[$1] = $2
|
||||
country["US"] = "US" # Otherwise the strings get too long.
|
||||
}
|
||||
function abs(x) {
|
||||
return x < 0 ? -x : x;
|
||||
}
|
||||
function min(x, y) {
|
||||
return x < y ? x : y;
|
||||
}
|
||||
function convert_coord(coord, deg, minute, ilen, sign, sec) {
|
||||
if (coord ~ /^[-+]?[0-9]?[0-9][0-9][0-9][0-9][0-9][0-9]([^0-9]|$)/) {
|
||||
degminsec = coord
|
||||
intdeg = degminsec < 0 ? -int(-degminsec / 10000) : int(degminsec / 10000)
|
||||
minsec = degminsec - intdeg * 10000
|
||||
intmin = minsec < 0 ? -int(-minsec / 100) : int(minsec / 100)
|
||||
sec = minsec - intmin * 100
|
||||
deg = (intdeg * 3600 + intmin * 60 + sec) / 3600
|
||||
} else if (coord ~ /^[-+]?[0-9]?[0-9][0-9][0-9][0-9]([^0-9]|$)/) {
|
||||
degmin = coord
|
||||
intdeg = degmin < 0 ? -int(-degmin / 100) : int(degmin / 100)
|
||||
minute = degmin - intdeg * 100
|
||||
deg = (intdeg * 60 + minute) / 60
|
||||
} else
|
||||
deg = coord
|
||||
return deg * 0.017453292519943296
|
||||
}
|
||||
function convert_latitude(coord) {
|
||||
match(coord, /..*[-+]/)
|
||||
return convert_coord(substr(coord, 1, RLENGTH - 1))
|
||||
}
|
||||
function convert_longitude(coord) {
|
||||
match(coord, /..*[-+]/)
|
||||
return convert_coord(substr(coord, RLENGTH))
|
||||
}
|
||||
# Great-circle distance between points with given latitude and longitude.
|
||||
# Inputs and output are in radians. This uses the great-circle special
|
||||
# case of the Vicenty formula for distances on ellipsoids.
|
||||
function gcdist(lat1, long1, lat2, long2, dlong, x, y, num, denom) {
|
||||
dlong = long2 - long1
|
||||
x = cos(lat2) * sin(dlong)
|
||||
y = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dlong)
|
||||
num = sqrt(x * x + y * y)
|
||||
denom = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(dlong)
|
||||
return atan2(num, denom)
|
||||
}
|
||||
# Parallel distance between points with given latitude and longitude.
|
||||
# This is the product of the longitude difference and the cosine
|
||||
# of the latitude of the point that is further from the equator.
|
||||
# I.e., it considers longitudes to be further apart if they are
|
||||
# nearer the equator.
|
||||
function pardist(lat1, long1, lat2, long2) {
|
||||
return abs(long1 - long2) * min(cos(lat1), cos(lat2))
|
||||
}
|
||||
# The distance function is the sum of the great-circle distance and
|
||||
# the parallel distance. It could be weighted.
|
||||
function dist(lat1, long1, lat2, long2) {
|
||||
return gcdist(lat1, long1, lat2, long2) + pardist(lat1, long1, lat2, long2)
|
||||
}
|
||||
BEGIN {
|
||||
coord_lat = convert_latitude(coord)
|
||||
coord_long = convert_longitude(coord)
|
||||
}
|
||||
/^[^#]/ {
|
||||
here_lat = convert_latitude($2)
|
||||
here_long = convert_longitude($2)
|
||||
line = $1 "\t" $2 "\t" $3
|
||||
sep = "\t"
|
||||
ncc = split($1, cc, /,/)
|
||||
for (i = 1; i <= ncc; i++) {
|
||||
line = line sep country[cc[i]]
|
||||
sep = ", "
|
||||
}
|
||||
if (NF == 4)
|
||||
line = line " - " $4
|
||||
printf "%g\t%s\n", dist(coord_lat, coord_long, here_lat, here_long), line
|
||||
}
|
||||
'
|
||||
|
||||
# Begin the main loop. We come back here if the user wants to retry.
|
||||
while
|
||||
|
||||
echo >&2 'Please identify a location' \
|
||||
'so that time zone rules can be set correctly.'
|
||||
|
||||
continent=
|
||||
country=
|
||||
region=
|
||||
|
||||
case $coord in
|
||||
?*)
|
||||
continent=coord;;
|
||||
'')
|
||||
|
||||
# Ask the user for continent or ocean.
|
||||
|
||||
echo >&2 'Please select a continent, ocean, "coord", or "TZ".'
|
||||
|
||||
quoted_continents=`
|
||||
$AWK '
|
||||
function handle_entry(entry) {
|
||||
entry = substr(entry, 1, index(entry, "/") - 1)
|
||||
if (entry == "America")
|
||||
entry = entry "s"
|
||||
if (entry ~ /^(Arctic|Atlantic|Indian|Pacific)$/)
|
||||
entry = entry " Ocean"
|
||||
printf "'\''%s'\''\n", entry
|
||||
}
|
||||
BEGIN { FS = "\t" }
|
||||
/^[^#]/ {
|
||||
handle_entry($3)
|
||||
}
|
||||
/^#@/ {
|
||||
ncont = split($2, cont, /,/)
|
||||
for (ci = 1; ci <= ncont; ci++) {
|
||||
handle_entry(cont[ci])
|
||||
}
|
||||
}
|
||||
' <"$TZ_ZONE_TABLE" |
|
||||
sort -u |
|
||||
tr '\n' ' '
|
||||
echo ''
|
||||
`
|
||||
|
||||
eval '
|
||||
doselect '"$quoted_continents"' \
|
||||
"coord - I want to use geographical coordinates." \
|
||||
"TZ - I want to specify the timezone using the Posix TZ format."
|
||||
continent=$select_result
|
||||
case $continent in
|
||||
Americas) continent=America;;
|
||||
*" "*) continent=`expr "$continent" : '\''\([^ ]*\)'\''`
|
||||
esac
|
||||
'
|
||||
esac
|
||||
|
||||
case $continent in
|
||||
TZ)
|
||||
# Ask the user for a Posix TZ string. Check that it conforms.
|
||||
while
|
||||
echo >&2 'Please enter the desired value' \
|
||||
'of the TZ environment variable.'
|
||||
echo >&2 'For example, AEST-10 is abbreviated' \
|
||||
'AEST and is 10 hours'
|
||||
echo >&2 'ahead (east) of Greenwich,' \
|
||||
'with no daylight saving time.'
|
||||
read TZ
|
||||
$AWK -v TZ="$TZ" 'BEGIN {
|
||||
tzname = "(<[[:alnum:]+-]{3,}>|[[:alpha:]]{3,})"
|
||||
time = "(2[0-4]|[0-1]?[0-9])" \
|
||||
"(:[0-5][0-9](:[0-5][0-9])?)?"
|
||||
offset = "[-+]?" time
|
||||
mdate = "M([1-9]|1[0-2])\\.[1-5]\\.[0-6]"
|
||||
jdate = "((J[1-9]|[0-9]|J?[1-9][0-9]" \
|
||||
"|J?[1-2][0-9][0-9])|J?3[0-5][0-9]|J?36[0-5])"
|
||||
datetime = ",(" mdate "|" jdate ")(/" time ")?"
|
||||
tzpattern = "^(:.*|" tzname offset "(" tzname \
|
||||
"(" offset ")?(" datetime datetime ")?)?)$"
|
||||
if (TZ ~ tzpattern) exit 1
|
||||
exit 0
|
||||
}'
|
||||
do
|
||||
say >&2 "'$TZ' is not a conforming Posix timezone string."
|
||||
done
|
||||
TZ_for_date=$TZ;;
|
||||
*)
|
||||
case $continent in
|
||||
coord)
|
||||
case $coord in
|
||||
'')
|
||||
echo >&2 'Please enter coordinates' \
|
||||
'in ISO 6709 notation.'
|
||||
echo >&2 'For example, +4042-07403 stands for'
|
||||
echo >&2 '40 degrees 42 minutes north,' \
|
||||
'74 degrees 3 minutes west.'
|
||||
read coord;;
|
||||
esac
|
||||
distance_table=`$AWK \
|
||||
-v coord="$coord" \
|
||||
-v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
|
||||
"$output_distances" <"$TZ_ZONE_TABLE" |
|
||||
sort -n |
|
||||
sed "${location_limit}q"
|
||||
`
|
||||
regions=`say "$distance_table" | $AWK '
|
||||
BEGIN { FS = "\t" }
|
||||
{ print $NF }
|
||||
'`
|
||||
echo >&2 'Please select one of the following timezones,' \
|
||||
echo >&2 'listed roughly in increasing order' \
|
||||
"of distance from $coord".
|
||||
doselect $regions
|
||||
region=$select_result
|
||||
TZ=`say "$distance_table" | $AWK -v region="$region" '
|
||||
BEGIN { FS="\t" }
|
||||
$NF == region { print $4 }
|
||||
'`
|
||||
;;
|
||||
*)
|
||||
# Get list of names of countries in the continent or ocean.
|
||||
countries=`$AWK \
|
||||
-v continent_re="^$continent/" \
|
||||
-v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
|
||||
'
|
||||
BEGIN { FS = "\t" }
|
||||
/^#$/ { next }
|
||||
/^#[^@]/ { next }
|
||||
{
|
||||
commentary = $0 ~ /^#@/
|
||||
if (commentary) {
|
||||
col1ccs = substr($1, 3)
|
||||
conts = $2
|
||||
} else {
|
||||
col1ccs = $1
|
||||
conts = $3
|
||||
}
|
||||
ncc = split(col1ccs, cc, /,/)
|
||||
ncont = split(conts, cont, /,/)
|
||||
for (i = 1; i <= ncc; i++) {
|
||||
elsewhere = commentary
|
||||
for (ci = 1; ci <= ncont; ci++) {
|
||||
if (cont[ci] ~ continent_re) {
|
||||
if (!cc_seen[cc[i]]++) cc_list[++ccs] = cc[i]
|
||||
elsewhere = 0
|
||||
}
|
||||
}
|
||||
if (elsewhere) {
|
||||
for (i = 1; i <= ncc; i++) {
|
||||
cc_elsewhere[cc[i]] = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
END {
|
||||
while (getline <TZ_COUNTRY_TABLE) {
|
||||
if ($0 !~ /^#/) cc_name[$1] = $2
|
||||
}
|
||||
for (i = 1; i <= ccs; i++) {
|
||||
country = cc_list[i]
|
||||
if (cc_elsewhere[country]) continue
|
||||
if (cc_name[country]) {
|
||||
country = cc_name[country]
|
||||
}
|
||||
print country
|
||||
}
|
||||
}
|
||||
' <"$TZ_ZONE_TABLE" | sort -f`
|
||||
|
||||
|
||||
# If there's more than one country, ask the user which one.
|
||||
case $countries in
|
||||
*"$newline"*)
|
||||
echo >&2 'Please select a country' \
|
||||
'whose clocks agree with yours.'
|
||||
doselect $countries
|
||||
country=$select_result;;
|
||||
*)
|
||||
country=$countries
|
||||
esac
|
||||
|
||||
|
||||
# Get list of timezones in the country.
|
||||
regions=`$AWK \
|
||||
-v country="$country" \
|
||||
-v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
|
||||
'
|
||||
BEGIN {
|
||||
FS = "\t"
|
||||
cc = country
|
||||
while (getline <TZ_COUNTRY_TABLE) {
|
||||
if ($0 !~ /^#/ && country == $2) {
|
||||
cc = $1
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
/^#/ { next }
|
||||
$1 ~ cc { print $4 }
|
||||
' <"$TZ_ZONE_TABLE"`
|
||||
|
||||
|
||||
# If there's more than one region, ask the user which one.
|
||||
case $regions in
|
||||
*"$newline"*)
|
||||
echo >&2 'Please select one of the following timezones.'
|
||||
doselect $regions
|
||||
region=$select_result;;
|
||||
*)
|
||||
region=$regions
|
||||
esac
|
||||
|
||||
# Determine TZ from country and region.
|
||||
TZ=`$AWK \
|
||||
-v country="$country" \
|
||||
-v region="$region" \
|
||||
-v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
|
||||
'
|
||||
BEGIN {
|
||||
FS = "\t"
|
||||
cc = country
|
||||
while (getline <TZ_COUNTRY_TABLE) {
|
||||
if ($0 !~ /^#/ && country == $2) {
|
||||
cc = $1
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
/^#/ { next }
|
||||
$1 ~ cc && $4 == region { print $3 }
|
||||
' <"$TZ_ZONE_TABLE"`
|
||||
esac
|
||||
|
||||
# Make sure the corresponding zoneinfo file exists.
|
||||
TZ_for_date=$TZDIR/$TZ
|
||||
<"$TZ_for_date" || {
|
||||
say >&2 "$0: time zone files are not set up correctly"
|
||||
exit 1
|
||||
}
|
||||
esac
|
||||
|
||||
|
||||
# Use the proposed TZ to output the current date relative to UTC.
|
||||
# Loop until they agree in seconds.
|
||||
# Give up after 8 unsuccessful tries.
|
||||
|
||||
extra_info=
|
||||
for i in 1 2 3 4 5 6 7 8
|
||||
do
|
||||
TZdate=`LANG=C TZ="$TZ_for_date" date`
|
||||
UTdate=`LANG=C TZ=UTC0 date`
|
||||
TZsec=`expr "$TZdate" : '.*:\([0-5][0-9]\)'`
|
||||
UTsec=`expr "$UTdate" : '.*:\([0-5][0-9]\)'`
|
||||
case $TZsec in
|
||||
$UTsec)
|
||||
extra_info="
|
||||
Selected time is now: $TZdate.
|
||||
Universal Time is now: $UTdate."
|
||||
break
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
# Output TZ info and ask the user to confirm.
|
||||
|
||||
echo >&2 ""
|
||||
echo >&2 "The following information has been given:"
|
||||
echo >&2 ""
|
||||
case $country%$region%$coord in
|
||||
?*%?*%) say >&2 " $country$newline $region";;
|
||||
?*%%) say >&2 " $country";;
|
||||
%?*%?*) say >&2 " coord $coord$newline $region";;
|
||||
%%?*) say >&2 " coord $coord";;
|
||||
*) say >&2 " TZ='$TZ'"
|
||||
esac
|
||||
say >&2 ""
|
||||
say >&2 "Therefore TZ='$TZ' will be used.$extra_info"
|
||||
say >&2 "Is the above information OK?"
|
||||
|
||||
doselect Yes No
|
||||
ok=$select_result
|
||||
case $ok in
|
||||
Yes) break
|
||||
esac
|
||||
do coord=
|
||||
done
|
||||
|
||||
case $SHELL in
|
||||
*csh) file=.login line="setenv TZ '$TZ'";;
|
||||
*) file=.profile line="TZ='$TZ'; export TZ"
|
||||
esac
|
||||
|
||||
test -t 1 && say >&2 "
|
||||
You can make this change permanent for yourself by appending the line
|
||||
$line
|
||||
to the file '$file' in your home directory; then log out and log in again.
|
||||
|
||||
Here is that TZ value again, this time on standard output so that you
|
||||
can use the $0 command in shell scripts:"
|
||||
|
||||
say "$TZ"
|
||||
41
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/workman.sh
vendored
Normal file
41
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/workman.sh
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
#! /bin/sh
|
||||
# Convert manual page troff stdin to formatted .txt stdout.
|
||||
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
|
||||
if (type nroff && type perl) >/dev/null 2>&1; then
|
||||
|
||||
# Tell groff not to emit SGR escape sequences (ANSI color escapes).
|
||||
GROFF_NO_SGR=1
|
||||
export GROFF_NO_SGR
|
||||
|
||||
echo ".am TH
|
||||
.hy 0
|
||||
.na
|
||||
..
|
||||
.rm }H
|
||||
.rm }F" | nroff -man - ${1+"$@"} | perl -ne '
|
||||
binmode STDIN, '\'':encoding(utf8)'\'';
|
||||
binmode STDOUT, '\'':encoding(utf8)'\'';
|
||||
chomp;
|
||||
s/.\010//g;
|
||||
s/\s*$//;
|
||||
if (/^$/) {
|
||||
$sawblank = 1;
|
||||
next;
|
||||
} else {
|
||||
if ($sawblank && $didprint) {
|
||||
print "\n";
|
||||
$sawblank = 0;
|
||||
}
|
||||
print "$_\n";
|
||||
$didprint = 1;
|
||||
}
|
||||
'
|
||||
elif (type mandoc && type col) >/dev/null 2>&1; then
|
||||
mandoc -man -T ascii "$@" | col -bx
|
||||
else
|
||||
echo >&2 "$0: please install nroff and perl, or mandoc and col"
|
||||
exit 1
|
||||
fi
|
||||
231
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zdump.8
vendored
Normal file
231
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zdump.8
vendored
Normal file
@@ -0,0 +1,231 @@
|
||||
.\" This file is in the public domain, so clarified as of
|
||||
.\" 2009-05-17 by Arthur David Olson.
|
||||
.TH zdump 8
|
||||
.SH NAME
|
||||
zdump \- timezone dumper
|
||||
.SH SYNOPSIS
|
||||
.B zdump
|
||||
[
|
||||
.I option
|
||||
\&... ] [
|
||||
.I timezone
|
||||
\&... ]
|
||||
.SH DESCRIPTION
|
||||
.ie '\(lq'' .ds lq \&"\"
|
||||
.el .ds lq \(lq\"
|
||||
.ie '\(rq'' .ds rq \&"\"
|
||||
.el .ds rq \(rq\"
|
||||
.de q
|
||||
\\$3\*(lq\\$1\*(rq\\$2
|
||||
..
|
||||
.ie \n(.g .ds - \f(CR-\fP
|
||||
.el .ds - \-
|
||||
The
|
||||
.B zdump
|
||||
program prints the current time in each
|
||||
.I timezone
|
||||
named on the command line.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \*-\*-version
|
||||
Output version information and exit.
|
||||
.TP
|
||||
.B \*-\*-help
|
||||
Output short usage message and exit.
|
||||
.TP
|
||||
.B \*-i
|
||||
Output a description of time intervals. For each
|
||||
.I timezone
|
||||
on the command line, output an interval-format description of the
|
||||
timezone. See
|
||||
.q "INTERVAL FORMAT"
|
||||
below.
|
||||
.TP
|
||||
.B \*-v
|
||||
Output a verbose description of time intervals.
|
||||
For each
|
||||
.I timezone
|
||||
on the command line,
|
||||
print the times at the two extreme time values,
|
||||
the times (if present) at and just beyond the boundaries of years that
|
||||
.BR localtime (3)
|
||||
and
|
||||
.BR gmtime (3)
|
||||
can represent, and
|
||||
the times both one second before and exactly at
|
||||
each detected time discontinuity.
|
||||
Each line is followed by
|
||||
.BI isdst= D
|
||||
where
|
||||
.I D
|
||||
is positive, zero, or negative depending on whether
|
||||
the given time is daylight saving time, standard time,
|
||||
or an unknown time type, respectively.
|
||||
Each line is also followed by
|
||||
.BI gmtoff= N
|
||||
if the given local time is known to be
|
||||
.I N
|
||||
seconds east of Greenwich.
|
||||
.TP
|
||||
.B \*-V
|
||||
Like
|
||||
.BR \*-v ,
|
||||
except omit output concerning extreme time and year values.
|
||||
This generates output that is easier to compare to that of
|
||||
implementations with different time representations.
|
||||
.TP
|
||||
.BI "\*-c " \fR[\fIloyear , \fR]\fIhiyear
|
||||
Cut off interval output at the given year(s).
|
||||
Cutoff times are computed using the proleptic Gregorian calendar with year 0
|
||||
and with Universal Time (UT) ignoring leap seconds.
|
||||
Cutoffs are at the start of each year, where the lower-bound
|
||||
timestamp is inclusive and the upper is exclusive; for example,
|
||||
.B "\*-c 1970,2070"
|
||||
selects transitions on or after 1970-01-01 00:00:00 UTC
|
||||
and before 2070-01-01 00:00:00 UTC.
|
||||
The default cutoff is
|
||||
.BR \*-500,2500 .
|
||||
.TP
|
||||
.BI "\*-t " \fR[\fIlotime , \fR]\fIhitime
|
||||
Cut off interval output at the given time(s),
|
||||
given in decimal seconds since 1970-01-01 00:00:00
|
||||
Coordinated Universal Time (UTC).
|
||||
The
|
||||
.I timezone
|
||||
determines whether the count includes leap seconds.
|
||||
As with
|
||||
.BR \*-c ,
|
||||
the cutoff's lower bound is inclusive and its upper bound is exclusive.
|
||||
.SH "INTERVAL FORMAT"
|
||||
The interval format is a compact text representation that is intended
|
||||
to be both human- and machine-readable. It consists of an empty line,
|
||||
then a line
|
||||
.q "TZ=\fIstring\fP"
|
||||
where
|
||||
.I string
|
||||
is a double-quoted string giving the timezone, a second line
|
||||
.q "\*- \*- \fIinterval\fP"
|
||||
describing the time interval before the first transition if any, and
|
||||
zero or more following lines
|
||||
.q "\fIdate time interval\fP",
|
||||
one line for each transition time and following interval. Fields are
|
||||
separated by single tabs.
|
||||
.PP
|
||||
Dates are in
|
||||
.IR yyyy - mm - dd
|
||||
format and times are in 24-hour
|
||||
.IR hh : mm : ss
|
||||
format where
|
||||
.IR hh <24.
|
||||
Times are in local time immediately after the transition. A
|
||||
time interval description consists of a UT offset in signed
|
||||
.RI \(+- hhmmss
|
||||
format, a time zone abbreviation, and an isdst flag. An abbreviation
|
||||
that equals the UT offset is omitted; other abbreviations are
|
||||
double-quoted strings unless they consist of one or more alphabetic
|
||||
characters. An isdst flag is omitted for standard time, and otherwise
|
||||
is a decimal integer that is unsigned and positive (typically 1) for
|
||||
daylight saving time and negative for unknown.
|
||||
.PP
|
||||
In times and in UT offsets with absolute value less than 100 hours,
|
||||
the seconds are omitted if they are zero, and
|
||||
the minutes are also omitted if they are also zero. Positive UT
|
||||
offsets are east of Greenwich. The UT offset \*-00 denotes a UT
|
||||
placeholder in areas where the actual offset is unspecified; by
|
||||
convention, this occurs when the UT offset is zero and the time zone
|
||||
abbreviation begins with
|
||||
.q "\*-"
|
||||
or is
|
||||
.q "zzz".
|
||||
.PP
|
||||
In double-quoted strings, escape sequences represent unusual
|
||||
characters. The escape sequences are \es for space, and \e", \e\e,
|
||||
\ef, \en, \er, \et, and \ev with their usual meaning in the C
|
||||
programming language. E.g., the double-quoted string
|
||||
\*(lq"CET\es\e"\e\e"\*(rq represents the character sequence \*(lqCET
|
||||
"\e\*(rq.\""
|
||||
.PP
|
||||
.ne 9
|
||||
Here is an example of the output, with the leading empty line omitted.
|
||||
(This example is shown with tab stops set far enough apart so that the
|
||||
tabbed columns line up.)
|
||||
.nf
|
||||
.sp
|
||||
.if \n(.g .ft CR
|
||||
.if t .in +.5i
|
||||
.if n .in +2
|
||||
.nr w \w'1896-01-13 'u+\n(.i
|
||||
.ta \w'1896-01-13 'u +\w'12:01:26 'u +\w'-103126 'u +\w'HWT 'u
|
||||
TZ="Pacific/Honolulu"
|
||||
- - -103126 LMT
|
||||
1896-01-13 12:01:26 -1030 HST
|
||||
1933-04-30 03 -0930 HDT 1
|
||||
1933-05-21 11 -1030 HST
|
||||
1942-02-09 03 -0930 HWT 1
|
||||
1945-08-14 13:30 -0930 HPT 1
|
||||
1945-09-30 01 -1030 HST
|
||||
1947-06-08 02:30 -10 HST
|
||||
.in
|
||||
.if \n(.g .ft
|
||||
.sp
|
||||
.fi
|
||||
Here, local time begins 10 hours, 31 minutes and 26 seconds west of
|
||||
UT, and is a standard time abbreviated LMT. Immediately after the
|
||||
first transition, the date is 1896-01-13 and the time is 12:01:26, and
|
||||
the following time interval is 10.5 hours west of UT, a standard time
|
||||
abbreviated HST. Immediately after the second transition, the date is
|
||||
1933-04-30 and the time is 03:00:00 and the following time interval is
|
||||
9.5 hours west of UT, is abbreviated HDT, and is daylight saving time.
|
||||
Immediately after the last transition the date is 1947-06-08 and the
|
||||
time is 02:30:00, and the following time interval is 10 hours west of
|
||||
UT, a standard time abbreviated HST.
|
||||
.PP
|
||||
.ne 10
|
||||
Here are excerpts from another example:
|
||||
.nf
|
||||
.sp
|
||||
.if \n(.g .ft CR
|
||||
.if t .in +.5i
|
||||
.if n .in +2
|
||||
TZ="Europe/Astrakhan"
|
||||
- - +031212 LMT
|
||||
1924-04-30 23:47:48 +03
|
||||
1930-06-21 01 +04
|
||||
1981-04-01 01 +05 1
|
||||
1981-09-30 23 +04
|
||||
\&...
|
||||
2014-10-26 01 +03
|
||||
2016-03-27 03 +04
|
||||
.in
|
||||
.if \n(.g .ft
|
||||
.sp
|
||||
.fi
|
||||
This time zone is east of UT, so its UT offsets are positive. Also,
|
||||
many of its time zone abbreviations are omitted since they duplicate
|
||||
the text of the UT offset.
|
||||
.SH LIMITATIONS
|
||||
Time discontinuities are found by sampling the results returned by
|
||||
.BR localtime (3)
|
||||
at twelve-hour intervals.
|
||||
This works in all real-world cases;
|
||||
one can construct artificial time zones for which this fails.
|
||||
.PP
|
||||
In the
|
||||
.B \*-v
|
||||
and
|
||||
.B \*-V
|
||||
output,
|
||||
.q "UT"
|
||||
denotes the value returned by
|
||||
.BR gmtime (3),
|
||||
which uses UTC for modern timestamps and some other UT flavor for
|
||||
timestamps that predate the introduction of UTC.
|
||||
No attempt is currently made to have the output use
|
||||
.q "UTC"
|
||||
for newer and
|
||||
.q "UT"
|
||||
for older timestamps, partly because the exact date of the
|
||||
introduction of UTC is problematic.
|
||||
.SH SEE ALSO
|
||||
.BR tzfile (5),
|
||||
.BR zic (8)
|
||||
1251
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zdump.c
vendored
Normal file
1251
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zdump.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
900
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zic.8
vendored
Normal file
900
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zic.8
vendored
Normal file
@@ -0,0 +1,900 @@
|
||||
.\" This file is in the public domain, so clarified as of
|
||||
.\" 2009-05-17 by Arthur David Olson.
|
||||
.TH zic 8
|
||||
.SH NAME
|
||||
zic \- timezone compiler
|
||||
.SH SYNOPSIS
|
||||
.B zic
|
||||
[
|
||||
.I option
|
||||
\&... ] [
|
||||
.I filename
|
||||
\&... ]
|
||||
.SH DESCRIPTION
|
||||
.ie '\(lq'' .ds lq \&"\"
|
||||
.el .ds lq \(lq\"
|
||||
.ie '\(rq'' .ds rq \&"\"
|
||||
.el .ds rq \(rq\"
|
||||
.de q
|
||||
\\$3\*(lq\\$1\*(rq\\$2
|
||||
..
|
||||
.ie '\(la'' .ds < <
|
||||
.el .ds < \(la
|
||||
.ie '\(ra'' .ds > >
|
||||
.el .ds > \(ra
|
||||
.ie \n(.g \{\
|
||||
. ds : \:
|
||||
. ds - \f(CR-\fP
|
||||
.\}
|
||||
.el \{\
|
||||
. ds :
|
||||
. ds - \-
|
||||
.\}
|
||||
.ds d " degrees
|
||||
.ds m " minutes
|
||||
.ds s " seconds
|
||||
.ds _ " \&
|
||||
.if t \{\
|
||||
. if \n(.g .if c \(de .if c \(fm .if c \(sd \{\
|
||||
. ds d \(de
|
||||
. ds m \(fm
|
||||
. ds s \(sd
|
||||
. ds _ \|
|
||||
. \}
|
||||
.\}
|
||||
The
|
||||
.B zic
|
||||
program reads text from the file(s) named on the command line
|
||||
and creates the timezone information format (TZif) files
|
||||
specified in this input.
|
||||
If a
|
||||
.I filename
|
||||
is
|
||||
.q "\*-" ,
|
||||
standard input is read.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B "\*-\*-version"
|
||||
Output version information and exit.
|
||||
.TP
|
||||
.B \*-\*-help
|
||||
Output short usage message and exit.
|
||||
.TP
|
||||
.BI "\*-b " bloat
|
||||
Output backward-compatibility data as specified by
|
||||
.IR bloat .
|
||||
If
|
||||
.I bloat
|
||||
is
|
||||
.BR fat ,
|
||||
generate additional data entries that work around potential bugs or
|
||||
incompatibilities in older software, such as software that mishandles
|
||||
the 64-bit generated data.
|
||||
If
|
||||
.I bloat
|
||||
is
|
||||
.BR slim ,
|
||||
keep the output files small; this can help check for the bugs
|
||||
and incompatibilities.
|
||||
The default is
|
||||
.BR slim ,
|
||||
as software that mishandles 64-bit data typically
|
||||
mishandles timestamps after the year 2038 anyway.
|
||||
Also see the
|
||||
.B \*-r
|
||||
option for another way to alter output size.
|
||||
.TP
|
||||
.BI "\*-d " directory
|
||||
Create time conversion information files in the named directory rather than
|
||||
in the standard directory named below.
|
||||
.TP
|
||||
.BI "\*-l " timezone
|
||||
Use
|
||||
.I timezone
|
||||
as local time.
|
||||
.B zic
|
||||
will act as if the input contained a link line of the form
|
||||
.sp
|
||||
.ti +.5i
|
||||
.ta \w'Link\0\0'u +\w'\fItimezone\fP\0\0'u
|
||||
Link \fItimezone\fP localtime
|
||||
.sp
|
||||
If
|
||||
.I timezone
|
||||
is
|
||||
.BR \*- ,
|
||||
any already-existing link is removed.
|
||||
.TP
|
||||
.BI "\*-L " leapsecondfilename
|
||||
Read leap second information from the file with the given name.
|
||||
If this option is not used,
|
||||
no leap second information appears in output files.
|
||||
.TP
|
||||
.BI "\*-p " timezone
|
||||
Use
|
||||
.IR timezone 's
|
||||
rules when handling nonstandard
|
||||
TZ strings like "EET\*-2EEST" that lack transition rules.
|
||||
.B zic
|
||||
will act as if the input contained a link line of the form
|
||||
.sp
|
||||
.ti +.5i
|
||||
Link \fItimezone\fP posixrules
|
||||
.sp
|
||||
This feature is obsolete and poorly supported.
|
||||
Among other things it should not be used for timestamps after the year 2037,
|
||||
and it should not be combined with
|
||||
.B "\*-b slim"
|
||||
if
|
||||
.IR timezone 's
|
||||
transitions are at standard time or Universal Time (UT) instead of local time.
|
||||
.sp
|
||||
If
|
||||
.I timezone
|
||||
is
|
||||
.BR \*- ,
|
||||
any already-existing link is removed.
|
||||
.TP
|
||||
.BR "\*-r " "[\fB@\fP\fIlo\fP][\fB/@\fP\fIhi\fP]"
|
||||
Limit the applicability of output files
|
||||
to timestamps in the range from
|
||||
.I lo
|
||||
(inclusive) to
|
||||
.I hi
|
||||
(exclusive), where
|
||||
.I lo
|
||||
and
|
||||
.I hi
|
||||
are possibly-signed decimal counts of seconds since the Epoch
|
||||
(1970-01-01 00:00:00 UTC).
|
||||
Omitted counts default to extreme values.
|
||||
The output files use UT offset 0 and abbreviation
|
||||
.q "\*-00"
|
||||
in place of the omitted timestamp data.
|
||||
For example,
|
||||
.q "zic \*-r @0"
|
||||
omits data intended for negative timestamps (i.e., before the Epoch), and
|
||||
.q "zic \*-r @0/@2147483648"
|
||||
outputs data intended only for nonnegative timestamps that fit into
|
||||
31-bit signed integers.
|
||||
On platforms with GNU
|
||||
.BR date ,
|
||||
.q "zic \*-r @$(date +%s)"
|
||||
omits data intended for past timestamps.
|
||||
Although this option typically reduces the output file's size,
|
||||
the size can increase due to the need to represent the timestamp range
|
||||
boundaries, particularly if
|
||||
.I hi
|
||||
causes a TZif file to contain explicit entries for
|
||||
.RI pre- hi
|
||||
transitions rather than concisely representing them
|
||||
with an extended POSIX TZ string.
|
||||
Also see the
|
||||
.B "\*-b slim"
|
||||
option for another way to shrink output size.
|
||||
.TP
|
||||
.BI "\*-R @" hi
|
||||
Generate redundant trailing explicit transitions for timestamps
|
||||
that occur less than
|
||||
.I hi
|
||||
seconds since the Epoch, even though the transitions could be
|
||||
more concisely represented via the extended POSIX TZ string.
|
||||
This option does not affect the represented timestamps.
|
||||
Although it accommodates nonstandard TZif readers
|
||||
that ignore the extended POSIX TZ string,
|
||||
it increases the size of the altered output files.
|
||||
.TP
|
||||
.BI "\*-t " file
|
||||
When creating local time information, put the configuration link in
|
||||
the named file rather than in the standard location.
|
||||
.TP
|
||||
.B \*-v
|
||||
Be more verbose, and complain about the following situations:
|
||||
.RS
|
||||
.PP
|
||||
The input specifies a link to a link,
|
||||
something not supported by some older parsers, including
|
||||
.B zic
|
||||
itself through release 2022e.
|
||||
.PP
|
||||
A year that appears in a data file is outside the range
|
||||
of representable years.
|
||||
.PP
|
||||
A time of 24:00 or more appears in the input.
|
||||
Pre-1998 versions of
|
||||
.B zic
|
||||
prohibit 24:00, and pre-2007 versions prohibit times greater than 24:00.
|
||||
.PP
|
||||
A rule goes past the start or end of the month.
|
||||
Pre-2004 versions of
|
||||
.B zic
|
||||
prohibit this.
|
||||
.PP
|
||||
A time zone abbreviation uses a
|
||||
.B %z
|
||||
format.
|
||||
Pre-2015 versions of
|
||||
.B zic
|
||||
do not support this.
|
||||
.PP
|
||||
A timestamp contains fractional seconds.
|
||||
Pre-2018 versions of
|
||||
.B zic
|
||||
do not support this.
|
||||
.PP
|
||||
The input contains abbreviations that are mishandled by pre-2018 versions of
|
||||
.B zic
|
||||
due to a longstanding coding bug.
|
||||
These abbreviations include
|
||||
.q L
|
||||
for
|
||||
.q Link ,
|
||||
.q mi
|
||||
for
|
||||
.q min ,
|
||||
.q Sa
|
||||
for
|
||||
.q Sat ,
|
||||
and
|
||||
.q Su
|
||||
for
|
||||
.q Sun .
|
||||
.PP
|
||||
The output file does not contain all the information about the
|
||||
long-term future of a timezone, because the future cannot be summarized as
|
||||
an extended POSIX TZ string. For example, as of 2019 this problem
|
||||
occurs for Iran's daylight-saving rules for the predicted future, as
|
||||
these rules are based on the Iranian calendar, which cannot be
|
||||
represented.
|
||||
.PP
|
||||
The output contains data that may not be handled properly by client
|
||||
code designed for older
|
||||
.B zic
|
||||
output formats. These compatibility issues affect only timestamps
|
||||
before 1970 or after the start of 2038.
|
||||
.PP
|
||||
The output contains a truncated leap second table,
|
||||
which can cause some older TZif readers to misbehave.
|
||||
This can occur if the
|
||||
.B "\*-L"
|
||||
option is used, and either an Expires line is present or
|
||||
the
|
||||
.B "\*-r"
|
||||
option is also used.
|
||||
.PP
|
||||
The output file contains more than 1200 transitions,
|
||||
which may be mishandled by some clients.
|
||||
The current reference client supports at most 2000 transitions;
|
||||
pre-2014 versions of the reference client support at most 1200
|
||||
transitions.
|
||||
.PP
|
||||
A time zone abbreviation has fewer than 3 or more than 6 characters.
|
||||
POSIX requires at least 3, and requires implementations to support
|
||||
at least 6.
|
||||
.PP
|
||||
An output file name contains a byte that is not an ASCII letter,
|
||||
.q "\*-" ,
|
||||
.q "/" ,
|
||||
or
|
||||
.q "_" ;
|
||||
or it contains a file name component that contains more than 14 bytes
|
||||
or that starts with
|
||||
.q "\*-" .
|
||||
.RE
|
||||
.SH FILES
|
||||
Input files use the format described in this section; output files use
|
||||
.BR tzfile (5)
|
||||
format.
|
||||
.PP
|
||||
Input files should be text files, that is, they should be a series of
|
||||
zero or more lines, each ending in a newline byte and containing at
|
||||
most 2048 bytes counting the newline, and without any NUL bytes.
|
||||
The input text's encoding
|
||||
is typically UTF-8 or ASCII; it should have a unibyte representation
|
||||
for the POSIX Portable Character Set (PPCS)
|
||||
\*<https://pubs\*:.opengroup\*:.org/\*:onlinepubs/\*:9699919799/\*:basedefs/\*:V1_chap06\*:.html\*>
|
||||
and the encoding's non-unibyte characters should consist entirely of
|
||||
non-PPCS bytes. Non-PPCS characters typically occur only in comments:
|
||||
although output file names and time zone abbreviations can contain
|
||||
nearly any character, other software will work better if these are
|
||||
limited to the restricted syntax described under the
|
||||
.B \*-v
|
||||
option.
|
||||
.PP
|
||||
Input lines are made up of fields.
|
||||
Fields are separated from one another by one or more white space characters.
|
||||
The white space characters are space, form feed, carriage return, newline,
|
||||
tab, and vertical tab.
|
||||
Leading and trailing white space on input lines is ignored.
|
||||
An unquoted sharp character (#) in the input introduces a comment which extends
|
||||
to the end of the line the sharp character appears on.
|
||||
White space characters and sharp characters may be enclosed in double quotes
|
||||
(") if they're to be used as part of a field.
|
||||
Any line that is blank (after comment stripping) is ignored.
|
||||
Nonblank lines are expected to be of one of three types:
|
||||
rule lines, zone lines, and link lines.
|
||||
.PP
|
||||
Names must be in English and are case insensitive.
|
||||
They appear in several contexts, and include month and weekday names
|
||||
and keywords such as
|
||||
.BR "maximum" ,
|
||||
.BR "only" ,
|
||||
.BR "Rolling" ,
|
||||
and
|
||||
.BR "Zone" .
|
||||
A name can be abbreviated by omitting all but an initial prefix; any
|
||||
abbreviation must be unambiguous in context.
|
||||
.PP
|
||||
A rule line has the form
|
||||
.nf
|
||||
.ti +.5i
|
||||
.ta \w'Rule\0\0'u +\w'NAME\0\0'u +\w'FROM\0\0'u +\w'1973\0\0'u +\w'\*-\0\0'u +\w'Apr\0\0'u +\w'lastSun\0\0'u +\w'2:00w\0\0'u +\w'1:00d\0\0'u
|
||||
.sp
|
||||
Rule NAME FROM TO \*- IN ON AT SAVE LETTER/S
|
||||
.sp
|
||||
For example:
|
||||
.ti +.5i
|
||||
.sp
|
||||
Rule US 1967 1973 \*- Apr lastSun 2:00w 1:00d D
|
||||
.sp
|
||||
.fi
|
||||
The fields that make up a rule line are:
|
||||
.TP "\w'LETTER/S'u"
|
||||
.B NAME
|
||||
Gives the name of the rule set that contains this line.
|
||||
The name must start with a character that is neither
|
||||
an ASCII digit nor
|
||||
.q \*-
|
||||
nor
|
||||
.q + .
|
||||
To allow for future extensions,
|
||||
an unquoted name should not contain characters from the set
|
||||
.ie \n(.g .q \f(CR!$%&\(aq()*,/:;<=>?@[\e]\(ha\(ga{|}\(ti\fP .
|
||||
.el .ie t .q \f(CW!$%&'()*,/:;<=>?@[\e]^\(ga{|}~\fP .
|
||||
.el .q !$%&'()*,/:;<=>?@[\e]^`{|}~ .
|
||||
.TP
|
||||
.B FROM
|
||||
Gives the first year in which the rule applies.
|
||||
Any signed integer year can be supplied; the proleptic Gregorian calendar
|
||||
is assumed, with year 0 preceding year 1.
|
||||
The word
|
||||
.B minimum
|
||||
(or an abbreviation) means the indefinite past.
|
||||
The word
|
||||
.B maximum
|
||||
(or an abbreviation) means the indefinite future.
|
||||
Rules can describe times that are not representable as time values,
|
||||
with the unrepresentable times ignored; this allows rules to be portable
|
||||
among hosts with differing time value types.
|
||||
.TP
|
||||
.B TO
|
||||
Gives the final year in which the rule applies.
|
||||
In addition to
|
||||
.B minimum
|
||||
and
|
||||
.B maximum
|
||||
(as above),
|
||||
the word
|
||||
.B only
|
||||
(or an abbreviation)
|
||||
may be used to repeat the value of the
|
||||
.B FROM
|
||||
field.
|
||||
.TP
|
||||
.B \*-
|
||||
Is a reserved field and should always contain
|
||||
.q \*-
|
||||
for compatibility with older versions of
|
||||
.BR zic .
|
||||
It was previously known as the
|
||||
.B TYPE
|
||||
field, which could contain values to allow a
|
||||
separate script to further restrict in which
|
||||
.q types
|
||||
of years the rule would apply.
|
||||
.TP
|
||||
.B IN
|
||||
Names the month in which the rule takes effect.
|
||||
Month names may be abbreviated.
|
||||
.TP
|
||||
.B ON
|
||||
Gives the day on which the rule takes effect.
|
||||
Recognized forms include:
|
||||
.nf
|
||||
.in +.5i
|
||||
.sp
|
||||
.ta \w'Sun<=25\0\0'u
|
||||
5 the fifth of the month
|
||||
lastSun the last Sunday in the month
|
||||
lastMon the last Monday in the month
|
||||
Sun>=8 first Sunday on or after the eighth
|
||||
Sun<=25 last Sunday on or before the 25th
|
||||
.fi
|
||||
.in -.5i
|
||||
.sp
|
||||
A weekday name (e.g.,
|
||||
.BR "Sunday" )
|
||||
or a weekday name preceded by
|
||||
.q "last"
|
||||
(e.g.,
|
||||
.BR "lastSunday" )
|
||||
may be abbreviated or spelled out in full.
|
||||
There must be no white space characters within the
|
||||
.B ON
|
||||
field.
|
||||
The
|
||||
.q <=
|
||||
and
|
||||
.q >=
|
||||
constructs can result in a day in the neighboring month;
|
||||
for example, the IN-ON combination
|
||||
.q "Oct Sun>=31"
|
||||
stands for the first Sunday on or after October 31,
|
||||
even if that Sunday occurs in November.
|
||||
.TP
|
||||
.B AT
|
||||
Gives the time of day at which the rule takes effect,
|
||||
relative to 00:00, the start of a calendar day.
|
||||
Recognized forms include:
|
||||
.nf
|
||||
.in +.5i
|
||||
.sp
|
||||
.ta \w'00:19:32.13\0\0'u
|
||||
2 time in hours
|
||||
2:00 time in hours and minutes
|
||||
01:28:14 time in hours, minutes, and seconds
|
||||
00:19:32.13 time with fractional seconds
|
||||
12:00 midday, 12 hours after 00:00
|
||||
15:00 3 PM, 15 hours after 00:00
|
||||
24:00 end of day, 24 hours after 00:00
|
||||
260:00 260 hours after 00:00
|
||||
\*-2:30 2.5 hours before 00:00
|
||||
\*- equivalent to 0
|
||||
.fi
|
||||
.in -.5i
|
||||
.sp
|
||||
Although
|
||||
.B zic
|
||||
rounds times to the nearest integer second
|
||||
(breaking ties to the even integer), the fractions may be useful
|
||||
to other applications requiring greater precision.
|
||||
The source format does not specify any maximum precision.
|
||||
Any of these forms may be followed by the letter
|
||||
.B w
|
||||
if the given time is local or
|
||||
.q "wall clock"
|
||||
time,
|
||||
.B s
|
||||
if the given time is standard time without any adjustment for daylight saving,
|
||||
or
|
||||
.B u
|
||||
(or
|
||||
.B g
|
||||
or
|
||||
.BR z )
|
||||
if the given time is universal time;
|
||||
in the absence of an indicator,
|
||||
local (wall clock) time is assumed.
|
||||
These forms ignore leap seconds; for example,
|
||||
if a leap second occurs at 00:59:60 local time,
|
||||
.q "1:00"
|
||||
stands for 3601 seconds after local midnight instead of the usual 3600 seconds.
|
||||
The intent is that a rule line describes the instants when a
|
||||
clock/calendar set to the type of time specified in the
|
||||
.B AT
|
||||
field would show the specified date and time of day.
|
||||
.TP
|
||||
.B SAVE
|
||||
Gives the amount of time to be added to local standard time when the rule is in
|
||||
effect, and whether the resulting time is standard or daylight saving.
|
||||
This field has the same format as the
|
||||
.B AT
|
||||
field
|
||||
except with a different set of suffix letters:
|
||||
.B s
|
||||
for standard time and
|
||||
.B d
|
||||
for daylight saving time.
|
||||
The suffix letter is typically omitted, and defaults to
|
||||
.B s
|
||||
if the offset is zero and to
|
||||
.B d
|
||||
otherwise.
|
||||
Negative offsets are allowed; in Ireland, for example, daylight saving
|
||||
time is observed in winter and has a negative offset relative to
|
||||
Irish Standard Time.
|
||||
The offset is merely added to standard time; for example,
|
||||
.B zic
|
||||
does not distinguish a 10:30 standard time plus an 0:30
|
||||
.B SAVE
|
||||
from a 10:00 standard time plus a 1:00
|
||||
.BR SAVE .
|
||||
.TP
|
||||
.B LETTER/S
|
||||
Gives the
|
||||
.q "variable part"
|
||||
(for example, the
|
||||
.q "S"
|
||||
or
|
||||
.q "D"
|
||||
in
|
||||
.q "EST"
|
||||
or
|
||||
.q "EDT" )
|
||||
of time zone abbreviations to be used when this rule is in effect.
|
||||
If this field is
|
||||
.q \*- ,
|
||||
the variable part is null.
|
||||
.PP
|
||||
A zone line has the form
|
||||
.sp
|
||||
.nf
|
||||
.ti +.5i
|
||||
.ta \w'Zone\0\0'u +\w'Asia/Amman\0\0'u +\w'STDOFF\0\0'u +\w'Jordan\0\0'u +\w'FORMAT\0\0'u
|
||||
Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
.sp
|
||||
For example:
|
||||
.sp
|
||||
.ti +.5i
|
||||
Zone Asia/Amman 2:00 Jordan EE%sT 2017 Oct 27 01:00
|
||||
.sp
|
||||
.fi
|
||||
The fields that make up a zone line are:
|
||||
.TP "\w'STDOFF'u"
|
||||
.B NAME
|
||||
The name of the timezone.
|
||||
This is the name used in creating the time conversion information file for the
|
||||
timezone.
|
||||
It should not contain a file name component
|
||||
.q ".\&"
|
||||
or
|
||||
.q ".." ;
|
||||
a file name component is a maximal substring that does not contain
|
||||
.q "/" .
|
||||
.TP
|
||||
.B STDOFF
|
||||
The amount of time to add to UT to get standard time,
|
||||
without any adjustment for daylight saving.
|
||||
This field has the same format as the
|
||||
.B AT
|
||||
and
|
||||
.B SAVE
|
||||
fields of rule lines, except without suffix letters;
|
||||
begin the field with a minus sign if time must be subtracted from UT.
|
||||
.TP
|
||||
.B RULES
|
||||
The name of the rules that apply in the timezone or,
|
||||
alternatively, a field in the same format as a rule-line SAVE column,
|
||||
giving the amount of time to be added to local standard time
|
||||
and whether the resulting time is standard or daylight saving.
|
||||
If this field is
|
||||
.B \*-
|
||||
then standard time always applies.
|
||||
When an amount of time is given, only the sum of standard time and
|
||||
this amount matters.
|
||||
.TP
|
||||
.B FORMAT
|
||||
The format for time zone abbreviations.
|
||||
The pair of characters
|
||||
.B %s
|
||||
is used to show where the
|
||||
.q "variable part"
|
||||
of the time zone abbreviation goes.
|
||||
Alternatively, a format can use the pair of characters
|
||||
.B %z
|
||||
to stand for the UT offset in the form
|
||||
.RI \(+- hh ,
|
||||
.RI \(+- hhmm ,
|
||||
or
|
||||
.RI \(+- hhmmss ,
|
||||
using the shortest form that does not lose information, where
|
||||
.IR hh ,
|
||||
.IR mm ,
|
||||
and
|
||||
.I ss
|
||||
are the hours, minutes, and seconds east (+) or west (\-) of UT.
|
||||
Alternatively,
|
||||
a slash (/)
|
||||
separates standard and daylight abbreviations.
|
||||
To conform to POSIX, a time zone abbreviation should contain only
|
||||
alphanumeric ASCII characters,
|
||||
.q "+"
|
||||
and
|
||||
.q "\*-".
|
||||
By convention, the time zone abbreviation
|
||||
.q "\*-00"
|
||||
is a placeholder that means local time is unspecified.
|
||||
.TP
|
||||
.B UNTIL
|
||||
The time at which the UT offset or the rule(s) change for a location.
|
||||
It takes the form of one to four fields YEAR [MONTH [DAY [TIME]]].
|
||||
If this is specified,
|
||||
the time zone information is generated from the given UT offset
|
||||
and rule change until the time specified, which is interpreted using
|
||||
the rules in effect just before the transition.
|
||||
The month, day, and time of day have the same format as the IN, ON, and AT
|
||||
fields of a rule; trailing fields can be omitted, and default to the
|
||||
earliest possible value for the missing fields.
|
||||
.IP
|
||||
The next line must be a
|
||||
.q "continuation"
|
||||
line; this has the same form as a zone line except that the
|
||||
string
|
||||
.q "Zone"
|
||||
and the name are omitted, as the continuation line will
|
||||
place information starting at the time specified as the
|
||||
.q "until"
|
||||
information in the previous line in the file used by the previous line.
|
||||
Continuation lines may contain
|
||||
.q "until"
|
||||
information, just as zone lines do, indicating that the next line is a further
|
||||
continuation.
|
||||
.PP
|
||||
If a zone changes at the same instant that a rule would otherwise take
|
||||
effect in the earlier zone or continuation line, the rule is ignored.
|
||||
A zone or continuation line
|
||||
.I L
|
||||
with a named rule set starts with standard time by default:
|
||||
that is, any of
|
||||
.IR L 's
|
||||
timestamps preceding
|
||||
.IR L 's
|
||||
earliest rule use the rule in effect after
|
||||
.IR L 's
|
||||
first transition into standard time.
|
||||
In a single zone it is an error if two rules take effect at the same
|
||||
instant, or if two zone changes take effect at the same instant.
|
||||
.PP
|
||||
If a continuation line subtracts
|
||||
.I N
|
||||
seconds from the UT offset after a transition that would be
|
||||
interpreted to be later if using the continuation line's UT offset and
|
||||
rules, the
|
||||
.q "until"
|
||||
time of the previous zone or continuation line is interpreted
|
||||
according to the continuation line's UT offset and rules, and any rule
|
||||
that would otherwise take effect in the next
|
||||
.I N
|
||||
seconds is instead assumed to take effect simultaneously.
|
||||
For example:
|
||||
.br
|
||||
.ne 7
|
||||
.nf
|
||||
.in +2m
|
||||
.ta \w'# Rule\0\0'u +\w'NAME\0\0'u +\w'FROM\0\0'u +\w'2006\0\0'u +\w'\*-\0\0'u +\w'Oct\0\0'u +\w'lastSun\0\0'u +\w'2:00\0\0'u +\w'SAVE\0\0'u
|
||||
.sp
|
||||
# Rule NAME FROM TO \*- IN ON AT SAVE LETTER/S
|
||||
Rule US 1967 2006 - Oct lastSun 2:00 0 S
|
||||
Rule US 1967 1973 - Apr lastSun 2:00 1:00 D
|
||||
.ta \w'Zone\0\0America/Menominee\0\0'u +\w'STDOFF\0\0'u +\w'RULES\0\0'u +\w'FORMAT\0\0'u
|
||||
# Zone\0\0NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone\0\0America/Menominee \*-5:00 \*- EST 1973 Apr 29 2:00
|
||||
\*-6:00 US C%sT
|
||||
.sp
|
||||
.in
|
||||
.fi
|
||||
Here, an incorrect reading would be there were two clock changes on 1973-04-29,
|
||||
the first from 02:00 EST (\*-05) to 01:00 CST (\*-06),
|
||||
and the second an hour later from 02:00 CST (\*-06) to 03:00 CDT (\*-05).
|
||||
However,
|
||||
.B zic
|
||||
interprets this more sensibly as a single transition from 02:00 CST (\*-05) to
|
||||
02:00 CDT (\*-05).
|
||||
.PP
|
||||
A link line has the form
|
||||
.sp
|
||||
.nf
|
||||
.ti +.5i
|
||||
.ta \w'Link\0\0'u +\w'Europe/Istanbul\0\0'u
|
||||
Link TARGET LINK-NAME
|
||||
.sp
|
||||
For example:
|
||||
.sp
|
||||
.ti +.5i
|
||||
Link Europe/Istanbul Asia/Istanbul
|
||||
.sp
|
||||
.fi
|
||||
The
|
||||
.B TARGET
|
||||
field should appear as the
|
||||
.B NAME
|
||||
field in some zone line or as the
|
||||
.B LINK-NAME
|
||||
field in some link line.
|
||||
The
|
||||
.B LINK-NAME
|
||||
field is used as an alternative name for that zone;
|
||||
it has the same syntax as a zone line's
|
||||
.B NAME
|
||||
field.
|
||||
Links can chain together, although the behavior is unspecified if a
|
||||
chain of one or more links does not terminate in a Zone name.
|
||||
A link line can appear before the line that defines the link target.
|
||||
For example:
|
||||
.sp
|
||||
.ne 3
|
||||
.nf
|
||||
.in +2m
|
||||
.ta \w'Zone\0\0'u +\w'Greenwich\0\0'u
|
||||
Link Greenwich G_M_T
|
||||
Link Etc/GMT Greenwich
|
||||
Zone Etc/GMT\0\00\0\0\*-\0\0GMT
|
||||
.sp
|
||||
.in
|
||||
.fi
|
||||
The two links are chained together, and G_M_T, Greenwich, and Etc/GMT
|
||||
all name the same zone.
|
||||
.PP
|
||||
Except for continuation lines,
|
||||
lines may appear in any order in the input.
|
||||
However, the behavior is unspecified if multiple zone or link lines
|
||||
define the same name.
|
||||
.PP
|
||||
The file that describes leap seconds can have leap lines and an
|
||||
expiration line.
|
||||
Leap lines have the following form:
|
||||
.nf
|
||||
.ti +.5i
|
||||
.ta \w'Leap\0\0'u +\w'YEAR\0\0'u +\w'MONTH\0\0'u +\w'DAY\0\0'u +\w'HH:MM:SS\0\0'u +\w'CORR\0\0'u
|
||||
.sp
|
||||
Leap YEAR MONTH DAY HH:MM:SS CORR R/S
|
||||
.sp
|
||||
For example:
|
||||
.ti +.5i
|
||||
.sp
|
||||
Leap 2016 Dec 31 23:59:60 + S
|
||||
.sp
|
||||
.fi
|
||||
The
|
||||
.BR YEAR ,
|
||||
.BR MONTH ,
|
||||
.BR DAY ,
|
||||
and
|
||||
.B HH:MM:SS
|
||||
fields tell when the leap second happened.
|
||||
The
|
||||
.B CORR
|
||||
field
|
||||
should be
|
||||
.q "+"
|
||||
if a second was added
|
||||
or
|
||||
.q "\*-"
|
||||
if a second was skipped.
|
||||
The
|
||||
.B R/S
|
||||
field
|
||||
should be (an abbreviation of)
|
||||
.q "Stationary"
|
||||
if the leap second time given by the other fields should be interpreted as UTC
|
||||
or
|
||||
(an abbreviation of)
|
||||
.q "Rolling"
|
||||
if the leap second time given by the other fields should be interpreted as
|
||||
local (wall clock) time.
|
||||
.PP
|
||||
Rolling leap seconds were implemented back when it was not
|
||||
clear whether common practice was rolling or stationary,
|
||||
with concerns that one would see
|
||||
Times Square ball drops where there'd be a
|
||||
.q "3... 2... 1... leap... Happy New Year"
|
||||
countdown, placing the leap second at
|
||||
midnight New York time rather than midnight UTC.
|
||||
However, this countdown style does not seem to have caught on,
|
||||
which means rolling leap seconds are not used in practice;
|
||||
also, they are not supported if the
|
||||
.B \*-r
|
||||
option is used.
|
||||
.PP
|
||||
The expiration line, if present, has the form:
|
||||
.nf
|
||||
.ti +.5i
|
||||
.ta \w'Expires\0\0'u +\w'YEAR\0\0'u +\w'MONTH\0\0'u +\w'DAY\0\0'u
|
||||
.sp
|
||||
Expires YEAR MONTH DAY HH:MM:SS
|
||||
.sp
|
||||
For example:
|
||||
.ti +.5i
|
||||
.sp
|
||||
Expires 2020 Dec 28 00:00:00
|
||||
.sp
|
||||
.fi
|
||||
The
|
||||
.BR YEAR ,
|
||||
.BR MONTH ,
|
||||
.BR DAY ,
|
||||
and
|
||||
.B HH:MM:SS
|
||||
fields give the expiration timestamp in UTC for the leap second table.
|
||||
.br
|
||||
.ne 22
|
||||
.SH "EXTENDED EXAMPLE"
|
||||
Here is an extended example of
|
||||
.B zic
|
||||
input, intended to illustrate many of its features.
|
||||
.nf
|
||||
.in +2m
|
||||
.ta \w'# Rule\0\0'u +\w'NAME\0\0'u +\w'FROM\0\0'u +\w'1973\0\0'u +\w'\*-\0\0'u +\w'Apr\0\0'u +\w'lastSun\0\0'u +\w'2:00\0\0'u +\w'SAVE\0\0'u
|
||||
.sp
|
||||
# Rule NAME FROM TO \*- IN ON AT SAVE LETTER/S
|
||||
Rule Swiss 1941 1942 \*- May Mon>=1 1:00 1:00 S
|
||||
Rule Swiss 1941 1942 \*- Oct Mon>=1 2:00 0 \*-
|
||||
.sp .5
|
||||
Rule EU 1977 1980 \*- Apr Sun>=1 1:00u 1:00 S
|
||||
Rule EU 1977 only \*- Sep lastSun 1:00u 0 \*-
|
||||
Rule EU 1978 only \*- Oct 1 1:00u 0 \*-
|
||||
Rule EU 1979 1995 \*- Sep lastSun 1:00u 0 \*-
|
||||
Rule EU 1981 max \*- Mar lastSun 1:00u 1:00 S
|
||||
Rule EU 1996 max \*- Oct lastSun 1:00u 0 \*-
|
||||
.sp
|
||||
.ta \w'# Zone\0\0'u +\w'Europe/Zurich\0\0'u +\w'0:29:45.50\0\0'u +\w'RULES\0\0'u +\w'FORMAT\0\0'u
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Europe/Zurich 0:34:08 \*- LMT 1853 Jul 16
|
||||
0:29:45.50 \*- BMT 1894 Jun
|
||||
1:00 Swiss CE%sT 1981
|
||||
1:00 EU CE%sT
|
||||
.sp
|
||||
Link Europe/Zurich Europe/Vaduz
|
||||
.sp
|
||||
.in
|
||||
.fi
|
||||
In this example, the EU rules are for the European Union
|
||||
and for its predecessor organization, the European Communities.
|
||||
The timezone is named Europe/Zurich and it has the alias Europe/Vaduz.
|
||||
This example says that Zurich was 34 minutes and 8
|
||||
seconds east of UT until 1853-07-16 at 00:00, when the legal offset
|
||||
was changed to
|
||||
7\*d\*_26\*m\*_22.50\*s,
|
||||
which works out to 0:29:45.50;
|
||||
.B zic
|
||||
treats this by rounding it to 0:29:46.
|
||||
After 1894-06-01 at 00:00 the UT offset became one hour
|
||||
and Swiss daylight saving rules (defined with lines beginning with
|
||||
.q "Rule Swiss")
|
||||
apply. From 1981 to the present, EU daylight saving rules have
|
||||
applied, and the UTC offset has remained at one hour.
|
||||
.PP
|
||||
In 1941 and 1942, daylight saving time applied from the first Monday
|
||||
in May at 01:00 to the first Monday in October at 02:00.
|
||||
The pre-1981 EU daylight-saving rules have no effect
|
||||
here, but are included for completeness. Since 1981, daylight
|
||||
saving has begun on the last Sunday in March at 01:00 UTC.
|
||||
Until 1995 it ended the last Sunday in September at 01:00 UTC,
|
||||
but this changed to the last Sunday in October starting in 1996.
|
||||
.PP
|
||||
For purposes of display,
|
||||
.q "LMT"
|
||||
and
|
||||
.q "BMT"
|
||||
were initially used, respectively. Since
|
||||
Swiss rules and later EU rules were applied, the time zone abbreviation
|
||||
has been CET for standard time and CEST for daylight saving
|
||||
time.
|
||||
.SH FILES
|
||||
.TP
|
||||
.I /etc/localtime
|
||||
Default local timezone file.
|
||||
.TP
|
||||
.I /usr/share/zoneinfo
|
||||
Default timezone information directory.
|
||||
.SH NOTES
|
||||
For areas with more than two types of local time,
|
||||
you may need to use local standard time in the
|
||||
.B AT
|
||||
field of the earliest transition time's rule to ensure that
|
||||
the earliest transition time recorded in the compiled file is correct.
|
||||
.PP
|
||||
If,
|
||||
for a particular timezone,
|
||||
a clock advance caused by the start of daylight saving
|
||||
coincides with and is equal to
|
||||
a clock retreat caused by a change in UT offset,
|
||||
.B zic
|
||||
produces a single transition to daylight saving at the new UT offset
|
||||
without any change in local (wall clock) time.
|
||||
To get separate transitions
|
||||
use multiple zone continuation lines
|
||||
specifying transition instants using universal time.
|
||||
.SH SEE ALSO
|
||||
.BR tzfile (5),
|
||||
.BR zdump (8)
|
||||
3934
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zic.c
vendored
Normal file
3934
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zic.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
386
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/ziguard.awk
vendored
Normal file
386
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/ziguard.awk
vendored
Normal file
@@ -0,0 +1,386 @@
|
||||
# Convert tzdata source into vanguard or rearguard form.
|
||||
|
||||
# Contributed by Paul Eggert. This file is in the public domain.
|
||||
|
||||
# This is not a general-purpose converter; it is designed for current tzdata.
|
||||
# It just converts from current source to main, vanguard, and rearguard forms.
|
||||
# Although it might be nice for it to be idempotent, or to be useful
|
||||
# for converting back and forth between vanguard and rearguard formats,
|
||||
# it does not do these nonessential tasks now.
|
||||
#
|
||||
# Although main and vanguard forms are currently equivalent,
|
||||
# this need not always be the case. When the two forms differ,
|
||||
# this script can convert either from main to vanguard form (needed then),
|
||||
# or from vanguard to main form (this conversion would be needed later,
|
||||
# after main became rearguard and vanguard became main).
|
||||
# There is no need to convert rearguard to other forms.
|
||||
#
|
||||
# When converting to vanguard form, the output can use the line
|
||||
# "Zone GMT 0 - GMT" which TZUpdater 2.3.2 mistakenly rejects.
|
||||
#
|
||||
# When converting to vanguard form, the output can use negative SAVE
|
||||
# values.
|
||||
#
|
||||
# When converting to rearguard form, the output uses only nonnegative
|
||||
# SAVE values. The idea is for the output data to simulate the behavior
|
||||
# of the input data as best it can within the constraints of the
|
||||
# rearguard format.
|
||||
|
||||
# Given a FIELD like "-0:30", return a minute count like -30.
|
||||
function get_minutes(field, \
|
||||
sign, hours, minutes)
|
||||
{
|
||||
sign = field ~ /^-/ ? -1 : 1
|
||||
hours = +field
|
||||
if (field ~ /:/) {
|
||||
minutes = field
|
||||
sub(/[^:]*:/, "", minutes)
|
||||
}
|
||||
return 60 * hours + sign * minutes
|
||||
}
|
||||
|
||||
# Given an OFFSET, which is a minute count like 300 or 330,
|
||||
# return a %z-style abbreviation like "+05" or "+0530".
|
||||
function offset_abbr(offset, \
|
||||
hours, minutes, sign)
|
||||
{
|
||||
hours = int(offset / 60)
|
||||
minutes = offset % 60
|
||||
if (minutes) {
|
||||
return sprintf("%+.4d", hours * 100 + minutes);
|
||||
} else {
|
||||
return sprintf("%+.2d", hours)
|
||||
}
|
||||
}
|
||||
|
||||
# Round TIMESTAMP (a +-hh:mm:ss.dddd string) to the nearest second.
|
||||
function round_to_second(timestamp, \
|
||||
hh, mm, ss, seconds, dot_dddd, subseconds)
|
||||
{
|
||||
dot_dddd = timestamp
|
||||
if (!sub(/^[+-]?[0-9]+:[0-9]+:[0-9]+\./, ".", dot_dddd))
|
||||
return timestamp
|
||||
hh = mm = ss = timestamp
|
||||
sub(/^[-+]?[0-9]+:[0-9]+:/, "", ss)
|
||||
sub(/^[-+]?[0-9]+:/, "", mm)
|
||||
sub(/^[-+]?/, "", hh)
|
||||
seconds = 3600 * hh + 60 * mm + ss
|
||||
subseconds = +dot_dddd
|
||||
seconds += 0.5 < subseconds || ((subseconds == 0.5) && (seconds % 2));
|
||||
return sprintf("%s%d:%.2d:%.2d", timestamp ~ /^-/ ? "-" : "", \
|
||||
seconds / 3600, seconds / 60 % 60, seconds % 60)
|
||||
}
|
||||
|
||||
BEGIN {
|
||||
dataform_type["vanguard"] = 1
|
||||
dataform_type["main"] = 1
|
||||
dataform_type["rearguard"] = 1
|
||||
|
||||
if (PACKRATLIST) {
|
||||
while (getline <PACKRATLIST) {
|
||||
if ($0 ~ /^#/) continue
|
||||
packratlist[$3] = 1
|
||||
}
|
||||
}
|
||||
|
||||
# The command line should set DATAFORM.
|
||||
if (!dataform_type[DATAFORM]) exit 1
|
||||
}
|
||||
|
||||
$1 == "#PACKRATLIST" && $2 == PACKRATLIST {
|
||||
sub(/^#PACKRATLIST[\t ]+[^\t ]+[\t ]+/, "")
|
||||
}
|
||||
|
||||
/^Zone/ { zone = $2 }
|
||||
|
||||
DATAFORM != "main" {
|
||||
in_comment = $0 ~ /^#/
|
||||
uncomment = comment_out = 0
|
||||
|
||||
# If this line should differ due to Czechoslovakia using negative SAVE values,
|
||||
# uncomment the desired version and comment out the undesired one.
|
||||
if (zone == "Europe/Prague" && $0 ~ /^#?[\t ]+[01]:00[\t ]/ \
|
||||
&& $0 ~ /1947 Feb 23/) {
|
||||
if (($(in_comment + 2) != "-") == (DATAFORM != "rearguard")) {
|
||||
uncomment = in_comment
|
||||
} else {
|
||||
comment_out = !in_comment
|
||||
}
|
||||
}
|
||||
|
||||
# If this line should differ due to Ireland using negative SAVE values,
|
||||
# uncomment the desired version and comment out the undesired one.
|
||||
Rule_Eire = $0 ~ /^#?Rule[\t ]+Eire[\t ]/
|
||||
Zone_Dublin_post_1968 \
|
||||
= (zone == "Europe/Dublin" && $0 ~ /^#?[\t ]+[01]:00[\t ]/ \
|
||||
&& (!$(in_comment + 4) || 1968 < $(in_comment + 4)))
|
||||
if (Rule_Eire || Zone_Dublin_post_1968) {
|
||||
if ((Rule_Eire \
|
||||
|| (Zone_Dublin_post_1968 && $(in_comment + 3) == "IST/GMT")) \
|
||||
== (DATAFORM != "rearguard")) {
|
||||
uncomment = in_comment
|
||||
} else {
|
||||
comment_out = !in_comment
|
||||
}
|
||||
}
|
||||
|
||||
# If this line should differ due to Namibia using negative SAVE values,
|
||||
# uncomment the desired version and comment out the undesired one.
|
||||
Rule_Namibia = $0 ~ /^#?Rule[\t ]+Namibia[\t ]/
|
||||
Zone_using_Namibia_rule \
|
||||
= (zone == "Africa/Windhoek" && $0 ~ /^#?[\t ]+[12]:00[\t ]/ \
|
||||
&& ($(in_comment + 2) == "Namibia" \
|
||||
|| ($(in_comment + 2) == "-" && $(in_comment + 3) == "CAT" \
|
||||
&& ((1994 <= $(in_comment + 4) && $(in_comment + 4) <= 2017) \
|
||||
|| in_comment + 3 == NF))))
|
||||
if (Rule_Namibia || Zone_using_Namibia_rule) {
|
||||
if ((Rule_Namibia \
|
||||
? ($9 ~ /^-/ || ($9 == 0 && $10 == "CAT")) \
|
||||
: $(in_comment + 1) == "2:00" && $(in_comment + 2) == "Namibia") \
|
||||
== (DATAFORM != "rearguard")) {
|
||||
uncomment = in_comment
|
||||
} else {
|
||||
comment_out = !in_comment
|
||||
}
|
||||
}
|
||||
|
||||
# If this line should differ due to Portugal benefiting from %z if supported,
|
||||
# uncomment the desired version and comment out the undesired one.
|
||||
if ($0 ~ /^#?[\t ]+-[12]:00[\t ]+Port[\t ]+[%+-]/) {
|
||||
if (($0 ~ /%z/) == (DATAFORM == "vanguard")) {
|
||||
uncomment = in_comment
|
||||
} else {
|
||||
comment_out = !in_comment
|
||||
}
|
||||
}
|
||||
|
||||
# In vanguard form, use the line "Zone GMT 0 - GMT" instead of
|
||||
# "Zone Etc/GMT 0 - GMT" and adjust Link lines accordingly.
|
||||
# This works around a bug in TZUpdater 2.3.2.
|
||||
if (/^#?(Zone|Link)[\t ]+(Etc\/)?GMT[\t ]/) {
|
||||
if (($2 == "GMT") == (DATAFORM == "vanguard")) {
|
||||
uncomment = in_comment
|
||||
} else {
|
||||
comment_out = !in_comment
|
||||
}
|
||||
}
|
||||
|
||||
if (uncomment) {
|
||||
sub(/^#/, "")
|
||||
}
|
||||
if (comment_out) {
|
||||
sub(/^/, "#")
|
||||
}
|
||||
|
||||
# Prefer %z in vanguard form, explicit abbreviations otherwise.
|
||||
if (DATAFORM == "vanguard") {
|
||||
sub(/^(Zone[\t ]+[^\t ]+)?[\t ]+[^\t ]+[\t ]+[^\t ]+[\t ]+[-+][^\t ]+/, \
|
||||
"&CHANGE-TO-%z")
|
||||
sub(/-00CHANGE-TO-%z/, "-00")
|
||||
sub(/[-+][^\t ]+CHANGE-TO-/, "")
|
||||
} else {
|
||||
if ($0 ~ /^[^#]*%z/) {
|
||||
stdoff_column = 2 * ($0 ~ /^Zone/) + 1
|
||||
rules_column = stdoff_column + 1
|
||||
stdoff = get_minutes($stdoff_column)
|
||||
rules = $rules_column
|
||||
stdabbr = offset_abbr(stdoff)
|
||||
if (rules == "-") {
|
||||
abbr = stdabbr
|
||||
} else {
|
||||
dstabbr_only = rules ~ /^[+0-9-]/
|
||||
if (dstabbr_only) {
|
||||
dstoff = get_minutes(rules)
|
||||
} else {
|
||||
# The DST offset is normally an hour, but there are special cases.
|
||||
if (rules == "Morocco" && NF == 3) {
|
||||
dstoff = -60
|
||||
} else if (rules == "NBorneo") {
|
||||
dstoff = 20
|
||||
} else if (((rules == "Cook" || rules == "LH") && NF == 3) \
|
||||
|| (rules == "Uruguay" \
|
||||
&& $0 ~ /[\t ](1942 Dec 14|1960|1970|1974 Dec 22)$/)) {
|
||||
dstoff = 30
|
||||
} else if (rules == "Uruguay" && $0 ~ /[\t ]1974 Mar 10$/) {
|
||||
dstoff = 90
|
||||
} else {
|
||||
dstoff = 60
|
||||
}
|
||||
}
|
||||
dstabbr = offset_abbr(stdoff + dstoff)
|
||||
if (dstabbr_only) {
|
||||
abbr = dstabbr
|
||||
} else {
|
||||
abbr = stdabbr "/" dstabbr
|
||||
}
|
||||
}
|
||||
sub(/%z/, abbr)
|
||||
}
|
||||
}
|
||||
|
||||
# Normally, prefer whole seconds. However, prefer subseconds
|
||||
# if generating vanguard form and the otherwise-undocumented
|
||||
# VANGUARD_SUBSECONDS environment variable is set.
|
||||
# This relies on #STDOFF comment lines in the data.
|
||||
# It is for hypothetical clients that support UT offsets that are
|
||||
# not integer multiples of one second (e.g., Europe/Lisbon, 1884 to 1912).
|
||||
# No known clients need this currently, and this experimental
|
||||
# feature may be changed or withdrawn in future releases.
|
||||
if ($1 == "#STDOFF") {
|
||||
stdoff = $2
|
||||
rounded_stdoff = round_to_second(stdoff)
|
||||
if (DATAFORM == "vanguard" && ENVIRON["VANGUARD_SUBSECONDS"]) {
|
||||
stdoff_subst[0] = rounded_stdoff
|
||||
stdoff_subst[1] = stdoff
|
||||
} else {
|
||||
stdoff_subst[0] = stdoff
|
||||
stdoff_subst[1] = rounded_stdoff
|
||||
}
|
||||
} else if (stdoff_subst[0]) {
|
||||
stdoff_column = 2 * ($0 ~ /^Zone/) + 1
|
||||
stdoff_column_val = $stdoff_column
|
||||
if (stdoff_column_val == stdoff_subst[0]) {
|
||||
sub(stdoff_subst[0], stdoff_subst[1])
|
||||
} else if (stdoff_column_val != stdoff_subst[1]) {
|
||||
stdoff_subst[0] = 0
|
||||
}
|
||||
}
|
||||
|
||||
# In rearguard form, change the Japan rule line with "Sat>=8 25:00"
|
||||
# to "Sun>=9 1:00", to cater to zic before 2007 and to older Java.
|
||||
if ($0 ~ /^Rule/ && $2 == "Japan") {
|
||||
if (DATAFORM == "rearguard") {
|
||||
if ($7 == "Sat>=8" && $8 == "25:00") {
|
||||
sub(/Sat>=8/, "Sun>=9")
|
||||
sub(/25:00/, " 1:00")
|
||||
}
|
||||
} else {
|
||||
if ($7 == "Sun>=9" && $8 == "1:00") {
|
||||
sub(/Sun>=9/, "Sat>=8")
|
||||
sub(/ 1:00/, "25:00")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# In rearguard form, change the Morocco lines with negative SAVE values
|
||||
# to use positive SAVE values.
|
||||
if ($2 == "Morocco") {
|
||||
if ($0 ~ /^Rule/) {
|
||||
if ($4 ~ /^201[78]$/ && $6 == "Oct") {
|
||||
if (DATAFORM == "rearguard") {
|
||||
sub(/\t2018\t/, "\t2017\t")
|
||||
} else {
|
||||
sub(/\t2017\t/, "\t2018\t")
|
||||
}
|
||||
}
|
||||
|
||||
if (2019 <= $3) {
|
||||
if ($8 == "2:00") {
|
||||
if (DATAFORM == "rearguard") {
|
||||
sub(/\t0\t/, "\t1:00\t")
|
||||
} else {
|
||||
sub(/\t1:00\t/, "\t0\t")
|
||||
}
|
||||
} else {
|
||||
if (DATAFORM == "rearguard") {
|
||||
sub(/\t-1:00\t/, "\t0\t")
|
||||
} else {
|
||||
sub(/\t0\t/, "\t-1:00\t")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($1 ~ /^[+0-9-]/ && NF == 3) {
|
||||
if (DATAFORM == "rearguard") {
|
||||
sub(/1:00\tMorocco/, "0:00\tMorocco")
|
||||
sub(/\t\+01\/\+00$/, "\t+00/+01")
|
||||
} else {
|
||||
sub(/0:00\tMorocco/, "1:00\tMorocco")
|
||||
sub(/\t\+00\/+01$/, "\t+01/+00")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/^Zone/ {
|
||||
packrat_ignored = FILENAME == PACKRATDATA && PACKRATLIST && !packratlist[$2];
|
||||
}
|
||||
{
|
||||
if (packrat_ignored && $0 !~ /^Rule/) {
|
||||
sub(/^/, "#")
|
||||
}
|
||||
}
|
||||
|
||||
# Return a link line resulting by changing OLDLINE to link to TARGET
|
||||
# from LINKNAME, instead of linking to OLDTARGET from LINKNAME.
|
||||
# Align data columns the same as they were in OLDLINE.
|
||||
# Also, replace any existing white space followed by comment with COMMENT.
|
||||
function make_linkline(oldline, target, linkname, oldtarget, comment, \
|
||||
oldprefix, oldprefixlen, oldtargettabs, \
|
||||
replsuffix, targettabs)
|
||||
{
|
||||
oldprefix = "Link\t" oldtarget "\t"
|
||||
oldprefixlen = length(oldprefix)
|
||||
if (substr(oldline, 1, oldprefixlen) == oldprefix) {
|
||||
# Use tab stops to preserve LINKNAME's column.
|
||||
replsuffix = substr(oldline, oldprefixlen + 1)
|
||||
sub(/[\t ]*#.*/, "", replsuffix)
|
||||
oldtargettabs = int(length(oldtarget) / 8) + 1
|
||||
targettabs = int(length(target) / 8) + 1
|
||||
for (; targettabs < oldtargettabs; targettabs++) {
|
||||
replsuffix = "\t" replsuffix
|
||||
}
|
||||
for (; oldtargettabs < targettabs && replsuffix ~ /^\t/; targettabs--) {
|
||||
replsuffix = substr(replsuffix, 2)
|
||||
}
|
||||
} else {
|
||||
# Odd format line; don't bother lining up its replacement nicely.
|
||||
replsuffix = linkname
|
||||
}
|
||||
return "Link\t" target "\t" replsuffix comment
|
||||
}
|
||||
|
||||
/^Link/ && $4 == "#=" && DATAFORM == "vanguard" {
|
||||
$0 = make_linkline($0, $5, $3, $2)
|
||||
}
|
||||
|
||||
# If a Link line is followed by a Link or Zone line for the same data, comment
|
||||
# out the Link line. This can happen if backzone overrides a Link
|
||||
# with a Zone or a different Link.
|
||||
/^Zone/ {
|
||||
sub(/^Link/, "#Link", line[linkline[$2]])
|
||||
}
|
||||
/^Link/ {
|
||||
sub(/^Link/, "#Link", line[linkline[$3]])
|
||||
linkline[$3] = NR
|
||||
linktarget[$3] = $2
|
||||
}
|
||||
|
||||
{ line[NR] = $0 }
|
||||
|
||||
function cut_link_chains_short( \
|
||||
l, linkname, t, target)
|
||||
{
|
||||
for (linkname in linktarget) {
|
||||
target = linktarget[linkname]
|
||||
t = linktarget[target]
|
||||
if (t) {
|
||||
# TARGET is itself a link name. Replace the line "Link TARGET LINKNAME"
|
||||
# with "Link T LINKNAME #= TARGET", where T is at the end of the chain
|
||||
# of links that LINKNAME points to.
|
||||
while ((u = linktarget[t])) {
|
||||
t = u
|
||||
}
|
||||
l = linkline[linkname]
|
||||
line[l] = make_linkline(line[l], t, linkname, target, "\t#= " target)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
END {
|
||||
if (DATAFORM != "vanguard") {
|
||||
cut_link_chains_short()
|
||||
}
|
||||
for (i = 1; i <= NR; i++)
|
||||
print line[i]
|
||||
}
|
||||
356
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zishrink.awk
vendored
Normal file
356
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zishrink.awk
vendored
Normal file
@@ -0,0 +1,356 @@
|
||||
# Convert tzdata source into a smaller version of itself.
|
||||
|
||||
# Contributed by Paul Eggert. This file is in the public domain.
|
||||
|
||||
# This is not a general-purpose converter; it is designed for current tzdata.
|
||||
# 'zic' should treat this script's output as if it were identical to
|
||||
# this script's input.
|
||||
|
||||
# Record a hash N for the new name NAME, checking for collisions.
|
||||
|
||||
function record_hash(n, name)
|
||||
{
|
||||
if (used_hashes[n]) {
|
||||
printf "# ! collision: %s %s\n", used_hashes[n], name
|
||||
exit 1
|
||||
}
|
||||
used_hashes[n] = name
|
||||
}
|
||||
|
||||
# Return a shortened rule name representing NAME,
|
||||
# and record this relationship to the hash table.
|
||||
|
||||
function gen_rule_name(name, \
|
||||
n)
|
||||
{
|
||||
# Use a simple mnemonic: the first two letters.
|
||||
n = substr(name, 1, 2)
|
||||
record_hash(n, name)
|
||||
# printf "# %s = %s\n", n, name
|
||||
return n
|
||||
}
|
||||
|
||||
function prehash_rule_names( \
|
||||
name)
|
||||
{
|
||||
# Rule names are not part of the tzdb API, so substitute shorter
|
||||
# ones. Shortening them consistently from one release to the next
|
||||
# simplifies comparison of the output. That being said, the
|
||||
# 1-letter names below are not standardized in any way, and can
|
||||
# change arbitrarily from one release to the next, as the main goal
|
||||
# here is compression not comparison.
|
||||
|
||||
# Abbreviating these rules names to one letter saved the most space
|
||||
# circa 2018e.
|
||||
rule["Arg"] = "A"
|
||||
rule["Brazil"] = "B"
|
||||
rule["Canada"] = "C"
|
||||
rule["Denmark"] = "D"
|
||||
rule["EU"] = "E"
|
||||
rule["France"] = "F"
|
||||
rule["GB-Eire"] = "G"
|
||||
rule["Halifax"] = "H"
|
||||
rule["Italy"] = "I"
|
||||
rule["Jordan"] = "J"
|
||||
rule["Egypt"] = "K" # "Kemet" in ancient Egyptian
|
||||
rule["Libya"] = "L"
|
||||
rule["Morocco"] = "M"
|
||||
rule["Neth"] = "N"
|
||||
rule["Poland"] = "O" # arbitrary
|
||||
rule["Palestine"] = "P"
|
||||
rule["Cuba"] = "Q" # Its start sounds like "Q".
|
||||
rule["Russia"] = "R"
|
||||
rule["Syria"] = "S"
|
||||
rule["Turkey"] = "T"
|
||||
rule["Uruguay"] = "U"
|
||||
rule["Vincennes"] = "V"
|
||||
rule["Winn"] = "W"
|
||||
rule["Mongol"] = "X" # arbitrary
|
||||
rule["NT_YK"] = "Y"
|
||||
rule["Zion"] = "Z"
|
||||
rule["Austria"] = "a"
|
||||
rule["Belgium"] = "b"
|
||||
rule["C-Eur"] = "c"
|
||||
rule["Algeria"] = "d" # country code DZ
|
||||
rule["E-Eur"] = "e"
|
||||
rule["Taiwan"] = "f" # Formosa
|
||||
rule["Greece"] = "g"
|
||||
rule["Hungary"] = "h"
|
||||
rule["Iran"] = "i"
|
||||
rule["StJohns"] = "j"
|
||||
rule["Chatham"] = "k" # arbitrary
|
||||
rule["Lebanon"] = "l"
|
||||
rule["Mexico"] = "m"
|
||||
rule["Tunisia"] = "n" # country code TN
|
||||
rule["Moncton"] = "o" # arbitrary
|
||||
rule["Port"] = "p"
|
||||
rule["Albania"] = "q" # arbitrary
|
||||
rule["Regina"] = "r"
|
||||
rule["Spain"] = "s"
|
||||
rule["Toronto"] = "t"
|
||||
rule["US"] = "u"
|
||||
rule["Louisville"] = "v" # ville
|
||||
rule["Iceland"] = "w" # arbitrary
|
||||
rule["Chile"] = "x" # arbitrary
|
||||
rule["Para"] = "y" # country code PY
|
||||
rule["Romania"] = "z" # arbitrary
|
||||
rule["Macau"] = "_" # arbitrary
|
||||
|
||||
# Use ISO 3166 alpha-2 country codes for remaining names that are countries.
|
||||
# This is more systematic, and avoids collisions (e.g., Malta and Moldova).
|
||||
rule["Armenia"] = "AM"
|
||||
rule["Aus"] = "AU"
|
||||
rule["Azer"] = "AZ"
|
||||
rule["Barb"] = "BB"
|
||||
rule["Dhaka"] = "BD"
|
||||
rule["Bulg"] = "BG"
|
||||
rule["Bahamas"] = "BS"
|
||||
rule["Belize"] = "BZ"
|
||||
rule["Swiss"] = "CH"
|
||||
rule["Cook"] = "CK"
|
||||
rule["PRC"] = "CN"
|
||||
rule["Cyprus"] = "CY"
|
||||
rule["Czech"] = "CZ"
|
||||
rule["Germany"] = "DE"
|
||||
rule["DR"] = "DO"
|
||||
rule["Ecuador"] = "EC"
|
||||
rule["Finland"] = "FI"
|
||||
rule["Fiji"] = "FJ"
|
||||
rule["Falk"] = "FK"
|
||||
rule["Ghana"] = "GH"
|
||||
rule["Guat"] = "GT"
|
||||
rule["Hond"] = "HN"
|
||||
rule["Haiti"] = "HT"
|
||||
rule["Eire"] = "IE"
|
||||
rule["Iraq"] = "IQ"
|
||||
rule["Japan"] = "JP"
|
||||
rule["Kyrgyz"] = "KG"
|
||||
rule["ROK"] = "KR"
|
||||
rule["Latvia"] = "LV"
|
||||
rule["Lux"] = "LX"
|
||||
rule["Moldova"] = "MD"
|
||||
rule["Malta"] = "MT"
|
||||
rule["Mauritius"] = "MU"
|
||||
rule["Namibia"] = "NA"
|
||||
rule["Nic"] = "NI"
|
||||
rule["Norway"] = "NO"
|
||||
rule["Peru"] = "PE"
|
||||
rule["Phil"] = "PH"
|
||||
rule["Pakistan"] = "PK"
|
||||
rule["Sudan"] = "SD"
|
||||
rule["Salv"] = "SV"
|
||||
rule["Tonga"] = "TO"
|
||||
rule["Vanuatu"] = "VU"
|
||||
|
||||
# Avoid collisions.
|
||||
rule["Detroit"] = "Dt" # De = Denver
|
||||
|
||||
for (name in rule) {
|
||||
record_hash(rule[name], name)
|
||||
}
|
||||
}
|
||||
|
||||
function make_line(n, field, \
|
||||
f, r)
|
||||
{
|
||||
r = field[1]
|
||||
for (f = 2; f <= n; f++)
|
||||
r = r " " field[f]
|
||||
return r
|
||||
}
|
||||
|
||||
# Process the input line LINE and save it for later output.
|
||||
|
||||
function process_input_line(line, \
|
||||
f, field, end, i, n, r, startdef, \
|
||||
linkline, ruleline, zoneline)
|
||||
{
|
||||
# Remove comments, normalize spaces, and append a space to each line.
|
||||
sub(/#.*/, "", line)
|
||||
line = line " "
|
||||
gsub(/[\t ]+/, " ", line)
|
||||
|
||||
# Abbreviate keywords and determine line type.
|
||||
linkline = sub(/^Link /, "L ", line)
|
||||
ruleline = sub(/^Rule /, "R ", line)
|
||||
zoneline = sub(/^Zone /, "Z ", line)
|
||||
|
||||
# Replace FooAsia rules with the same rules without "Asia", as they
|
||||
# are duplicates.
|
||||
if (match(line, /[^ ]Asia /)) {
|
||||
if (ruleline) return
|
||||
line = substr(line, 1, RSTART) substr(line, RSTART + 5)
|
||||
}
|
||||
|
||||
# Abbreviate times.
|
||||
while (match(line, /[: ]0+[0-9]/))
|
||||
line = substr(line, 1, RSTART) substr(line, RSTART + RLENGTH - 1)
|
||||
while (match(line, /:0[^:]/))
|
||||
line = substr(line, 1, RSTART - 1) substr(line, RSTART + 2)
|
||||
|
||||
# Abbreviate weekday names.
|
||||
while (match(line, / (last)?(Mon|Wed|Fri)[ <>]/)) {
|
||||
end = RSTART + RLENGTH
|
||||
line = substr(line, 1, end - 4) substr(line, end - 1)
|
||||
}
|
||||
while (match(line, / (last)?(Sun|Tue|Thu|Sat)[ <>]/)) {
|
||||
end = RSTART + RLENGTH
|
||||
line = substr(line, 1, end - 3) substr(line, end - 1)
|
||||
}
|
||||
|
||||
# Abbreviate "max", "min", "only" and month names.
|
||||
gsub(/ max /, " ma ", line)
|
||||
gsub(/ min /, " mi ", line)
|
||||
gsub(/ only /, " o ", line)
|
||||
gsub(/ Jan /, " Ja ", line)
|
||||
gsub(/ Feb /, " F ", line)
|
||||
gsub(/ Apr /, " Ap ", line)
|
||||
gsub(/ Aug /, " Au ", line)
|
||||
gsub(/ Sep /, " S ", line)
|
||||
gsub(/ Oct /, " O ", line)
|
||||
gsub(/ Nov /, " N ", line)
|
||||
gsub(/ Dec /, " D ", line)
|
||||
|
||||
# Strip leading and trailing space.
|
||||
sub(/^ /, "", line)
|
||||
sub(/ $/, "", line)
|
||||
|
||||
# Remove unnecessary trailing zero fields.
|
||||
sub(/ 0+$/, "", line)
|
||||
|
||||
# Remove unnecessary trailing days-of-month "1".
|
||||
if (match(line, /[A-Za-z] 1$/))
|
||||
line = substr(line, 1, RSTART)
|
||||
|
||||
# Remove unnecessary trailing " Ja" (for January).
|
||||
sub(/ Ja$/, "", line)
|
||||
|
||||
n = split(line, field)
|
||||
|
||||
# Record which rule names are used, and generate their abbreviations.
|
||||
f = zoneline ? 4 : linkline || ruleline ? 0 : 2
|
||||
r = field[f]
|
||||
if (r ~ /^[^-+0-9]/) {
|
||||
rule_used[r] = 1
|
||||
}
|
||||
|
||||
# If this zone supersedes an earlier one, delete the earlier one
|
||||
# from the saved output lines.
|
||||
startdef = ""
|
||||
if (zoneline)
|
||||
zonename = startdef = field[2]
|
||||
else if (linkline)
|
||||
zonename = startdef = field[3]
|
||||
else if (ruleline)
|
||||
zonename = ""
|
||||
if (startdef) {
|
||||
i = zonedef[startdef]
|
||||
if (i) {
|
||||
do
|
||||
output_line[i - 1] = ""
|
||||
while (output_line[i++] ~ /^[-+0-9]/);
|
||||
}
|
||||
}
|
||||
zonedef[zonename] = nout + 1
|
||||
|
||||
# Save the line for later output.
|
||||
output_line[nout++] = make_line(n, field)
|
||||
}
|
||||
|
||||
function omit_unused_rules( \
|
||||
i, field)
|
||||
{
|
||||
for (i = 0; i < nout; i++) {
|
||||
split(output_line[i], field)
|
||||
if (field[1] == "R" && !rule_used[field[2]]) {
|
||||
output_line[i] = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function abbreviate_rule_names( \
|
||||
abbr, f, field, i, n, r)
|
||||
{
|
||||
for (i = 0; i < nout; i++) {
|
||||
n = split(output_line[i], field)
|
||||
if (n) {
|
||||
f = field[1] == "Z" ? 4 : field[1] == "L" ? 0 : 2
|
||||
r = field[f]
|
||||
if (r ~ /^[^-+0-9]/) {
|
||||
abbr = rule[r]
|
||||
if (!abbr) {
|
||||
rule[r] = abbr = gen_rule_name(r)
|
||||
}
|
||||
field[f] = abbr
|
||||
output_line[i] = make_line(n, field)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function output_saved_lines( \
|
||||
i)
|
||||
{
|
||||
for (i = 0; i < nout; i++)
|
||||
if (output_line[i])
|
||||
print output_line[i]
|
||||
}
|
||||
|
||||
BEGIN {
|
||||
# Files that the output normally depends on.
|
||||
default_dep["africa"] = 1
|
||||
default_dep["antarctica"] = 1
|
||||
default_dep["asia"] = 1
|
||||
default_dep["australasia"] = 1
|
||||
default_dep["backward"] = 1
|
||||
default_dep["etcetera"] = 1
|
||||
default_dep["europe"] = 1
|
||||
default_dep["factory"] = 1
|
||||
default_dep["northamerica"] = 1
|
||||
default_dep["southamerica"] = 1
|
||||
default_dep["ziguard.awk"] = 1
|
||||
default_dep["zishrink.awk"] = 1
|
||||
|
||||
# Output a version string from 'version' and related configuration variables
|
||||
# supported by tzdb's Makefile. If you change the makefile or any other files
|
||||
# that affect the output of this script, you should append '-SOMETHING'
|
||||
# to the contents of 'version', where SOMETHING identifies what was changed.
|
||||
|
||||
ndeps = split(deps, dep)
|
||||
ddeps = ""
|
||||
for (i = 1; i <= ndeps; i++) {
|
||||
if (default_dep[dep[i]]) {
|
||||
default_dep[dep[i]]++
|
||||
} else {
|
||||
ddeps = ddeps " " dep[i]
|
||||
}
|
||||
}
|
||||
for (d in default_dep) {
|
||||
if (default_dep[d] == 1) {
|
||||
ddeps = ddeps " !" d
|
||||
}
|
||||
}
|
||||
print "# version", version
|
||||
if (dataform != "main") {
|
||||
print "# dataform", dataform
|
||||
}
|
||||
if (redo != "posix_right") {
|
||||
print "# redo " redo
|
||||
}
|
||||
if (ddeps) {
|
||||
print "# ddeps" ddeps
|
||||
}
|
||||
print "# This zic input file is in the public domain."
|
||||
|
||||
prehash_rule_names()
|
||||
}
|
||||
|
||||
/^[\t ]*[^#\t ]/ {
|
||||
process_input_line($0)
|
||||
}
|
||||
|
||||
END {
|
||||
omit_unused_rules()
|
||||
abbreviate_rule_names()
|
||||
output_saved_lines()
|
||||
}
|
||||
449
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zone.tab
vendored
Normal file
449
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zone.tab
vendored
Normal file
@@ -0,0 +1,449 @@
|
||||
# tzdb timezone descriptions (deprecated version)
|
||||
#
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
#
|
||||
# From Paul Eggert (2021-09-20):
|
||||
# This file is intended as a backward-compatibility aid for older programs.
|
||||
# New programs should use zone1970.tab. This file is like zone1970.tab (see
|
||||
# zone1970.tab's comments), but with the following additional restrictions:
|
||||
#
|
||||
# 1. This file contains only ASCII characters.
|
||||
# 2. The first data column contains exactly one country code.
|
||||
#
|
||||
# Because of (2), each row stands for an area that is the intersection
|
||||
# of a region identified by a country code and of a timezone where civil
|
||||
# clocks have agreed since 1970; this is a narrower definition than
|
||||
# that of zone1970.tab.
|
||||
#
|
||||
# Unlike zone1970.tab, a row's third column can be a Link from
|
||||
# 'backward' instead of a Zone.
|
||||
#
|
||||
# This table is intended as an aid for users, to help them select timezones
|
||||
# appropriate for their practical needs. It is not intended to take or
|
||||
# endorse any position on legal or territorial claims.
|
||||
#
|
||||
#country-
|
||||
#code coordinates TZ comments
|
||||
AD +4230+00131 Europe/Andorra
|
||||
AE +2518+05518 Asia/Dubai
|
||||
AF +3431+06912 Asia/Kabul
|
||||
AG +1703-06148 America/Antigua
|
||||
AI +1812-06304 America/Anguilla
|
||||
AL +4120+01950 Europe/Tirane
|
||||
AM +4011+04430 Asia/Yerevan
|
||||
AO -0848+01314 Africa/Luanda
|
||||
AQ -7750+16636 Antarctica/McMurdo New Zealand time - McMurdo, South Pole
|
||||
AQ -6617+11031 Antarctica/Casey Casey
|
||||
AQ -6835+07758 Antarctica/Davis Davis
|
||||
AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville
|
||||
AQ -6736+06253 Antarctica/Mawson Mawson
|
||||
AQ -6448-06406 Antarctica/Palmer Palmer
|
||||
AQ -6734-06808 Antarctica/Rothera Rothera
|
||||
AQ -690022+0393524 Antarctica/Syowa Syowa
|
||||
AQ -720041+0023206 Antarctica/Troll Troll
|
||||
AQ -7824+10654 Antarctica/Vostok Vostok
|
||||
AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF)
|
||||
AR -3124-06411 America/Argentina/Cordoba Argentina (most areas: CB, CC, CN, ER, FM, MN, SE, SF)
|
||||
AR -2447-06525 America/Argentina/Salta Salta (SA, LP, NQ, RN)
|
||||
AR -2411-06518 America/Argentina/Jujuy Jujuy (JY)
|
||||
AR -2649-06513 America/Argentina/Tucuman Tucuman (TM)
|
||||
AR -2828-06547 America/Argentina/Catamarca Catamarca (CT); Chubut (CH)
|
||||
AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR)
|
||||
AR -3132-06831 America/Argentina/San_Juan San Juan (SJ)
|
||||
AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ)
|
||||
AR -3319-06621 America/Argentina/San_Luis San Luis (SL)
|
||||
AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC)
|
||||
AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF)
|
||||
AS -1416-17042 Pacific/Pago_Pago
|
||||
AT +4813+01620 Europe/Vienna
|
||||
AU -3133+15905 Australia/Lord_Howe Lord Howe Island
|
||||
AU -5430+15857 Antarctica/Macquarie Macquarie Island
|
||||
AU -4253+14719 Australia/Hobart Tasmania
|
||||
AU -3749+14458 Australia/Melbourne Victoria
|
||||
AU -3352+15113 Australia/Sydney New South Wales (most areas)
|
||||
AU -3157+14127 Australia/Broken_Hill New South Wales (Yancowinna)
|
||||
AU -2728+15302 Australia/Brisbane Queensland (most areas)
|
||||
AU -2016+14900 Australia/Lindeman Queensland (Whitsunday Islands)
|
||||
AU -3455+13835 Australia/Adelaide South Australia
|
||||
AU -1228+13050 Australia/Darwin Northern Territory
|
||||
AU -3157+11551 Australia/Perth Western Australia (most areas)
|
||||
AU -3143+12852 Australia/Eucla Western Australia (Eucla)
|
||||
AW +1230-06958 America/Aruba
|
||||
AX +6006+01957 Europe/Mariehamn
|
||||
AZ +4023+04951 Asia/Baku
|
||||
BA +4352+01825 Europe/Sarajevo
|
||||
BB +1306-05937 America/Barbados
|
||||
BD +2343+09025 Asia/Dhaka
|
||||
BE +5050+00420 Europe/Brussels
|
||||
BF +1222-00131 Africa/Ouagadougou
|
||||
BG +4241+02319 Europe/Sofia
|
||||
BH +2623+05035 Asia/Bahrain
|
||||
BI -0323+02922 Africa/Bujumbura
|
||||
BJ +0629+00237 Africa/Porto-Novo
|
||||
BL +1753-06251 America/St_Barthelemy
|
||||
BM +3217-06446 Atlantic/Bermuda
|
||||
BN +0456+11455 Asia/Brunei
|
||||
BO -1630-06809 America/La_Paz
|
||||
BQ +120903-0681636 America/Kralendijk
|
||||
BR -0351-03225 America/Noronha Atlantic islands
|
||||
BR -0127-04829 America/Belem Para (east); Amapa
|
||||
BR -0343-03830 America/Fortaleza Brazil (northeast: MA, PI, CE, RN, PB)
|
||||
BR -0803-03454 America/Recife Pernambuco
|
||||
BR -0712-04812 America/Araguaina Tocantins
|
||||
BR -0940-03543 America/Maceio Alagoas, Sergipe
|
||||
BR -1259-03831 America/Bahia Bahia
|
||||
BR -2332-04637 America/Sao_Paulo Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)
|
||||
BR -2027-05437 America/Campo_Grande Mato Grosso do Sul
|
||||
BR -1535-05605 America/Cuiaba Mato Grosso
|
||||
BR -0226-05452 America/Santarem Para (west)
|
||||
BR -0846-06354 America/Porto_Velho Rondonia
|
||||
BR +0249-06040 America/Boa_Vista Roraima
|
||||
BR -0308-06001 America/Manaus Amazonas (east)
|
||||
BR -0640-06952 America/Eirunepe Amazonas (west)
|
||||
BR -0958-06748 America/Rio_Branco Acre
|
||||
BS +2505-07721 America/Nassau
|
||||
BT +2728+08939 Asia/Thimphu
|
||||
BW -2439+02555 Africa/Gaborone
|
||||
BY +5354+02734 Europe/Minsk
|
||||
BZ +1730-08812 America/Belize
|
||||
CA +4734-05243 America/St_Johns Newfoundland; Labrador (southeast)
|
||||
CA +4439-06336 America/Halifax Atlantic - NS (most areas); PE
|
||||
CA +4612-05957 America/Glace_Bay Atlantic - NS (Cape Breton)
|
||||
CA +4606-06447 America/Moncton Atlantic - New Brunswick
|
||||
CA +5320-06025 America/Goose_Bay Atlantic - Labrador (most areas)
|
||||
CA +5125-05707 America/Blanc-Sablon AST - QC (Lower North Shore)
|
||||
CA +4339-07923 America/Toronto Eastern - ON, QC (most areas)
|
||||
CA +6344-06828 America/Iqaluit Eastern - NU (most areas)
|
||||
CA +484531-0913718 America/Atikokan EST - ON (Atikokan); NU (Coral H)
|
||||
CA +4953-09709 America/Winnipeg Central - ON (west); Manitoba
|
||||
CA +744144-0944945 America/Resolute Central - NU (Resolute)
|
||||
CA +624900-0920459 America/Rankin_Inlet Central - NU (central)
|
||||
CA +5024-10439 America/Regina CST - SK (most areas)
|
||||
CA +5017-10750 America/Swift_Current CST - SK (midwest)
|
||||
CA +5333-11328 America/Edmonton Mountain - AB; BC (E); SK (W)
|
||||
CA +690650-1050310 America/Cambridge_Bay Mountain - NU (west)
|
||||
CA +6227-11421 America/Yellowknife Mountain - NT (central)
|
||||
CA +682059-1334300 America/Inuvik Mountain - NT (west)
|
||||
CA +4906-11631 America/Creston MST - BC (Creston)
|
||||
CA +5546-12014 America/Dawson_Creek MST - BC (Dawson Cr, Ft St John)
|
||||
CA +5848-12242 America/Fort_Nelson MST - BC (Ft Nelson)
|
||||
CA +6043-13503 America/Whitehorse MST - Yukon (east)
|
||||
CA +6404-13925 America/Dawson MST - Yukon (west)
|
||||
CA +4916-12307 America/Vancouver Pacific - BC (most areas)
|
||||
CC -1210+09655 Indian/Cocos
|
||||
CD -0418+01518 Africa/Kinshasa Dem. Rep. of Congo (west)
|
||||
CD -1140+02728 Africa/Lubumbashi Dem. Rep. of Congo (east)
|
||||
CF +0422+01835 Africa/Bangui
|
||||
CG -0416+01517 Africa/Brazzaville
|
||||
CH +4723+00832 Europe/Zurich
|
||||
CI +0519-00402 Africa/Abidjan
|
||||
CK -2114-15946 Pacific/Rarotonga
|
||||
CL -3327-07040 America/Santiago Chile (most areas)
|
||||
CL -5309-07055 America/Punta_Arenas Region of Magallanes
|
||||
CL -2709-10926 Pacific/Easter Easter Island
|
||||
CM +0403+00942 Africa/Douala
|
||||
CN +3114+12128 Asia/Shanghai Beijing Time
|
||||
CN +4348+08735 Asia/Urumqi Xinjiang Time
|
||||
CO +0436-07405 America/Bogota
|
||||
CR +0956-08405 America/Costa_Rica
|
||||
CU +2308-08222 America/Havana
|
||||
CV +1455-02331 Atlantic/Cape_Verde
|
||||
CW +1211-06900 America/Curacao
|
||||
CX -1025+10543 Indian/Christmas
|
||||
CY +3510+03322 Asia/Nicosia Cyprus (most areas)
|
||||
CY +3507+03357 Asia/Famagusta Northern Cyprus
|
||||
CZ +5005+01426 Europe/Prague
|
||||
DE +5230+01322 Europe/Berlin Germany (most areas)
|
||||
DE +4742+00841 Europe/Busingen Busingen
|
||||
DJ +1136+04309 Africa/Djibouti
|
||||
DK +5540+01235 Europe/Copenhagen
|
||||
DM +1518-06124 America/Dominica
|
||||
DO +1828-06954 America/Santo_Domingo
|
||||
DZ +3647+00303 Africa/Algiers
|
||||
EC -0210-07950 America/Guayaquil Ecuador (mainland)
|
||||
EC -0054-08936 Pacific/Galapagos Galapagos Islands
|
||||
EE +5925+02445 Europe/Tallinn
|
||||
EG +3003+03115 Africa/Cairo
|
||||
EH +2709-01312 Africa/El_Aaiun
|
||||
ER +1520+03853 Africa/Asmara
|
||||
ES +4024-00341 Europe/Madrid Spain (mainland)
|
||||
ES +3553-00519 Africa/Ceuta Ceuta, Melilla
|
||||
ES +2806-01524 Atlantic/Canary Canary Islands
|
||||
ET +0902+03842 Africa/Addis_Ababa
|
||||
FI +6010+02458 Europe/Helsinki
|
||||
FJ -1808+17825 Pacific/Fiji
|
||||
FK -5142-05751 Atlantic/Stanley
|
||||
FM +0725+15147 Pacific/Chuuk Chuuk/Truk, Yap
|
||||
FM +0658+15813 Pacific/Pohnpei Pohnpei/Ponape
|
||||
FM +0519+16259 Pacific/Kosrae Kosrae
|
||||
FO +6201-00646 Atlantic/Faroe
|
||||
FR +4852+00220 Europe/Paris
|
||||
GA +0023+00927 Africa/Libreville
|
||||
GB +513030-0000731 Europe/London
|
||||
GD +1203-06145 America/Grenada
|
||||
GE +4143+04449 Asia/Tbilisi
|
||||
GF +0456-05220 America/Cayenne
|
||||
GG +492717-0023210 Europe/Guernsey
|
||||
GH +0533-00013 Africa/Accra
|
||||
GI +3608-00521 Europe/Gibraltar
|
||||
GL +6411-05144 America/Nuuk Greenland (most areas)
|
||||
GL +7646-01840 America/Danmarkshavn National Park (east coast)
|
||||
GL +7029-02158 America/Scoresbysund Scoresbysund/Ittoqqortoormiit
|
||||
GL +7634-06847 America/Thule Thule/Pituffik
|
||||
GM +1328-01639 Africa/Banjul
|
||||
GN +0931-01343 Africa/Conakry
|
||||
GP +1614-06132 America/Guadeloupe
|
||||
GQ +0345+00847 Africa/Malabo
|
||||
GR +3758+02343 Europe/Athens
|
||||
GS -5416-03632 Atlantic/South_Georgia
|
||||
GT +1438-09031 America/Guatemala
|
||||
GU +1328+14445 Pacific/Guam
|
||||
GW +1151-01535 Africa/Bissau
|
||||
GY +0648-05810 America/Guyana
|
||||
HK +2217+11409 Asia/Hong_Kong
|
||||
HN +1406-08713 America/Tegucigalpa
|
||||
HR +4548+01558 Europe/Zagreb
|
||||
HT +1832-07220 America/Port-au-Prince
|
||||
HU +4730+01905 Europe/Budapest
|
||||
ID -0610+10648 Asia/Jakarta Java, Sumatra
|
||||
ID -0002+10920 Asia/Pontianak Borneo (west, central)
|
||||
ID -0507+11924 Asia/Makassar Borneo (east, south); Sulawesi/Celebes, Bali, Nusa Tengarra; Timor (west)
|
||||
ID -0232+14042 Asia/Jayapura New Guinea (West Papua / Irian Jaya); Malukus/Moluccas
|
||||
IE +5320-00615 Europe/Dublin
|
||||
IL +314650+0351326 Asia/Jerusalem
|
||||
IM +5409-00428 Europe/Isle_of_Man
|
||||
IN +2232+08822 Asia/Kolkata
|
||||
IO -0720+07225 Indian/Chagos
|
||||
IQ +3321+04425 Asia/Baghdad
|
||||
IR +3540+05126 Asia/Tehran
|
||||
IS +6409-02151 Atlantic/Reykjavik
|
||||
IT +4154+01229 Europe/Rome
|
||||
JE +491101-0020624 Europe/Jersey
|
||||
JM +175805-0764736 America/Jamaica
|
||||
JO +3157+03556 Asia/Amman
|
||||
JP +353916+1394441 Asia/Tokyo
|
||||
KE -0117+03649 Africa/Nairobi
|
||||
KG +4254+07436 Asia/Bishkek
|
||||
KH +1133+10455 Asia/Phnom_Penh
|
||||
KI +0125+17300 Pacific/Tarawa Gilbert Islands
|
||||
KI -0247-17143 Pacific/Kanton Phoenix Islands
|
||||
KI +0152-15720 Pacific/Kiritimati Line Islands
|
||||
KM -1141+04316 Indian/Comoro
|
||||
KN +1718-06243 America/St_Kitts
|
||||
KP +3901+12545 Asia/Pyongyang
|
||||
KR +3733+12658 Asia/Seoul
|
||||
KW +2920+04759 Asia/Kuwait
|
||||
KY +1918-08123 America/Cayman
|
||||
KZ +4315+07657 Asia/Almaty Kazakhstan (most areas)
|
||||
KZ +4448+06528 Asia/Qyzylorda Qyzylorda/Kyzylorda/Kzyl-Orda
|
||||
KZ +5312+06337 Asia/Qostanay Qostanay/Kostanay/Kustanay
|
||||
KZ +5017+05710 Asia/Aqtobe Aqtobe/Aktobe
|
||||
KZ +4431+05016 Asia/Aqtau Mangghystau/Mankistau
|
||||
KZ +4707+05156 Asia/Atyrau Atyrau/Atirau/Gur'yev
|
||||
KZ +5113+05121 Asia/Oral West Kazakhstan
|
||||
LA +1758+10236 Asia/Vientiane
|
||||
LB +3353+03530 Asia/Beirut
|
||||
LC +1401-06100 America/St_Lucia
|
||||
LI +4709+00931 Europe/Vaduz
|
||||
LK +0656+07951 Asia/Colombo
|
||||
LR +0618-01047 Africa/Monrovia
|
||||
LS -2928+02730 Africa/Maseru
|
||||
LT +5441+02519 Europe/Vilnius
|
||||
LU +4936+00609 Europe/Luxembourg
|
||||
LV +5657+02406 Europe/Riga
|
||||
LY +3254+01311 Africa/Tripoli
|
||||
MA +3339-00735 Africa/Casablanca
|
||||
MC +4342+00723 Europe/Monaco
|
||||
MD +4700+02850 Europe/Chisinau
|
||||
ME +4226+01916 Europe/Podgorica
|
||||
MF +1804-06305 America/Marigot
|
||||
MG -1855+04731 Indian/Antananarivo
|
||||
MH +0709+17112 Pacific/Majuro Marshall Islands (most areas)
|
||||
MH +0905+16720 Pacific/Kwajalein Kwajalein
|
||||
MK +4159+02126 Europe/Skopje
|
||||
ML +1239-00800 Africa/Bamako
|
||||
MM +1647+09610 Asia/Yangon
|
||||
MN +4755+10653 Asia/Ulaanbaatar Mongolia (most areas)
|
||||
MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
|
||||
MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar
|
||||
MO +221150+1133230 Asia/Macau
|
||||
MP +1512+14545 Pacific/Saipan
|
||||
MQ +1436-06105 America/Martinique
|
||||
MR +1806-01557 Africa/Nouakchott
|
||||
MS +1643-06213 America/Montserrat
|
||||
MT +3554+01431 Europe/Malta
|
||||
MU -2010+05730 Indian/Mauritius
|
||||
MV +0410+07330 Indian/Maldives
|
||||
MW -1547+03500 Africa/Blantyre
|
||||
MX +1924-09909 America/Mexico_City Central Mexico
|
||||
MX +2105-08646 America/Cancun Quintana Roo
|
||||
MX +2058-08937 America/Merida Campeche, Yucatan
|
||||
MX +2540-10019 America/Monterrey Durango; Coahuila, Nuevo Leon, Tamaulipas (most areas)
|
||||
MX +2550-09730 America/Matamoros Coahuila, Nuevo Leon, Tamaulipas (US border)
|
||||
MX +2838-10605 America/Chihuahua Chihuahua (most areas)
|
||||
MX +3144-10629 America/Ciudad_Juarez Chihuahua (US border - west)
|
||||
MX +2934-10425 America/Ojinaga Chihuahua (US border - east)
|
||||
MX +2313-10625 America/Mazatlan Baja California Sur, Nayarit (most areas), Sinaloa
|
||||
MX +2048-10515 America/Bahia_Banderas Bahia de Banderas
|
||||
MX +2904-11058 America/Hermosillo Sonora
|
||||
MX +3232-11701 America/Tijuana Baja California
|
||||
MY +0310+10142 Asia/Kuala_Lumpur Malaysia (peninsula)
|
||||
MY +0133+11020 Asia/Kuching Sabah, Sarawak
|
||||
MZ -2558+03235 Africa/Maputo
|
||||
NA -2234+01706 Africa/Windhoek
|
||||
NC -2216+16627 Pacific/Noumea
|
||||
NE +1331+00207 Africa/Niamey
|
||||
NF -2903+16758 Pacific/Norfolk
|
||||
NG +0627+00324 Africa/Lagos
|
||||
NI +1209-08617 America/Managua
|
||||
NL +5222+00454 Europe/Amsterdam
|
||||
NO +5955+01045 Europe/Oslo
|
||||
NP +2743+08519 Asia/Kathmandu
|
||||
NR -0031+16655 Pacific/Nauru
|
||||
NU -1901-16955 Pacific/Niue
|
||||
NZ -3652+17446 Pacific/Auckland New Zealand (most areas)
|
||||
NZ -4357-17633 Pacific/Chatham Chatham Islands
|
||||
OM +2336+05835 Asia/Muscat
|
||||
PA +0858-07932 America/Panama
|
||||
PE -1203-07703 America/Lima
|
||||
PF -1732-14934 Pacific/Tahiti Society Islands
|
||||
PF -0900-13930 Pacific/Marquesas Marquesas Islands
|
||||
PF -2308-13457 Pacific/Gambier Gambier Islands
|
||||
PG -0930+14710 Pacific/Port_Moresby Papua New Guinea (most areas)
|
||||
PG -0613+15534 Pacific/Bougainville Bougainville
|
||||
PH +1435+12100 Asia/Manila
|
||||
PK +2452+06703 Asia/Karachi
|
||||
PL +5215+02100 Europe/Warsaw
|
||||
PM +4703-05620 America/Miquelon
|
||||
PN -2504-13005 Pacific/Pitcairn
|
||||
PR +182806-0660622 America/Puerto_Rico
|
||||
PS +3130+03428 Asia/Gaza Gaza Strip
|
||||
PS +313200+0350542 Asia/Hebron West Bank
|
||||
PT +3843-00908 Europe/Lisbon Portugal (mainland)
|
||||
PT +3238-01654 Atlantic/Madeira Madeira Islands
|
||||
PT +3744-02540 Atlantic/Azores Azores
|
||||
PW +0720+13429 Pacific/Palau
|
||||
PY -2516-05740 America/Asuncion
|
||||
QA +2517+05132 Asia/Qatar
|
||||
RE -2052+05528 Indian/Reunion
|
||||
RO +4426+02606 Europe/Bucharest
|
||||
RS +4450+02030 Europe/Belgrade
|
||||
RU +5443+02030 Europe/Kaliningrad MSK-01 - Kaliningrad
|
||||
RU +554521+0373704 Europe/Moscow MSK+00 - Moscow area
|
||||
# The obsolescent zone.tab format cannot represent Europe/Simferopol well.
|
||||
# Put it in RU section and list as UA. See "territorial claims" above.
|
||||
# Programs should use zone1970.tab instead; see above.
|
||||
UA +4457+03406 Europe/Simferopol Crimea
|
||||
RU +5836+04939 Europe/Kirov MSK+00 - Kirov
|
||||
RU +4844+04425 Europe/Volgograd MSK+00 - Volgograd
|
||||
RU +4621+04803 Europe/Astrakhan MSK+01 - Astrakhan
|
||||
RU +5134+04602 Europe/Saratov MSK+01 - Saratov
|
||||
RU +5420+04824 Europe/Ulyanovsk MSK+01 - Ulyanovsk
|
||||
RU +5312+05009 Europe/Samara MSK+01 - Samara, Udmurtia
|
||||
RU +5651+06036 Asia/Yekaterinburg MSK+02 - Urals
|
||||
RU +5500+07324 Asia/Omsk MSK+03 - Omsk
|
||||
RU +5502+08255 Asia/Novosibirsk MSK+04 - Novosibirsk
|
||||
RU +5322+08345 Asia/Barnaul MSK+04 - Altai
|
||||
RU +5630+08458 Asia/Tomsk MSK+04 - Tomsk
|
||||
RU +5345+08707 Asia/Novokuznetsk MSK+04 - Kemerovo
|
||||
RU +5601+09250 Asia/Krasnoyarsk MSK+04 - Krasnoyarsk area
|
||||
RU +5216+10420 Asia/Irkutsk MSK+05 - Irkutsk, Buryatia
|
||||
RU +5203+11328 Asia/Chita MSK+06 - Zabaykalsky
|
||||
RU +6200+12940 Asia/Yakutsk MSK+06 - Lena River
|
||||
RU +623923+1353314 Asia/Khandyga MSK+06 - Tomponsky, Ust-Maysky
|
||||
RU +4310+13156 Asia/Vladivostok MSK+07 - Amur River
|
||||
RU +643337+1431336 Asia/Ust-Nera MSK+07 - Oymyakonsky
|
||||
RU +5934+15048 Asia/Magadan MSK+08 - Magadan
|
||||
RU +4658+14242 Asia/Sakhalin MSK+08 - Sakhalin Island
|
||||
RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E); North Kuril Is
|
||||
RU +5301+15839 Asia/Kamchatka MSK+09 - Kamchatka
|
||||
RU +6445+17729 Asia/Anadyr MSK+09 - Bering Sea
|
||||
RW -0157+03004 Africa/Kigali
|
||||
SA +2438+04643 Asia/Riyadh
|
||||
SB -0932+16012 Pacific/Guadalcanal
|
||||
SC -0440+05528 Indian/Mahe
|
||||
SD +1536+03232 Africa/Khartoum
|
||||
SE +5920+01803 Europe/Stockholm
|
||||
SG +0117+10351 Asia/Singapore
|
||||
SH -1555-00542 Atlantic/St_Helena
|
||||
SI +4603+01431 Europe/Ljubljana
|
||||
SJ +7800+01600 Arctic/Longyearbyen
|
||||
SK +4809+01707 Europe/Bratislava
|
||||
SL +0830-01315 Africa/Freetown
|
||||
SM +4355+01228 Europe/San_Marino
|
||||
SN +1440-01726 Africa/Dakar
|
||||
SO +0204+04522 Africa/Mogadishu
|
||||
SR +0550-05510 America/Paramaribo
|
||||
SS +0451+03137 Africa/Juba
|
||||
ST +0020+00644 Africa/Sao_Tome
|
||||
SV +1342-08912 America/El_Salvador
|
||||
SX +180305-0630250 America/Lower_Princes
|
||||
SY +3330+03618 Asia/Damascus
|
||||
SZ -2618+03106 Africa/Mbabane
|
||||
TC +2128-07108 America/Grand_Turk
|
||||
TD +1207+01503 Africa/Ndjamena
|
||||
TF -492110+0701303 Indian/Kerguelen
|
||||
TG +0608+00113 Africa/Lome
|
||||
TH +1345+10031 Asia/Bangkok
|
||||
TJ +3835+06848 Asia/Dushanbe
|
||||
TK -0922-17114 Pacific/Fakaofo
|
||||
TL -0833+12535 Asia/Dili
|
||||
TM +3757+05823 Asia/Ashgabat
|
||||
TN +3648+01011 Africa/Tunis
|
||||
TO -210800-1751200 Pacific/Tongatapu
|
||||
TR +4101+02858 Europe/Istanbul
|
||||
TT +1039-06131 America/Port_of_Spain
|
||||
TV -0831+17913 Pacific/Funafuti
|
||||
TW +2503+12130 Asia/Taipei
|
||||
TZ -0648+03917 Africa/Dar_es_Salaam
|
||||
UA +5026+03031 Europe/Kyiv Ukraine (most areas)
|
||||
UG +0019+03225 Africa/Kampala
|
||||
UM +2813-17722 Pacific/Midway Midway Islands
|
||||
UM +1917+16637 Pacific/Wake Wake Island
|
||||
US +404251-0740023 America/New_York Eastern (most areas)
|
||||
US +421953-0830245 America/Detroit Eastern - MI (most areas)
|
||||
US +381515-0854534 America/Kentucky/Louisville Eastern - KY (Louisville area)
|
||||
US +364947-0845057 America/Kentucky/Monticello Eastern - KY (Wayne)
|
||||
US +394606-0860929 America/Indiana/Indianapolis Eastern - IN (most areas)
|
||||
US +384038-0873143 America/Indiana/Vincennes Eastern - IN (Da, Du, K, Mn)
|
||||
US +410305-0863611 America/Indiana/Winamac Eastern - IN (Pulaski)
|
||||
US +382232-0862041 America/Indiana/Marengo Eastern - IN (Crawford)
|
||||
US +382931-0871643 America/Indiana/Petersburg Eastern - IN (Pike)
|
||||
US +384452-0850402 America/Indiana/Vevay Eastern - IN (Switzerland)
|
||||
US +415100-0873900 America/Chicago Central (most areas)
|
||||
US +375711-0864541 America/Indiana/Tell_City Central - IN (Perry)
|
||||
US +411745-0863730 America/Indiana/Knox Central - IN (Starke)
|
||||
US +450628-0873651 America/Menominee Central - MI (Wisconsin border)
|
||||
US +470659-1011757 America/North_Dakota/Center Central - ND (Oliver)
|
||||
US +465042-1012439 America/North_Dakota/New_Salem Central - ND (Morton rural)
|
||||
US +471551-1014640 America/North_Dakota/Beulah Central - ND (Mercer)
|
||||
US +394421-1045903 America/Denver Mountain (most areas)
|
||||
US +433649-1161209 America/Boise Mountain - ID (south); OR (east)
|
||||
US +332654-1120424 America/Phoenix MST - Arizona (except Navajo)
|
||||
US +340308-1181434 America/Los_Angeles Pacific
|
||||
US +611305-1495401 America/Anchorage Alaska (most areas)
|
||||
US +581807-1342511 America/Juneau Alaska - Juneau area
|
||||
US +571035-1351807 America/Sitka Alaska - Sitka area
|
||||
US +550737-1313435 America/Metlakatla Alaska - Annette Island
|
||||
US +593249-1394338 America/Yakutat Alaska - Yakutat
|
||||
US +643004-1652423 America/Nome Alaska (west)
|
||||
US +515248-1763929 America/Adak Aleutian Islands
|
||||
US +211825-1575130 Pacific/Honolulu Hawaii
|
||||
UY -345433-0561245 America/Montevideo
|
||||
UZ +3940+06648 Asia/Samarkand Uzbekistan (west)
|
||||
UZ +4120+06918 Asia/Tashkent Uzbekistan (east)
|
||||
VA +415408+0122711 Europe/Vatican
|
||||
VC +1309-06114 America/St_Vincent
|
||||
VE +1030-06656 America/Caracas
|
||||
VG +1827-06437 America/Tortola
|
||||
VI +1821-06456 America/St_Thomas
|
||||
VN +1045+10640 Asia/Ho_Chi_Minh
|
||||
VU -1740+16825 Pacific/Efate
|
||||
WF -1318-17610 Pacific/Wallis
|
||||
WS -1350-17144 Pacific/Apia
|
||||
YE +1245+04512 Asia/Aden
|
||||
YT -1247+04514 Indian/Mayotte
|
||||
ZA -2615+02800 Africa/Johannesburg
|
||||
ZM -1525+02817 Africa/Lusaka
|
||||
ZW -1750+03103 Africa/Harare
|
||||
372
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zone1970.tab
vendored
Normal file
372
externals/nx_tzdb/tzdb_to_nx/externals/tz/tz/zone1970.tab
vendored
Normal file
@@ -0,0 +1,372 @@
|
||||
# tzdb timezone descriptions
|
||||
#
|
||||
# This file is in the public domain.
|
||||
#
|
||||
# From Paul Eggert (2018-06-27):
|
||||
# This file contains a table where each row stands for a timezone where
|
||||
# civil timestamps have agreed since 1970. Columns are separated by
|
||||
# a single tab. Lines beginning with '#' are comments. All text uses
|
||||
# UTF-8 encoding. The columns of the table are as follows:
|
||||
#
|
||||
# 1. The countries that overlap the timezone, as a comma-separated list
|
||||
# of ISO 3166 2-character country codes. See the file 'iso3166.tab'.
|
||||
# 2. Latitude and longitude of the timezone's principal location
|
||||
# in ISO 6709 sign-degrees-minutes-seconds format,
|
||||
# either ±DDMM±DDDMM or ±DDMMSS±DDDMMSS,
|
||||
# first latitude (+ is north), then longitude (+ is east).
|
||||
# 3. Timezone name used in value of TZ environment variable.
|
||||
# Please see the theory.html file for how these names are chosen.
|
||||
# If multiple timezones overlap a country, each has a row in the
|
||||
# table, with each column 1 containing the country code.
|
||||
# 4. Comments; present if and only if a country has multiple timezones.
|
||||
#
|
||||
# If a timezone covers multiple countries, the most-populous city is used,
|
||||
# and that country is listed first in column 1; any other countries
|
||||
# are listed alphabetically by country code. The table is sorted
|
||||
# first by country code, then (if possible) by an order within the
|
||||
# country that (1) makes some geographical sense, and (2) puts the
|
||||
# most populous timezones first, where that does not contradict (1).
|
||||
#
|
||||
# This table is intended as an aid for users, to help them select timezones
|
||||
# appropriate for their practical needs. It is not intended to take or
|
||||
# endorse any position on legal or territorial claims.
|
||||
#
|
||||
#country-
|
||||
#codes coordinates TZ comments
|
||||
AD +4230+00131 Europe/Andorra
|
||||
AE,OM,RE,SC,TF +2518+05518 Asia/Dubai UAE, Oman, Réunion, Seychelles, Crozet, Scattered Is
|
||||
AF +3431+06912 Asia/Kabul
|
||||
AL +4120+01950 Europe/Tirane
|
||||
AM +4011+04430 Asia/Yerevan
|
||||
AQ -6617+11031 Antarctica/Casey Casey
|
||||
AQ -6835+07758 Antarctica/Davis Davis
|
||||
AQ -6736+06253 Antarctica/Mawson Mawson
|
||||
AQ -6448-06406 Antarctica/Palmer Palmer
|
||||
AQ -6734-06808 Antarctica/Rothera Rothera
|
||||
AQ -720041+0023206 Antarctica/Troll Troll
|
||||
AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF)
|
||||
AR -3124-06411 America/Argentina/Cordoba Argentina (most areas: CB, CC, CN, ER, FM, MN, SE, SF)
|
||||
AR -2447-06525 America/Argentina/Salta Salta (SA, LP, NQ, RN)
|
||||
AR -2411-06518 America/Argentina/Jujuy Jujuy (JY)
|
||||
AR -2649-06513 America/Argentina/Tucuman Tucumán (TM)
|
||||
AR -2828-06547 America/Argentina/Catamarca Catamarca (CT); Chubut (CH)
|
||||
AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR)
|
||||
AR -3132-06831 America/Argentina/San_Juan San Juan (SJ)
|
||||
AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ)
|
||||
AR -3319-06621 America/Argentina/San_Luis San Luis (SL)
|
||||
AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC)
|
||||
AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF)
|
||||
AS,UM -1416-17042 Pacific/Pago_Pago Samoa, Midway
|
||||
AT +4813+01620 Europe/Vienna
|
||||
AU -3133+15905 Australia/Lord_Howe Lord Howe Island
|
||||
AU -5430+15857 Antarctica/Macquarie Macquarie Island
|
||||
AU -4253+14719 Australia/Hobart Tasmania
|
||||
AU -3749+14458 Australia/Melbourne Victoria
|
||||
AU -3352+15113 Australia/Sydney New South Wales (most areas)
|
||||
AU -3157+14127 Australia/Broken_Hill New South Wales (Yancowinna)
|
||||
AU -2728+15302 Australia/Brisbane Queensland (most areas)
|
||||
AU -2016+14900 Australia/Lindeman Queensland (Whitsunday Islands)
|
||||
AU -3455+13835 Australia/Adelaide South Australia
|
||||
AU -1228+13050 Australia/Darwin Northern Territory
|
||||
AU -3157+11551 Australia/Perth Western Australia (most areas)
|
||||
AU -3143+12852 Australia/Eucla Western Australia (Eucla)
|
||||
AZ +4023+04951 Asia/Baku
|
||||
BB +1306-05937 America/Barbados
|
||||
BD +2343+09025 Asia/Dhaka
|
||||
BE,LU,NL +5050+00420 Europe/Brussels
|
||||
BG +4241+02319 Europe/Sofia
|
||||
BM +3217-06446 Atlantic/Bermuda
|
||||
BO -1630-06809 America/La_Paz
|
||||
BR -0351-03225 America/Noronha Atlantic islands
|
||||
BR -0127-04829 America/Belem Pará (east); Amapá
|
||||
BR -0343-03830 America/Fortaleza Brazil (northeast: MA, PI, CE, RN, PB)
|
||||
BR -0803-03454 America/Recife Pernambuco
|
||||
BR -0712-04812 America/Araguaina Tocantins
|
||||
BR -0940-03543 America/Maceio Alagoas, Sergipe
|
||||
BR -1259-03831 America/Bahia Bahia
|
||||
BR -2332-04637 America/Sao_Paulo Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)
|
||||
BR -2027-05437 America/Campo_Grande Mato Grosso do Sul
|
||||
BR -1535-05605 America/Cuiaba Mato Grosso
|
||||
BR -0226-05452 America/Santarem Pará (west)
|
||||
BR -0846-06354 America/Porto_Velho Rondônia
|
||||
BR +0249-06040 America/Boa_Vista Roraima
|
||||
BR -0308-06001 America/Manaus Amazonas (east)
|
||||
BR -0640-06952 America/Eirunepe Amazonas (west)
|
||||
BR -0958-06748 America/Rio_Branco Acre
|
||||
BT +2728+08939 Asia/Thimphu
|
||||
BY +5354+02734 Europe/Minsk
|
||||
BZ +1730-08812 America/Belize
|
||||
CA +4734-05243 America/St_Johns Newfoundland; Labrador (southeast)
|
||||
CA +4439-06336 America/Halifax Atlantic - NS (most areas); PE
|
||||
CA +4612-05957 America/Glace_Bay Atlantic - NS (Cape Breton)
|
||||
CA +4606-06447 America/Moncton Atlantic - New Brunswick
|
||||
CA +5320-06025 America/Goose_Bay Atlantic - Labrador (most areas)
|
||||
CA,BS +4339-07923 America/Toronto Eastern - ON, QC (most areas), Bahamas
|
||||
CA +6344-06828 America/Iqaluit Eastern - NU (most areas)
|
||||
CA +4953-09709 America/Winnipeg Central - ON (west); Manitoba
|
||||
CA +744144-0944945 America/Resolute Central - NU (Resolute)
|
||||
CA +624900-0920459 America/Rankin_Inlet Central - NU (central)
|
||||
CA +5024-10439 America/Regina CST - SK (most areas)
|
||||
CA +5017-10750 America/Swift_Current CST - SK (midwest)
|
||||
CA +5333-11328 America/Edmonton Mountain - AB; BC (E); SK (W)
|
||||
CA +690650-1050310 America/Cambridge_Bay Mountain - NU (west)
|
||||
CA +6227-11421 America/Yellowknife Mountain - NT (central)
|
||||
CA +682059-1334300 America/Inuvik Mountain - NT (west)
|
||||
CA +5546-12014 America/Dawson_Creek MST - BC (Dawson Cr, Ft St John)
|
||||
CA +5848-12242 America/Fort_Nelson MST - BC (Ft Nelson)
|
||||
CA +6043-13503 America/Whitehorse MST - Yukon (east)
|
||||
CA +6404-13925 America/Dawson MST - Yukon (west)
|
||||
CA +4916-12307 America/Vancouver Pacific - BC (most areas)
|
||||
CH,DE,LI +4723+00832 Europe/Zurich Swiss time
|
||||
CI,BF,GH,GM,GN,IS,ML,MR,SH,SL,SN,TG +0519-00402 Africa/Abidjan
|
||||
CK -2114-15946 Pacific/Rarotonga
|
||||
CL -3327-07040 America/Santiago Chile (most areas)
|
||||
CL -5309-07055 America/Punta_Arenas Region of Magallanes
|
||||
CL -2709-10926 Pacific/Easter Easter Island
|
||||
CN +3114+12128 Asia/Shanghai Beijing Time
|
||||
CN,AQ +4348+08735 Asia/Urumqi Xinjiang Time, Vostok
|
||||
CO +0436-07405 America/Bogota
|
||||
CR +0956-08405 America/Costa_Rica
|
||||
CU +2308-08222 America/Havana
|
||||
CV +1455-02331 Atlantic/Cape_Verde
|
||||
CY +3510+03322 Asia/Nicosia Cyprus (most areas)
|
||||
CY +3507+03357 Asia/Famagusta Northern Cyprus
|
||||
CZ,SK +5005+01426 Europe/Prague
|
||||
DE,DK,NO,SE,SJ +5230+01322 Europe/Berlin Germany (most areas), Scandinavia
|
||||
DO +1828-06954 America/Santo_Domingo
|
||||
DZ +3647+00303 Africa/Algiers
|
||||
EC -0210-07950 America/Guayaquil Ecuador (mainland)
|
||||
EC -0054-08936 Pacific/Galapagos Galápagos Islands
|
||||
EE +5925+02445 Europe/Tallinn
|
||||
EG +3003+03115 Africa/Cairo
|
||||
EH +2709-01312 Africa/El_Aaiun
|
||||
ES +4024-00341 Europe/Madrid Spain (mainland)
|
||||
ES +3553-00519 Africa/Ceuta Ceuta, Melilla
|
||||
ES +2806-01524 Atlantic/Canary Canary Islands
|
||||
FI,AX +6010+02458 Europe/Helsinki
|
||||
FJ -1808+17825 Pacific/Fiji
|
||||
FK -5142-05751 Atlantic/Stanley
|
||||
FM +0519+16259 Pacific/Kosrae Kosrae
|
||||
FO +6201-00646 Atlantic/Faroe
|
||||
FR,MC +4852+00220 Europe/Paris
|
||||
GB,GG,IM,JE +513030-0000731 Europe/London
|
||||
GE +4143+04449 Asia/Tbilisi
|
||||
GF +0456-05220 America/Cayenne
|
||||
GI +3608-00521 Europe/Gibraltar
|
||||
GL +6411-05144 America/Nuuk Greenland (most areas)
|
||||
GL +7646-01840 America/Danmarkshavn National Park (east coast)
|
||||
GL +7029-02158 America/Scoresbysund Scoresbysund/Ittoqqortoormiit
|
||||
GL +7634-06847 America/Thule Thule/Pituffik
|
||||
GR +3758+02343 Europe/Athens
|
||||
GS -5416-03632 Atlantic/South_Georgia
|
||||
GT +1438-09031 America/Guatemala
|
||||
GU,MP +1328+14445 Pacific/Guam
|
||||
GW +1151-01535 Africa/Bissau
|
||||
GY +0648-05810 America/Guyana
|
||||
HK +2217+11409 Asia/Hong_Kong
|
||||
HN +1406-08713 America/Tegucigalpa
|
||||
HT +1832-07220 America/Port-au-Prince
|
||||
HU +4730+01905 Europe/Budapest
|
||||
ID -0610+10648 Asia/Jakarta Java, Sumatra
|
||||
ID -0002+10920 Asia/Pontianak Borneo (west, central)
|
||||
ID -0507+11924 Asia/Makassar Borneo (east, south); Sulawesi/Celebes, Bali, Nusa Tengarra; Timor (west)
|
||||
ID -0232+14042 Asia/Jayapura New Guinea (West Papua / Irian Jaya); Malukus/Moluccas
|
||||
IE +5320-00615 Europe/Dublin
|
||||
IL +314650+0351326 Asia/Jerusalem
|
||||
IN +2232+08822 Asia/Kolkata
|
||||
IO -0720+07225 Indian/Chagos
|
||||
IQ +3321+04425 Asia/Baghdad
|
||||
IR +3540+05126 Asia/Tehran
|
||||
IT,SM,VA +4154+01229 Europe/Rome
|
||||
JM +175805-0764736 America/Jamaica
|
||||
JO +3157+03556 Asia/Amman
|
||||
JP +353916+1394441 Asia/Tokyo
|
||||
KE,DJ,ER,ET,KM,MG,SO,TZ,UG,YT -0117+03649 Africa/Nairobi
|
||||
KG +4254+07436 Asia/Bishkek
|
||||
KI,MH,TV,UM,WF +0125+17300 Pacific/Tarawa Gilberts, Marshalls, Tuvalu, Wallis & Futuna, Wake
|
||||
KI -0247-17143 Pacific/Kanton Phoenix Islands
|
||||
KI +0152-15720 Pacific/Kiritimati Line Islands
|
||||
KP +3901+12545 Asia/Pyongyang
|
||||
KR +3733+12658 Asia/Seoul
|
||||
KZ +4315+07657 Asia/Almaty Kazakhstan (most areas)
|
||||
KZ +4448+06528 Asia/Qyzylorda Qyzylorda/Kyzylorda/Kzyl-Orda
|
||||
KZ +5312+06337 Asia/Qostanay Qostanay/Kostanay/Kustanay
|
||||
KZ +5017+05710 Asia/Aqtobe Aqtöbe/Aktobe
|
||||
KZ +4431+05016 Asia/Aqtau Mangghystaū/Mankistau
|
||||
KZ +4707+05156 Asia/Atyrau Atyraū/Atirau/Gur'yev
|
||||
KZ +5113+05121 Asia/Oral West Kazakhstan
|
||||
LB +3353+03530 Asia/Beirut
|
||||
LK +0656+07951 Asia/Colombo
|
||||
LR +0618-01047 Africa/Monrovia
|
||||
LT +5441+02519 Europe/Vilnius
|
||||
LV +5657+02406 Europe/Riga
|
||||
LY +3254+01311 Africa/Tripoli
|
||||
MA +3339-00735 Africa/Casablanca
|
||||
MD +4700+02850 Europe/Chisinau
|
||||
MH +0905+16720 Pacific/Kwajalein Kwajalein
|
||||
MM,CC +1647+09610 Asia/Yangon
|
||||
MN +4755+10653 Asia/Ulaanbaatar Mongolia (most areas)
|
||||
MN +4801+09139 Asia/Hovd Bayan-Ölgii, Govi-Altai, Hovd, Uvs, Zavkhan
|
||||
MN +4804+11430 Asia/Choibalsan Dornod, Sükhbaatar
|
||||
MO +221150+1133230 Asia/Macau
|
||||
MQ +1436-06105 America/Martinique
|
||||
MT +3554+01431 Europe/Malta
|
||||
MU -2010+05730 Indian/Mauritius
|
||||
MV,TF +0410+07330 Indian/Maldives Maldives, Kerguelen, St Paul I, Amsterdam I
|
||||
MX +1924-09909 America/Mexico_City Central Mexico
|
||||
MX +2105-08646 America/Cancun Quintana Roo
|
||||
MX +2058-08937 America/Merida Campeche, Yucatán
|
||||
MX +2540-10019 America/Monterrey Durango; Coahuila, Nuevo León, Tamaulipas (most areas)
|
||||
MX +2550-09730 America/Matamoros Coahuila, Nuevo León, Tamaulipas (US border)
|
||||
MX +2838-10605 America/Chihuahua Chihuahua (most areas)
|
||||
MX +3144-10629 America/Ciudad_Juarez Chihuahua (US border - west)
|
||||
MX +2934-10425 America/Ojinaga Chihuahua (US border - east)
|
||||
MX +2313-10625 America/Mazatlan Baja California Sur, Nayarit (most areas), Sinaloa
|
||||
MX +2048-10515 America/Bahia_Banderas Bahía de Banderas
|
||||
MX +2904-11058 America/Hermosillo Sonora
|
||||
MX +3232-11701 America/Tijuana Baja California
|
||||
MY,BN +0133+11020 Asia/Kuching Sabah, Sarawak, Brunei
|
||||
MZ,BI,BW,CD,MW,RW,ZM,ZW -2558+03235 Africa/Maputo Central Africa Time
|
||||
NA -2234+01706 Africa/Windhoek
|
||||
NC -2216+16627 Pacific/Noumea
|
||||
NF -2903+16758 Pacific/Norfolk
|
||||
NG,AO,BJ,CD,CF,CG,CM,GA,GQ,NE +0627+00324 Africa/Lagos West Africa Time
|
||||
NI +1209-08617 America/Managua
|
||||
NP +2743+08519 Asia/Kathmandu
|
||||
NR -0031+16655 Pacific/Nauru
|
||||
NU -1901-16955 Pacific/Niue
|
||||
NZ,AQ -3652+17446 Pacific/Auckland New Zealand time
|
||||
NZ -4357-17633 Pacific/Chatham Chatham Islands
|
||||
PA,CA,KY +0858-07932 America/Panama EST - Panama, Cayman, ON (Atikokan), NU (Coral H)
|
||||
PE -1203-07703 America/Lima
|
||||
PF -1732-14934 Pacific/Tahiti Society Islands
|
||||
PF -0900-13930 Pacific/Marquesas Marquesas Islands
|
||||
PF -2308-13457 Pacific/Gambier Gambier Islands
|
||||
PG,AQ,FM -0930+14710 Pacific/Port_Moresby Papua New Guinea (most areas), Chuuk, Yap, Dumont d'Urville
|
||||
PG -0613+15534 Pacific/Bougainville Bougainville
|
||||
PH +1435+12100 Asia/Manila
|
||||
PK +2452+06703 Asia/Karachi
|
||||
PL +5215+02100 Europe/Warsaw
|
||||
PM +4703-05620 America/Miquelon
|
||||
PN -2504-13005 Pacific/Pitcairn
|
||||
PR,AG,CA,AI,AW,BL,BQ,CW,DM,GD,GP,KN,LC,MF,MS,SX,TT,VC,VG,VI +182806-0660622 America/Puerto_Rico AST
|
||||
PS +3130+03428 Asia/Gaza Gaza Strip
|
||||
PS +313200+0350542 Asia/Hebron West Bank
|
||||
PT +3843-00908 Europe/Lisbon Portugal (mainland)
|
||||
PT +3238-01654 Atlantic/Madeira Madeira Islands
|
||||
PT +3744-02540 Atlantic/Azores Azores
|
||||
PW +0720+13429 Pacific/Palau
|
||||
PY -2516-05740 America/Asuncion
|
||||
QA,BH +2517+05132 Asia/Qatar
|
||||
RO +4426+02606 Europe/Bucharest
|
||||
RS,BA,HR,ME,MK,SI +4450+02030 Europe/Belgrade
|
||||
RU +5443+02030 Europe/Kaliningrad MSK-01 - Kaliningrad
|
||||
RU +554521+0373704 Europe/Moscow MSK+00 - Moscow area
|
||||
# Mention RU and UA alphabetically. See "territorial claims" above.
|
||||
RU,UA +4457+03406 Europe/Simferopol Crimea
|
||||
RU +5836+04939 Europe/Kirov MSK+00 - Kirov
|
||||
RU +4844+04425 Europe/Volgograd MSK+00 - Volgograd
|
||||
RU +4621+04803 Europe/Astrakhan MSK+01 - Astrakhan
|
||||
RU +5134+04602 Europe/Saratov MSK+01 - Saratov
|
||||
RU +5420+04824 Europe/Ulyanovsk MSK+01 - Ulyanovsk
|
||||
RU +5312+05009 Europe/Samara MSK+01 - Samara, Udmurtia
|
||||
RU +5651+06036 Asia/Yekaterinburg MSK+02 - Urals
|
||||
RU +5500+07324 Asia/Omsk MSK+03 - Omsk
|
||||
RU +5502+08255 Asia/Novosibirsk MSK+04 - Novosibirsk
|
||||
RU +5322+08345 Asia/Barnaul MSK+04 - Altai
|
||||
RU +5630+08458 Asia/Tomsk MSK+04 - Tomsk
|
||||
RU +5345+08707 Asia/Novokuznetsk MSK+04 - Kemerovo
|
||||
RU +5601+09250 Asia/Krasnoyarsk MSK+04 - Krasnoyarsk area
|
||||
RU +5216+10420 Asia/Irkutsk MSK+05 - Irkutsk, Buryatia
|
||||
RU +5203+11328 Asia/Chita MSK+06 - Zabaykalsky
|
||||
RU +6200+12940 Asia/Yakutsk MSK+06 - Lena River
|
||||
RU +623923+1353314 Asia/Khandyga MSK+06 - Tomponsky, Ust-Maysky
|
||||
RU +4310+13156 Asia/Vladivostok MSK+07 - Amur River
|
||||
RU +643337+1431336 Asia/Ust-Nera MSK+07 - Oymyakonsky
|
||||
RU +5934+15048 Asia/Magadan MSK+08 - Magadan
|
||||
RU +4658+14242 Asia/Sakhalin MSK+08 - Sakhalin Island
|
||||
RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E); North Kuril Is
|
||||
RU +5301+15839 Asia/Kamchatka MSK+09 - Kamchatka
|
||||
RU +6445+17729 Asia/Anadyr MSK+09 - Bering Sea
|
||||
SA,AQ,KW,YE +2438+04643 Asia/Riyadh Arabia, Syowa
|
||||
SB,FM -0932+16012 Pacific/Guadalcanal Solomons, Pohnpei
|
||||
SD +1536+03232 Africa/Khartoum
|
||||
SG,MY +0117+10351 Asia/Singapore Singapore, peninsular Malaysia
|
||||
SR +0550-05510 America/Paramaribo
|
||||
SS +0451+03137 Africa/Juba
|
||||
ST +0020+00644 Africa/Sao_Tome
|
||||
SV +1342-08912 America/El_Salvador
|
||||
SY +3330+03618 Asia/Damascus
|
||||
TC +2128-07108 America/Grand_Turk
|
||||
TD +1207+01503 Africa/Ndjamena
|
||||
TH,CX,KH,LA,VN +1345+10031 Asia/Bangkok Indochina (most areas)
|
||||
TJ +3835+06848 Asia/Dushanbe
|
||||
TK -0922-17114 Pacific/Fakaofo
|
||||
TL -0833+12535 Asia/Dili
|
||||
TM +3757+05823 Asia/Ashgabat
|
||||
TN +3648+01011 Africa/Tunis
|
||||
TO -210800-1751200 Pacific/Tongatapu
|
||||
TR +4101+02858 Europe/Istanbul
|
||||
TW +2503+12130 Asia/Taipei
|
||||
UA +5026+03031 Europe/Kyiv Ukraine (most areas)
|
||||
US +404251-0740023 America/New_York Eastern (most areas)
|
||||
US +421953-0830245 America/Detroit Eastern - MI (most areas)
|
||||
US +381515-0854534 America/Kentucky/Louisville Eastern - KY (Louisville area)
|
||||
US +364947-0845057 America/Kentucky/Monticello Eastern - KY (Wayne)
|
||||
US +394606-0860929 America/Indiana/Indianapolis Eastern - IN (most areas)
|
||||
US +384038-0873143 America/Indiana/Vincennes Eastern - IN (Da, Du, K, Mn)
|
||||
US +410305-0863611 America/Indiana/Winamac Eastern - IN (Pulaski)
|
||||
US +382232-0862041 America/Indiana/Marengo Eastern - IN (Crawford)
|
||||
US +382931-0871643 America/Indiana/Petersburg Eastern - IN (Pike)
|
||||
US +384452-0850402 America/Indiana/Vevay Eastern - IN (Switzerland)
|
||||
US +415100-0873900 America/Chicago Central (most areas)
|
||||
US +375711-0864541 America/Indiana/Tell_City Central - IN (Perry)
|
||||
US +411745-0863730 America/Indiana/Knox Central - IN (Starke)
|
||||
US +450628-0873651 America/Menominee Central - MI (Wisconsin border)
|
||||
US +470659-1011757 America/North_Dakota/Center Central - ND (Oliver)
|
||||
US +465042-1012439 America/North_Dakota/New_Salem Central - ND (Morton rural)
|
||||
US +471551-1014640 America/North_Dakota/Beulah Central - ND (Mercer)
|
||||
US +394421-1045903 America/Denver Mountain (most areas)
|
||||
US +433649-1161209 America/Boise Mountain - ID (south); OR (east)
|
||||
US,CA +332654-1120424 America/Phoenix MST - Arizona (except Navajo), Creston BC
|
||||
US +340308-1181434 America/Los_Angeles Pacific
|
||||
US +611305-1495401 America/Anchorage Alaska (most areas)
|
||||
US +581807-1342511 America/Juneau Alaska - Juneau area
|
||||
US +571035-1351807 America/Sitka Alaska - Sitka area
|
||||
US +550737-1313435 America/Metlakatla Alaska - Annette Island
|
||||
US +593249-1394338 America/Yakutat Alaska - Yakutat
|
||||
US +643004-1652423 America/Nome Alaska (west)
|
||||
US +515248-1763929 America/Adak Aleutian Islands
|
||||
US,UM +211825-1575130 Pacific/Honolulu Hawaii
|
||||
UY -345433-0561245 America/Montevideo
|
||||
UZ +3940+06648 Asia/Samarkand Uzbekistan (west)
|
||||
UZ +4120+06918 Asia/Tashkent Uzbekistan (east)
|
||||
VE +1030-06656 America/Caracas
|
||||
VN +1045+10640 Asia/Ho_Chi_Minh Vietnam (south)
|
||||
VU -1740+16825 Pacific/Efate
|
||||
WS -1350-17144 Pacific/Apia
|
||||
ZA,LS,SZ -2615+02800 Africa/Johannesburg
|
||||
#
|
||||
# The next section contains experimental tab-separated comments for
|
||||
# use by user agents like tzselect that identify continents and oceans.
|
||||
#
|
||||
# For example, the comment "#@AQ<tab>Antarctica/" means the country code
|
||||
# AQ is in the continent Antarctica regardless of the Zone name,
|
||||
# so Pacific/Auckland should be listed under Antarctica as well as
|
||||
# under the Pacific because its line's country codes include AQ.
|
||||
#
|
||||
# If more than one country code is affected each is listed separated
|
||||
# by commas, e.g., #@IS,SH<tab>Atlantic/". If a country code is in
|
||||
# more than one continent or ocean, each is listed separated by
|
||||
# commas, e.g., the second column of "#@CY,TR<tab>Asia/,Europe/".
|
||||
#
|
||||
# These experimental comments are present only for country codes where
|
||||
# the continent or ocean is not already obvious from the Zone name.
|
||||
# For example, there is no such comment for RU since it already
|
||||
# corresponds to Zone names starting with both "Europe/" and "Asia/".
|
||||
#
|
||||
#@AQ Antarctica/
|
||||
#@IS,SH Atlantic/
|
||||
#@CY,TR Asia/,Europe/
|
||||
#@SJ Arctic/
|
||||
#@CC,CX,KM,MG,YT Indian/
|
||||
11
externals/nx_tzdb/tzdb_to_nx/src/CMakeLists.txt
vendored
Normal file
11
externals/nx_tzdb/tzdb_to_nx/src/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
add_compile_options(
|
||||
-Werror=all
|
||||
-Werror=extra
|
||||
|
||||
-Werror=shadow
|
||||
)
|
||||
|
||||
include_directories(.)
|
||||
|
||||
add_subdirectory(tzdb2nx)
|
||||
add_subdirectory(tzdb)
|
||||
90
externals/nx_tzdb/tzdb_to_nx/src/tzdb/CMakeLists.txt
vendored
Normal file
90
externals/nx_tzdb/tzdb_to_nx/src/tzdb/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
find_program(GIT_PROGRAM git)
|
||||
if (NOT GIT_PROGRAM)
|
||||
message(FATAL_ERROR "git program not found")
|
||||
endif()
|
||||
|
||||
find_program(GNU_DATE date)
|
||||
if (NOT GNU_DATE)
|
||||
message(FATAL_ERROR "date program not found")
|
||||
endif()
|
||||
|
||||
set(NX_TZDB_DIR "${CMAKE_CURRENT_BINARY_DIR}/nx" CACHE PATH "Path to Switch-style time zone data")
|
||||
set(NX_ZONEINFO_DIR "${NX_TZDB_DIR}/zoneinfo")
|
||||
|
||||
set(TZDB_VERSION_FILE ${TZ_SOURCE_DIR}/NEWS)
|
||||
|
||||
if (NOT "${TZDB2NX_VERSION}" STREQUAL "")
|
||||
set(TZDB_VERSION "${TZDB2NX_VERSION}\n")
|
||||
else()
|
||||
execute_process(
|
||||
COMMAND
|
||||
${GIT_PROGRAM} log --pretty=%at -n1 NEWS
|
||||
OUTPUT_VARIABLE
|
||||
TZ_COMMIT_TIME
|
||||
WORKING_DIRECTORY
|
||||
${TZ_SOURCE_DIR}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
string(REPLACE "\n" "" TZ_COMMIT_TIME "${TZ_COMMIT_TIME}")
|
||||
|
||||
if (APPLE OR CMAKE_SYSTEM_NAME MATCHES "DragonFly|FreeBSD|NetBSD|OpenBSD")
|
||||
set(VERSION_COMMAND ${GNU_DATE} -r ${TZ_COMMIT_TIME} +%y%m%d)
|
||||
else ()
|
||||
set(VERSION_COMMAND ${GNU_DATE} +%y%m%d --date=@${TZ_COMMIT_TIME})
|
||||
endif ()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
${VERSION_COMMAND}
|
||||
OUTPUT_VARIABLE
|
||||
TZDB_VERSION
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
endif()
|
||||
|
||||
set(NX_VERSION_FILE ${NX_TZDB_DIR}/version.txt)
|
||||
file(WRITE ${NX_VERSION_FILE} "${TZDB_VERSION}")
|
||||
|
||||
add_custom_target(x80e
|
||||
DEPENDS
|
||||
tzdb2nx
|
||||
${NX_VERSION_FILE})
|
||||
|
||||
set(BINARY_LIST_TXT ${NX_TZDB_DIR}/binaryList.txt)
|
||||
add_custom_command(
|
||||
OUTPUT
|
||||
${BINARY_LIST_TXT}
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/generate_binary_list_txt.cmake ${BINARY_LIST_TXT} ${PROJECT_SOURCE_DIR}/CMakeModules/list_directory.cmake
|
||||
WORKING_DIRECTORY
|
||||
${NX_ZONEINFO_DIR})
|
||||
|
||||
add_custom_target(time_zone_binary_list
|
||||
DEPENDS ${BINARY_LIST_TXT})
|
||||
add_dependencies(x80e time_zone_binary_list)
|
||||
|
||||
set(TZ_DATA_LIST "")
|
||||
|
||||
file(STRINGS "${TZIF_LIST_FILE}" TZ_FILES)
|
||||
foreach(FILE ${TZ_FILES})
|
||||
file(RELATIVE_PATH TARG "${TZ_ZONEINFO_DIR}" "${FILE}")
|
||||
get_filename_component(TARG_PATH "${NX_ZONEINFO_DIR}/${TARG}" DIRECTORY)
|
||||
string(REGEX REPLACE "\/" "_" TARG_SANITIZED "${TARG}")
|
||||
set(NX_TZ_TARGET ${NX_ZONEINFO_DIR}/${TARG})
|
||||
add_custom_command(
|
||||
OUTPUT
|
||||
${NX_TZ_TARGET}
|
||||
COMMAND
|
||||
mkdir -p ${TARG_PATH}
|
||||
COMMAND
|
||||
${TZDB2NX_PATH} ${FILE} ${NX_ZONEINFO_DIR}/${TARG}
|
||||
DEPENDS
|
||||
tzdb2nx)
|
||||
|
||||
list(APPEND TZ_DATA_LIST ${NX_TZ_TARGET})
|
||||
endforeach()
|
||||
|
||||
add_custom_target(time_zone_data
|
||||
DEPENDS ${TZ_DATA_LIST})
|
||||
|
||||
add_dependencies(x80e time_zone_data)
|
||||
add_dependencies(time_zone_binary_list time_zone_data)
|
||||
52
externals/nx_tzdb/tzdb_to_nx/src/tzdb/generate_binary_list_txt.cmake
vendored
Normal file
52
externals/nx_tzdb/tzdb_to_nx/src/tzdb/generate_binary_list_txt.cmake
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
set(BINARY_LIST_TXT ${CMAKE_ARGV3})
|
||||
set(LIST_DIR_CMAKE ${CMAKE_ARGV4})
|
||||
|
||||
# Fill text file with zone names
|
||||
# Issue: Hyphens/underscores are not handled the same way Nintendo handles them
|
||||
function(get_files_nx TARG SUB_DIR)
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -P ${LIST_DIR_CMAKE} false OFF
|
||||
WORKING_DIRECTORY
|
||||
${TARG}
|
||||
OUTPUT_VARIABLE
|
||||
FILE_LIST
|
||||
)
|
||||
list(SORT FILE_LIST)
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -P ${LIST_DIR_CMAKE} true OFF
|
||||
WORKING_DIRECTORY
|
||||
${TARG}
|
||||
OUTPUT_VARIABLE
|
||||
DIR_LIST
|
||||
)
|
||||
|
||||
foreach(FILE ${FILE_LIST})
|
||||
if(FILE STREQUAL "\n")
|
||||
continue()
|
||||
endif()
|
||||
list(REMOVE_ITEM DIR_LIST FILE)
|
||||
if (SUB_DIR)
|
||||
file(APPEND ${BINARY_LIST_TXT} "${SUB_DIR}/${FILE}\r\n")
|
||||
else()
|
||||
file(APPEND ${BINARY_LIST_TXT} "${FILE}\r\n")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
list(SORT DIR_LIST)
|
||||
|
||||
foreach(DIR ${DIR_LIST})
|
||||
if (NOT DIR OR DIR STREQUAL "\n")
|
||||
continue()
|
||||
endif()
|
||||
if (SUB_DIR)
|
||||
get_files_nx(${TARG}/${DIR} ${SUB_DIR}/${DIR})
|
||||
else()
|
||||
get_files_nx(${TARG}/${DIR} ${DIR})
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
get_files_nx(${CMAKE_SOURCE_DIR} "")
|
||||
|
||||
6
externals/nx_tzdb/tzdb_to_nx/src/tzdb2nx/CMakeLists.txt
vendored
Normal file
6
externals/nx_tzdb/tzdb_to_nx/src/tzdb2nx/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
add_executable(tzdb2nx
|
||||
main.cpp
|
||||
tzif.cpp
|
||||
tzif.h)
|
||||
|
||||
set(TZDB2NX_PATH "$<TARGET_FILE:tzdb2nx>" CACHE PATH "Path to tzdb2nx path")
|
||||
158
externals/nx_tzdb/tzdb_to_nx/src/tzdb2nx/main.cpp
vendored
Normal file
158
externals/nx_tzdb/tzdb_to_nx/src/tzdb2nx/main.cpp
vendored
Normal file
@@ -0,0 +1,158 @@
|
||||
#include "tzif.h"
|
||||
#include <array>
|
||||
#include <cerrno>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <fcntl.h>
|
||||
#include <getopt.h>
|
||||
#include <poll.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
constexpr std::size_t ten_megabytes{(1 << 20) * 10};
|
||||
|
||||
static void ShortHelp(const char *argv0) {
|
||||
std::fprintf(stderr, "Usage: %s [INFILE] [OUTFILE]\n", argv0);
|
||||
}
|
||||
|
||||
static void PrintArg(const char *short_arg, const char *long_arg,
|
||||
const char *text) {
|
||||
std::fprintf(stderr, "%5s, %-20s %s\n", short_arg, long_arg, text);
|
||||
}
|
||||
|
||||
static void PrintHelp(const char *argv0) {
|
||||
ShortHelp(argv0);
|
||||
std::fprintf(stderr,
|
||||
"Converts a TZif file INFILE from the RFC8536 format to a "
|
||||
"Nintendo Switch compatible file OUTFILE.\nWith no arguments, "
|
||||
"tzdb2nx can read and write from stdin/stdout, "
|
||||
"respectively.\nGiving no arguments without input will print "
|
||||
"usage information and exit the program.\n\nArguments:\n");
|
||||
PrintArg("-h", "--help", "Print this help text and exit");
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
int f{STDIN_FILENO};
|
||||
const char *filename{"(stdin)"};
|
||||
std::size_t filesize{ten_megabytes};
|
||||
|
||||
const char *optstring = "h";
|
||||
int c;
|
||||
const struct option longopts[] = {
|
||||
{
|
||||
"help",
|
||||
no_argument,
|
||||
nullptr,
|
||||
'h',
|
||||
},
|
||||
{
|
||||
nullptr,
|
||||
0,
|
||||
nullptr,
|
||||
0,
|
||||
},
|
||||
};
|
||||
|
||||
while ((c = getopt_long(argc, argv, optstring, longopts, nullptr)) != -1) {
|
||||
switch (c) {
|
||||
case 'h':
|
||||
PrintHelp(argv[0]);
|
||||
return -1;
|
||||
case '?':
|
||||
ShortHelp(argv[0]);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (argc > 1) {
|
||||
filename = argv[1];
|
||||
f = open(filename, O_RDONLY);
|
||||
|
||||
if (f == -1) {
|
||||
const int err = errno;
|
||||
std::fprintf(stderr, "%s: %s\n", filename, std::strerror(err));
|
||||
return err;
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
fstat(f, &statbuf);
|
||||
|
||||
filesize = statbuf.st_size;
|
||||
} else {
|
||||
struct pollfd fds {
|
||||
f, POLLIN, 0,
|
||||
};
|
||||
|
||||
const int result = poll(&fds, 1, 0);
|
||||
if (result == 0) {
|
||||
std::fprintf(stderr, "%s: No input\n", filename);
|
||||
ShortHelp(argv[0]);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
u_int8_t *buf = new u_int8_t[filesize];
|
||||
|
||||
filesize = read(f, buf, filesize);
|
||||
if (filesize == static_cast<std::size_t>(-1)) {
|
||||
const int err = errno;
|
||||
std::fprintf(stderr, "%s: %s\n", filename, std::strerror(err));
|
||||
return err;
|
||||
}
|
||||
int result = close(f);
|
||||
if (result == -1) {
|
||||
const int err = errno;
|
||||
std::fprintf(stderr, "%s: %s\n", filename, std::strerror(err));
|
||||
return err;
|
||||
}
|
||||
|
||||
if (filesize < 4) {
|
||||
std::fprintf(stderr, "%s: Too small\n", filename);
|
||||
return -1;
|
||||
}
|
||||
if (std::strncmp(reinterpret_cast<const char *>(buf), "TZif", 4) != 0) {
|
||||
std::fprintf(stderr, "%s: Bad magic number\n", filename);
|
||||
return -1;
|
||||
}
|
||||
|
||||
const std::unique_ptr<Tzif::Data> tzif_data = Tzif::ReadData(buf, filesize);
|
||||
if (tzif_data == nullptr) {
|
||||
std::fprintf(stderr, "%s: Error occured while reading data\n", filename);
|
||||
return -1;
|
||||
}
|
||||
|
||||
delete[] buf;
|
||||
|
||||
std::vector<u_int8_t> output_buffer;
|
||||
tzif_data->ReformatNintendo(output_buffer);
|
||||
|
||||
filename = "(stdout)";
|
||||
f = STDOUT_FILENO;
|
||||
if (argc > 2) {
|
||||
filename = argv[2];
|
||||
f = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0664);
|
||||
|
||||
if (f == -1) {
|
||||
const int err = errno;
|
||||
std::fprintf(stderr, "%s: %s\n", filename, std::strerror(err));
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
result = write(f, output_buffer.data(), output_buffer.size());
|
||||
if (result == -1) {
|
||||
const int err = errno;
|
||||
std::fprintf(stderr, "%s: %s\n", filename, std::strerror(err));
|
||||
return err;
|
||||
}
|
||||
|
||||
result = close(f);
|
||||
if (result == -1) {
|
||||
const int err = errno;
|
||||
std::fprintf(stderr, "%s: %s\n", filename, std::strerror(err));
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
146
externals/nx_tzdb/tzdb_to_nx/src/tzdb2nx/tzif.cpp
vendored
Normal file
146
externals/nx_tzdb/tzdb_to_nx/src/tzdb2nx/tzif.cpp
vendored
Normal file
@@ -0,0 +1,146 @@
|
||||
#include "tzif.h"
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <memory>
|
||||
#include <sys/types.h>
|
||||
|
||||
namespace Tzif {
|
||||
|
||||
static std::size_t SkipToVersion2(const u_int8_t *data, std::size_t size) {
|
||||
char magic[5];
|
||||
const u_int8_t *p{data};
|
||||
|
||||
std::memcpy(magic, data, 4);
|
||||
magic[4] = '\0';
|
||||
|
||||
if (std::strcmp(magic, "TZif") != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
do {
|
||||
p++;
|
||||
if (p >= data + size) {
|
||||
return -1;
|
||||
}
|
||||
} while (std::strncmp(reinterpret_cast<const char *>(p), "TZif", 4) != 0);
|
||||
|
||||
return p - data;
|
||||
}
|
||||
|
||||
template <typename Type> constexpr static void SwapEndianess(Type *value) {
|
||||
u_int8_t *data = reinterpret_cast<u_int8_t *>(value);
|
||||
|
||||
union {
|
||||
u_int8_t data[sizeof(Type)];
|
||||
Type value;
|
||||
} temp;
|
||||
|
||||
for (u_int32_t i = 0; i < sizeof(Type); i++) {
|
||||
u_int32_t alt_index = sizeof(Type) - i - 1;
|
||||
temp.data[alt_index] = data[i];
|
||||
}
|
||||
|
||||
*value = temp.value;
|
||||
}
|
||||
|
||||
static void FlipHeader(Header &header) {
|
||||
SwapEndianess(&header.isutcnt);
|
||||
SwapEndianess(&header.isstdcnt);
|
||||
SwapEndianess(&header.leapcnt);
|
||||
SwapEndianess(&header.timecnt);
|
||||
SwapEndianess(&header.typecnt);
|
||||
SwapEndianess(&header.charcnt);
|
||||
}
|
||||
|
||||
std::unique_ptr<DataImpl> ReadData(const u_int8_t *data, std::size_t size) {
|
||||
const std::size_t v2_offset = SkipToVersion2(data, size);
|
||||
if (v2_offset == static_cast<std::size_t>(-1)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const u_int8_t *p = data + v2_offset;
|
||||
|
||||
Header header;
|
||||
std::memcpy(&header, p, sizeof(header));
|
||||
p += sizeof(header);
|
||||
|
||||
FlipHeader(header);
|
||||
|
||||
const std::size_t data_block_length =
|
||||
header.timecnt * sizeof(int64_t) + header.timecnt * sizeof(u_int8_t) +
|
||||
header.typecnt * sizeof(TimeTypeRecord) +
|
||||
header.charcnt * sizeof(int8_t) + header.isstdcnt * sizeof(u_int8_t) +
|
||||
header.isutcnt * sizeof(u_int8_t);
|
||||
|
||||
if (v2_offset + data_block_length + sizeof(Header) > size) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::unique_ptr<DataImpl> impl = std::make_unique<DataImpl>();
|
||||
impl->header = header;
|
||||
|
||||
const auto copy =
|
||||
[]<typename Type>(std::unique_ptr<Type[]> &array, int length,
|
||||
const u_int8_t *const &ptr) -> const u_int8_t * {
|
||||
const std::size_t region_length = length * sizeof(Type);
|
||||
array = std::make_unique<Type[]>(length);
|
||||
std::memcpy(array.get(), ptr, region_length);
|
||||
return ptr + region_length;
|
||||
};
|
||||
|
||||
p = copy(impl->transition_times, header.timecnt, p);
|
||||
p = copy(impl->transition_types, header.timecnt, p);
|
||||
p = copy(impl->local_time_type_records, header.typecnt, p);
|
||||
p = copy(impl->time_zone_designations, header.charcnt, p);
|
||||
p = copy(impl->standard_indicators, header.isstdcnt, p);
|
||||
p = copy(impl->ut_indicators, header.isutcnt, p);
|
||||
|
||||
const std::size_t footer_string_length = data + size - p - 2;
|
||||
p++;
|
||||
|
||||
if (p + footer_string_length > data + size ||
|
||||
p + footer_string_length < data) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
impl->footer.tz_string = std::make_unique<char[]>(footer_string_length);
|
||||
std::memcpy(impl->footer.tz_string.get(), p, footer_string_length);
|
||||
impl->footer.footer_string_length = footer_string_length;
|
||||
|
||||
return impl;
|
||||
}
|
||||
|
||||
static void PushToBuffer(std::vector<u_int8_t> &buffer, const void *data,
|
||||
std::size_t size) {
|
||||
const u_int8_t *p{reinterpret_cast<const u_int8_t *>(data)};
|
||||
for (std::size_t i = 0; i < size; i++) {
|
||||
buffer.push_back(*p);
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
||||
void DataImpl::ReformatNintendo(std::vector<u_int8_t> &buffer) const {
|
||||
buffer.clear();
|
||||
|
||||
Header header_copy{header};
|
||||
header_copy.isstdcnt = 0;
|
||||
header_copy.isutcnt = 0;
|
||||
FlipHeader(header_copy);
|
||||
|
||||
PushToBuffer(buffer, &header_copy, sizeof(Header));
|
||||
PushToBuffer(buffer, transition_times.get(),
|
||||
header.timecnt * sizeof(int64_t));
|
||||
PushToBuffer(buffer, transition_types.get(),
|
||||
header.timecnt * sizeof(u_int8_t));
|
||||
PushToBuffer(buffer, local_time_type_records.get(),
|
||||
header.typecnt * sizeof(TimeTypeRecord));
|
||||
PushToBuffer(buffer, time_zone_designations.get(),
|
||||
header.charcnt * sizeof(int8_t));
|
||||
// omit standard_indicators
|
||||
// omit ut_indicators
|
||||
PushToBuffer(buffer, &footer.nl_a, 1);
|
||||
PushToBuffer(buffer, footer.tz_string.get(), footer.footer_string_length);
|
||||
PushToBuffer(buffer, &footer.nl_b, 1);
|
||||
}
|
||||
|
||||
} // namespace Tzif
|
||||
72
externals/nx_tzdb/tzdb_to_nx/src/tzdb2nx/tzif.h
vendored
Normal file
72
externals/nx_tzdb/tzdb_to_nx/src/tzdb2nx/tzif.h
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <memory>
|
||||
#include <sys/types.h>
|
||||
#include <vector>
|
||||
|
||||
namespace Tzif {
|
||||
|
||||
typedef struct {
|
||||
char magic[4];
|
||||
u_int8_t version;
|
||||
u_int8_t reserved[15];
|
||||
u_int32_t isutcnt;
|
||||
u_int32_t isstdcnt;
|
||||
u_int32_t leapcnt;
|
||||
u_int32_t timecnt;
|
||||
u_int32_t typecnt;
|
||||
u_int32_t charcnt;
|
||||
} Header;
|
||||
static_assert(sizeof(Header) == 0x2c);
|
||||
|
||||
class Footer {
|
||||
public:
|
||||
explicit Footer() = default;
|
||||
~Footer() = default;
|
||||
|
||||
const char nl_a{'\n'};
|
||||
std::unique_ptr<char[]> tz_string;
|
||||
const char nl_b{'\n'};
|
||||
|
||||
std::size_t footer_string_length;
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
typedef struct {
|
||||
u_int32_t utoff;
|
||||
u_int8_t dst;
|
||||
u_int8_t idx;
|
||||
} TimeTypeRecord;
|
||||
#pragma pack(pop)
|
||||
static_assert(sizeof(TimeTypeRecord) == 0x6);
|
||||
|
||||
class Data {
|
||||
public:
|
||||
explicit Data() = default;
|
||||
virtual ~Data() = default;
|
||||
|
||||
virtual void ReformatNintendo(std::vector<u_int8_t> &buffer) const = 0;
|
||||
};
|
||||
|
||||
class DataImpl : public Data {
|
||||
public:
|
||||
explicit DataImpl() = default;
|
||||
~DataImpl() override = default;
|
||||
|
||||
void ReformatNintendo(std::vector<u_int8_t> &buffer) const override;
|
||||
|
||||
Header header;
|
||||
Footer footer;
|
||||
|
||||
std::unique_ptr<int64_t[]> transition_times;
|
||||
std::unique_ptr<u_int8_t[]> transition_types;
|
||||
std::unique_ptr<TimeTypeRecord[]> local_time_type_records;
|
||||
std::unique_ptr<int8_t[]> time_zone_designations;
|
||||
std::unique_ptr<u_int8_t[]> standard_indicators;
|
||||
std::unique_ptr<u_int8_t[]> ut_indicators;
|
||||
};
|
||||
|
||||
std::unique_ptr<DataImpl> ReadData(const u_int8_t *data, std::size_t size);
|
||||
|
||||
} // namespace Tzif
|
||||
Reference in New Issue
Block a user