Welcome to 2014c

Changes affecting code

     zic now generates transitions for minimum time values, eliminating
     guesswork when handling low-valued time stamps.  (Thanks to Arthur
     David Olson.)

     Port to Cygwin sans glibc.  (Thanks to Arthur David Olson.)

   Changes affecting commentary and documentation

     Remove now-confusing comment about Jordan.  (Thanks to Oleksii
     Nochovnyi.)
This commit is contained in:
christos 2014-05-13 16:33:56 +00:00
parent 02288fa1cd
commit 4df4d972d3
10 changed files with 327 additions and 155 deletions

View File

@ -6,7 +6,7 @@
PACKAGE= tzcode
# Version numbers of the code and data distributions.
VERSION= 2013i
VERSION= 2014c
# Email address for bug reports.
BUGEMAIL= tz@iana.org
@ -137,7 +137,7 @@ GCC_DEBUG_FLAGS = -Dlint -g3 -O3 -fno-common -fstrict-aliasing \
-Wbad-function-cast -Wcast-align -Wcast-qual \
-Wformat=2 -Winit-self \
-Wmissing-declarations -Wmissing-noreturn -Wmissing-prototypes \
-Wnested-externs \
-Wnested-externs -Wno-address -Wno-cast-qual \
-Wno-format-nonliteral -Wno-sign-compare -Wno-sign-conversion \
-Wno-type-limits \
-Wno-unused-parameter -Woverlength-strings -Wpointer-arith \
@ -247,14 +247,13 @@ AWK= awk
# is typically nicer if it works.
KSHELL= /bin/bash
# The path where SGML DTDs are kept.
# The default is appropriate for Ubuntu 12.10.
# The path where SGML DTDs are kept and the catalog file(s) to use when
# validating. The default is appropriate for Ubuntu 13.10.
SGML_TOPDIR= /usr
SGML_DTDDIR= $(SGML_TOPDIR)/share/xml/w3c-sgml-lib/schema/dtd
SGML_SEARCH_PATH= $(SGML_DTDDIR)/REC-html401-19991224
# The catalog file(s) to use when validating.
SGML_CATALOG_FILES= HTML4.cat
SGML_CATALOG_FILES= \
$(SGML_TOPDIR)/share/doc/w3-recs/html/www.w3.org/TR/1999/REC-html401-19991224/HTML4.cat
# The name, arguments and environment of a program to validate your web pages.
# See <http://www.jclark.com/sp/> for a validator, and
@ -445,7 +444,7 @@ check_web: $(WEB_PAGES)
clean_misc:
rm -f core *.o *.out \
date tzselect version.h zdump zic yearistype
date tzselect version.h zdump zic yearistype libtz.a
clean: clean_misc
rm -fr tzpublic

View File

@ -1,5 +1,138 @@
News for the tz database
Release 2014c - 2014-05-13 07:44:13 -0700
Changes affecting near-future time stamps
Egypt observes DST starting May 15. (Thanks to Ahmad El-Dardiry.)
Details have not been announced, except that DST will not be observed
during Ramadan. Guess that DST will stop during the same Ramadan dates as
Morocco, and that Egypt's future spring and fall transitions will be the
same as 2010 when it last observed DST, namely April's last Friday at
00:00 to September's last Thursday at 23:00 standard time. Also, guess
that Ramadan transitions will be at 00:00 standard time.
Changes affecting code
zic now generates transitions for minimum time values, eliminating guesswork
when handling low-valued time stamps. (Thanks to Arthur David Olson.)
Port to Cygwin sans glibc. (Thanks to Arthur David Olson.)
Changes affecting commentary and documentation
Remove now-confusing comment about Jordan. (Thanks to Oleksii Nochovnyi.)
Release 2014b - 2014-03-24 21:28:50 -0700
Changes affecting near-future time stamps
Crimea switches to Moscow time on 2014-03-30 at 02:00 local time.
(Thanks to Alexander Krivenyshev.) Move its zone.tab entry from UA to RU.
New entry for Troll station, Antarctica. (Thanks to Paul-Inge Flakstad and
Bengt-Inge Larsson.) This is currently an approximation; a better version
will require the zic and localtime fixes mentioned below, and the plan is
to wait for a while until at least the zic fixes propagate.
Changes affecting code
'zic' and 'localtime' no longer reject locations needing four transitions
per year for the forseeable future. (Thanks to Andrew Main (Zefram).)
Also, 'zic' avoids some unlikely failures due to integer overflow.
Changes affecting build procedure
'make check' now detects Rule lines defined but never used.
The NZAQ rules, an instance of this problem, have been removed.
Changes affecting commentary and documentation
Fix Tuesday/Thursday typo in description of time in Israel.
(Thanks to Bert Katz via Pavel Kharitonov and Mike Frysinger.)
Microsoft Windows 8.1 doesn't support tz database names. (Thanks
to Donald MacQueen.) Instead, the Microsoft Windows Store app
library supports them.
Add comments about Johnston Island time in the 1960s.
(Thanks to Lyle McElhaney.)
Morocco's 2014 DST start will be as predicted.
(Thanks to Sebastien Willemijns.)
Release 2014a - 2014-03-07 23:30:29 -0800
Changes affecting near-future time stamps
Turkey begins DST on 2014-03-31, not 03-30. (Thanks to Faruk Pasin for
the heads-up, and to Tim Parenti for simplifying the update.)
Changes affecting past time stamps
Fiji ended DST on 2014-01-19 at 02:00, not the previously-scheduled 03:00.
(Thanks to Steffen Thorsen.)
Ukraine switched from Moscow to Eastern European time on 1990-07-01
(not 1992-01-01), and observed DST during the entire next winter.
(Thanks to Vladimir in Moscow via Alois Treindl.)
In 1988 Israel observed DST from 04-10 to 09-04, not 04-09 to 09-03.
(Thanks to Avigdor Finkelstein.)
Changes affecting code
A uninitialized-storage bug in 'localtime' has been fixed.
(Thanks to Logan Chien.)
Changes affecting the build procedure
The settings for 'make check_web' now default to Ubuntu 13.10.
Changes affecting commentary and documentation
The boundary of the US Pacific time zone is given more accurately.
(Thanks to Alan Mintz.)
Chile's 2014 DST will be as predicted. (Thanks to Jose Miguel Garrido.)
Paraguay's 2014 DST will be as predicted. (Thanks to Carlos Raul Perasso.)
Better descriptions of countries with same time zone history as
Trinidad and Tobago since 1970. (Thanks to Alan Barrett for suggestion.)
Several changes affect tz-link.htm, the main web page.
Mention Time.is (thanks to Even Scharning) and WX-now (thanks to
David Braverman).
Mention xCal (Internet RFC 6321) and jCal.
Microsoft has some support for tz database names.
CLDR data is available in both XML and JSON form.
Mention Maggiolo's map of solar vs standard time.
(Thanks to Arthur David Olson.)
Mention TZ4Net. (Thanks to Matt Johnson.)
Mention the timezone-olson Haskell package.
Mention zeitverschiebung.net. (Thanks to Martin Jaeger.)
Remove moribund links to daylight-savings-time.info and to
Simple Timer + Clocks.
Update two links. (Thanks to Oscar van Vlijmen.)
Fix some formatting glitches, e.g., remove random newlines from
abbr elements' title attributes.
Release 2013i - 2013-12-17 07:25:23 -0800
Changes affecting near-future time stamps:
@ -29,6 +162,7 @@ Release 2013i - 2013-12-17 07:25:23 -0800
tz-link.htm now mentions Noda Time. (Thanks to Matt Johnson.)
Release 2013h - 2013-10-25 15:32:32 -0700
Changes affecting current and future time stamps:

View File

@ -1,4 +1,4 @@
# $NetBSD: checktab.awk,v 1.6 2013/09/20 19:06:54 christos Exp $
# $NetBSD: checktab.awk,v 1.7 2014/05/13 16:33:56 christos Exp $
# Check tz tables for consistency.
@ -117,10 +117,14 @@ BEGIN {
FS = " "
}
$1 ~ /^#/ { next }
{
tz = ""
if ($1 == "Zone") tz = $2
if ($1 == "Link") {
tz = rules = ""
if ($1 == "Zone") {
tz = $2
ruleUsed[$4] = 1
} else if ($1 == "Link") {
# Ignore Link commands if source and destination basenames
# are identical, e.g. Europe/Istanbul versus Asia/Istanbul.
src = $2
@ -128,6 +132,10 @@ BEGIN {
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
} else {
ruleUsed[$2] = 1
}
if (tz && tz ~ /\//) {
if (!tztab[tz]) {
@ -140,6 +148,12 @@ BEGIN {
}
END {
for (tz in ruleDefined) {
if (!ruleUsed[tz]) {
printf "%s: Rule never used\n", tz
status = 1
}
}
for (tz in tz2cc) {
if (!zoneSeen[tz]) {
printf "%s:%d: no Zone table for `%s'\n", \

View File

@ -1,4 +1,4 @@
/* $NetBSD: localtime.c,v 1.81 2013/12/26 18:34:28 christos Exp $ */
/* $NetBSD: localtime.c,v 1.82 2014/05/13 16:33:56 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
@ -10,7 +10,7 @@
#if 0
static char elsieid[] = "@(#)localtime.c 8.17";
#else
__RCSID("$NetBSD: localtime.c,v 1.81 2013/12/26 18:34:28 christos Exp $");
__RCSID("$NetBSD: localtime.c,v 1.82 2014/05/13 16:33:56 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@ -388,7 +388,7 @@ tzload(timezone_t sp, const char *name, const int doextend)
} u_t;
u_t * up;
up = calloc(1, sizeof *up);
up = malloc(sizeof *up);
if (up == NULL)
return -1;
@ -1062,6 +1062,7 @@ tzparse(timezone_t sp, const char *name, const int lastditch)
sp->ttis[1].tt_gmtoff = -stdoffset;
sp->ttis[1].tt_isdst = 0;
sp->ttis[1].tt_abbrind = 0;
sp->defaulttype = 0;
timecnt = 0;
janfirst = 0;
sp->timecnt = 0;
@ -1189,6 +1190,7 @@ tzparse(timezone_t sp, const char *name, const int lastditch)
sp->ttis[1].tt_isdst = TRUE;
sp->ttis[1].tt_abbrind = (int)(stdlen + 1);
sp->typecnt = 2;
sp->defaulttype = 0;
}
} else {
dstlen = 0;
@ -1198,6 +1200,7 @@ tzparse(timezone_t sp, const char *name, const int lastditch)
sp->ttis[0].tt_gmtoff = -stdoffset;
sp->ttis[0].tt_isdst = 0;
sp->ttis[0].tt_abbrind = 0;
sp->defaulttype = 0;
}
sp->charcnt = (int)(stdlen + 1);
if (dstlen != 0)
@ -1225,7 +1228,7 @@ gmtload(timezone_t sp)
timezone_t
tzalloc(const char *name)
{
timezone_t sp = calloc(1, sizeof *sp);
timezone_t sp = malloc(sizeof *sp);
if (sp == NULL)
return NULL;
if (tzload(sp, name, TRUE) != 0) {
@ -1251,7 +1254,7 @@ tzsetwall_unlocked(void)
if (lclptr == NULL) {
int saveerrno = errno;
lclptr = calloc(1, sizeof *lclptr);
lclptr = malloc(sizeof *lclptr);
errno = saveerrno;
if (lclptr == NULL) {
settzname(); /* all we can do */
@ -1304,7 +1307,7 @@ tzset_unlocked(void)
if (lclptr == NULL) {
int saveerrno = errno;
lclptr = calloc(1, sizeof *lclptr);
lclptr = malloc(sizeof *lclptr);
errno = saveerrno;
if (lclptr == NULL) {
settzname(); /* all we can do */
@ -1469,7 +1472,7 @@ gmtsub(const timezone_t sp, const time_t *const timep,
int saveerrno;
gmt_is_set = TRUE;
saveerrno = errno;
gmtptr = calloc(1, sizeof *gmtptr);
gmtptr = malloc(sizeof *gmtptr);
errno = saveerrno;
if (gmtptr != NULL)
gmtload(gmtptr);
@ -1482,13 +1485,8 @@ gmtsub(const timezone_t sp, const time_t *const timep,
** "UT+xxxx" or "UT-xxxx" if offset is non-zero,
** but this is no time for a treasure hunt.
*/
if (offset != 0)
tmp->TM_ZONE = (__aconst char *)__UNCONST(wildabbr);
else {
if (gmtptr == NULL)
tmp->TM_ZONE = (__aconst char *)__UNCONST(gmt);
else tmp->TM_ZONE = gmtptr->chars;
}
tmp->TM_ZONE = offset ? __UNCONST(wildabbr) : gmtptr ? gmtptr->chars :
__UNCONST(gmt);
#endif /* defined TM_ZONE */
return result;
}
@ -2075,17 +2073,15 @@ time1(const timezone_t sp, struct tm *const tmp, subfun_t funcp,
if (tmp->tm_isdst > 1)
tmp->tm_isdst = 1;
t = time2(sp, tmp, funcp, offset, &okay);
#ifdef PCTS
/*
** PCTS code courtesy Grant Sullivan.
*/
if (okay)
return t;
if (tmp->tm_isdst < 0)
#ifdef PCTS
/*
** POSIX Conformance Test Suite code courtesy Grant Sullivan.
*/
tmp->tm_isdst = 0; /* reset to std and try again */
#endif /* defined PCTS */
#ifndef PCTS
if (okay || tmp->tm_isdst < 0)
#else
return t;
#endif /* !defined PCTS */
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: private.h,v 1.32 2013/12/26 18:34:28 christos Exp $ */
/* $NetBSD: private.h,v 1.33 2014/05/13 16:33:56 christos Exp $ */
#ifndef PRIVATE_H
#define PRIVATE_H
@ -132,8 +132,9 @@
*/
#ifndef HAVE_STDINT_H
#define HAVE_STDINT_H \
(199901 <= __STDC_VERSION__ || \
2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
(199901 <= __STDC_VERSION__ \
|| 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
|| __CYGWIN__)
#endif /* !defined HAVE_STDINT_H */
#if HAVE_STDINT_H
@ -217,6 +218,10 @@ typedef unsigned long uintmax_t;
#define INT32_MIN (-1 - INT32_MAX)
#endif /* !defined INT32_MIN */
#ifndef SIZE_MAX
#define SIZE_MAX ((size_t) -1)
#endif
#if 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
# define ATTRIBUTE_CONST __attribute__ ((__const__))
# define ATTRIBUTE_PURE __attribute__ ((__pure__))

View File

@ -8,7 +8,7 @@
<meta http-equiv="Content-type" content='text/html; charset="US-ASCII"'>
<meta name="DC.Creator" content="Eggert, Paul">
<meta name="DC.Contributor" content="Olson, Arthur David">
<meta name="DC.Date" content="2013-10-21">
<meta name="DC.Date" content="2014-03-10">
<meta name="DC.Description"
content="Sources of information about time zones and daylight saving time">
<meta name="DC.Identifier"
@ -49,6 +49,7 @@ title="Berkeley Software Distribution">BSD</abbr></a>,
<a href="http://cygwin.com/">Cygwin</a>,
<a href="http://www.delorie.com/djgpp/"><abbr
title="DJ's GNU Programming Platform">DJGPP</abbr></a>,
<a href="http://en.wikipedia.org/wiki/Symbian">Symbian</a>,
<a href="http://en.wikipedia.org/wiki/WebOS"><abbr
title="Web Operating System">webOS</abbr></a>,
<a href="http://ibm.com/aix"><abbr
@ -56,7 +57,6 @@ title="Advanced Interactive eXecutive">AIX</abbr></a>,
<a href="http://en.wikipedia.org/wiki/BlackBerry_10">BlackBerry 10</a>,
<a href="http://www.apple.com/ios/"><abbr
title="iPhone OS">iOS</abbr></a>,
<a href="http://windows.microsoft.com/">Microsoft Windows</a>,
<a href="http://h71000.www7.hp.com/">Open<abbr
title="Virtual Memory System">VMS</abbr></a>,
<a href="http://oracle.com/database">Oracle Database</a>,
@ -92,8 +92,10 @@ the code is in the file <code>tzcode<var>C</var>.tar.gz</code>,
where <code><var>C</var></code> is the code's version;
similarly, the data are in <code>tzdata<var>D</var>.tar.gz</code>,
where <code><var>D</var></code> is the data's version.
Each version is a four-digit year followed by lower-case letters
(a through z, then za through zz, then zza through zzz, and so on).
Since 1996, each version has been a four-digit year followed by
lower-case letter (<samp>a</samp> through <samp>z</samp>,
then <samp>za</samp> through <samp>zz</samp>, then <samp>zza</samp>
through <samp>zzz</samp>, and so on).
Convenience links to
the <a href="ftp://ftp.iana.org/tz/tzcode-latest.tar.gz">latest
code</a> and
@ -106,10 +108,8 @@ see the downloaded
<code>README</code> file for what to do next.</p>
<pre style="margin-left: 2em"><code>mkdir tz
cd tz
<a href="http://www.gnu.org/software/wget/">wget</a> --retr-symlinks
'ftp://ftp.iana.org/tz/tz*-latest.tar.gz'
<a href="http://www.gnu.org/software/gzip/">gzip</a> -dc tzcode-latest.tar.gz |
<a href="http://www.gnu.org/software/tar/">tar</a> -xf -
<a href="http://www.gnu.org/software/wget/">wget</a> --retr-symlinks 'ftp://ftp.iana.org/tz/tz*-latest.tar.gz'
<a href="http://www.gnu.org/software/gzip/">gzip</a> -dc tzcode-latest.tar.gz | <a href="http://www.gnu.org/software/tar/">tar</a> -xf -
gzip -dc tzdata-latest.tar.gz | tar -xf -
</code></pre>
<p>
@ -138,8 +138,8 @@ and browse the <a
href="http://mm.icann.org/pipermail/tz/">archive of old
messages</a>. For further information about updates, please see
<a href="http://tools.ietf.org/html/rfc6557">Procedures for
Maintaining the Time Zone Database</a> (Internet <abbr title="Request
For Comments">RFC</abbr> 6557).</p>
Maintaining the Time Zone Database</a> (Internet <abbr
title="Request For Comments">RFC</abbr> 6557).</p>
<p>
The Web has several other sources for time zone and daylight saving time data.
Here are some links that may be of interest.
@ -150,7 +150,8 @@ Here are some links that may be of interest.
<a href="http://en.wikipedia.org/wiki/Tz_database">tz database</a> is
an encyclopedic summary.</li>
<li><a href="http://www.cstdbill.com/tzdb/tz-how-to.html">How to Read the
tz Database Source Files</a> explains the tz database format.</li>
tz Database Source Files</a> explains the <code><abbr>tz</abbr></code>
database format.</li>
<li><a
href="http://blog.jonudell.net/2009/10/23/a-literary-appreciation-of-the-olsonzoneinfotz-database/">A
literary appreciation of the Olson/Zoneinfo/tz database</a> comments on the
@ -161,6 +162,8 @@ database's style.</li>
These are listed roughly in ascending order of complexity and fanciness.
</p>
<ul>
<li><a href="http://time.is/">Time.is</a> shows locations'
time and zones in a simple format.</li>
<li><a
href="http://twiki.org/cgi-bin/xtra/tzdatepick.html">Date and Time Gateway</a>
lets you see the <code><abbr>TZ</abbr></code> values directly.</li>
@ -170,30 +173,35 @@ Time in 1000 Places</a> uses descriptions of the values.</li>
<li><a href="http://www.timezoneconverter.com/cgi-bin/tzc.tzc">Time Zone
Converter</a>
uses a pulldown menu.</li>
<li><a href="http://home.telfort.nl/~t876506/TZworld.html">Complete
<li><a href="http://home.kpn.nl/vanadovv/time/TZworld.html">Complete
timezone information for all countries</a> displays tables of DST rules.
<li><a href="http://timeanddate.com/worldclock/">The World Clock &ndash;
Time Zones</a> lets you sort zone names and convert times.</li>
<li><a href="http://permatime.com/">Permatime</a> generates and views
links that refer to a particular point in time and can be displayed in
multiple timezones.</li>
<li><a href="http://daylight-savings-time.info/">Daylight Saving Time info</a>
shows a graph of time
difference versus time for any pair of locations.</li>
<li><a href="http://www.zeitverschiebung.net/en/">Time Difference</a>
calculates the current time difference between locations.</li>
<li><a href="http://www.wx-now.com/">Weather Now</a> lists the weather too.</li>
<li><a href="http://worldtime.io/">worldtime.io</a>
also contains data about time zone boundaries; it supports queries via place
names and shows location maps.</li>
<li><a href="http://simpletimerclocks.mozdev.org/">Simple Timer + Clocks</a>
is a Firefox add-on which uses a timezone data file generated from the
tz data files.</li>
</ul>
<h2>Other time zone database formats</h2>
<ul>
<li>The <a href="http://tools.ietf.org/html/rfc5545">
Internet Calendaring and Scheduling Core Object Specification
(iCalendar)</a>, Internet <abbr>RFC</abbr> 5445
(iCalendar)</a> (Internet <abbr>RFC</abbr> 5445)
covers time zone
data; see its VTIMEZONE calendar component.
The iCalendar format requires specialized parsers and generators; a
variant <a href="http://tools.ietf.org/html/rfc6321">xCal</a>
(Internet RFC 6321) uses
<a href="http://www.w3.org/XML/"><abbr
title="Extensible Markup Language">XML</abbr></a> format, and a draft variant
<a href="http://datatracker.ietf.org/doc/draft-ietf-jcardcal-jcal/">jCal</a>
uses <a href="http://www.json.org/"><abbr
title="JavaScript Object Notation">JSON</abbr></a> format.
<a href="http://calconnect.org/">CalConnect, The Calendaring and Scheduling
Consortium</a> is promoting further work in this area. <a
href="http://calconnect.org/publications/icalendartimezoneproblemsandrecommendationsv1.0.pdf">iCalendar
@ -250,6 +258,8 @@ Unicode (<abbr>ICU</abbr>)</a> contains C/C++ and <a
href="http://en.wikipedia.org/wiki/Java_%28programming_language%29">Java</a>
libraries for internationalization that
has a compiler from <code><abbr>tz</abbr></code> source
and from <abbr title="Common Locale Data Repository">CLDR</abbr> data
(mentioned below)
into an <abbr>ICU</abbr>-specific format.
<abbr>ICU</abbr> is freely available under a
<abbr>BSD</abbr>-style license.</li>
@ -259,10 +269,12 @@ contains a class
<code>org.joda.time.tz.ZoneInfoCompiler</code> that compiles
<code><abbr>tz</abbr></code> source into a Joda-specific binary format. Joda Time
is freely available under a <abbr>BSD</abbr>-style license.</li>
<li><a href="http://nodatime.org/">Noda Time &ndash; Date and time API
for .NET</a> is similar to Joda Time, but for the .NET framework
instead of Java. It is freely available under the
<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License</a>.</li>
<li><a href="http://nodatime.org/">Noda Time &ndash; Date and time API for
.NET</a> and <a href="http://www.babiej.demon.nl/Tz4Net/main.htm">TZ4Net</a>
are similar to Joda Time, but for the .NET framework instead of
Java. They are freely available under the
<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License</a>
and a <abbr>BSD</abbr>-style license, respectively.</li>
<li><a href="https://github.com/mde/timezone-js">TimezoneJS.Date</a>
is a <a href="http://en.wikipedia.org/wiki/JavaScript">JavaScript</a>
library that parses <code><abbr>tz</abbr></code> source files and interprets time
@ -283,8 +295,7 @@ Library</a> is
a <a href="http://en.wikipedia.org/wiki/Smalltalk">Smalltalk</a> class
library that compiles <code><abbr>tz</abbr></code> source into a time
zone repository whose format
is either proprietary or an <a href="http://www.w3.org/XML/"><abbr
title="Extensible Markup Language">XML</abbr></a>-encoded
is either proprietary or an <abbr>XML</abbr>-encoded
representation.</li>
<li>Starting with version 8.5, <a href="http://tcl.tk/">Tcl</a>
contains a developer-oriented parser that compiles <code><abbr>tz</abbr></code>
@ -318,10 +329,13 @@ It is freely available under the same terms as Perl
public-domain <a href="https://github.com/dbaron/tz.js">tz.js</a>
library contains a Python tool that
converts <code><abbr>tz</abbr></code> binary data into
<a href="http://www.json.org/"><abbr title="JavaScript Object
Notation">JSON</abbr></a>-format data suitable for use
<abbr>JSON</abbr>-format data suitable for use
in its JavaScript library for time zone conversion. Dates before 1970
are not supported.</li>
<li>The <a
href="http://hackage.haskell.org/package/timezone-olson">timezone-olson</a>
package contains <a href="http://haskell.org">Haskell</a> code that
parses and uses <code><abbr>tz</abbr></code> binary data.</li>
</ul>
<h2>Other <code><abbr>tz</abbr></code>-based time zone software</h2>
<ul>
@ -393,9 +407,10 @@ gives current time zone rules for airports served by commercial aviation.</li>
an undocumented format, with <abbr>ID</abbr>s that can be mapped to
<code><abbr>TZ</abbr></code> values using the <a
href="http://unicode.org/cldr/charts/supplemental/zone_tzid.html">Zone
&rarr; Tzid table</a> maintained by the <abbr
title="Common Locale Data Repository">CLDR</abbr> data mentioned
below.</li>
&rarr; Tzid table</a> in the <abbr>CLDR</abbr> data mentioned
below, or via <a href="http://msdn.microsoft.com/en-us/windows/apps">Windows
Store apps</a> classes such as <a
href="http://msdn.microsoft.com/en-us/library/windows/apps/dn264145.aspx">DateTimeFormatter</a>.</li>
</ul>
<h2>Maps</h2>
<ul>
@ -418,6 +433,10 @@ has several fancy time zone maps; it covers Russia particularly well.
The maps' pictorial quality is not quite as good as the
<abbr>CIA</abbr>'s
but the maps are more up to date.</li>
<li><a href="http://poisson.phc.unipi.it/~maggiolo/index.php/2014/01/how-much-is-time-wrong-around-the-world/">How
much is time wrong around the world?</a> maps the difference between
mean solar and standard time, highlighting areas such as western China
where the two differ greatly.</li>
</ul>
<h2>Time zone boundaries</h2>
<ul>
@ -431,7 +450,7 @@ geospatial query operators to shapefiles' data.</li>
<li><a href="http://statoids.com/statoids.html">Administrative
Divisions of Countries ("Statoids")</a> contains lists of
political subdivision data related to time zones.</li>
<li><a href="http://home.telfort.nl/~t876506/Multizones.html">Time
<li><a href="http://home.kpn.nl/vanadovv/time/Multizones.html">Time
zone boundaries for multizone countries</a> summarizes legal
boundaries between time zones within countries.</li>
<li>Manifold.net's <a
@ -627,6 +646,16 @@ contentious issue.</li>
</ul>
<h2>Time notation</h2>
<ul>
<li>The <a href="http://unicode.org/cldr/">Unicode Common Locale Data
Repository (<abbr>CLDR</abbr>) Project</a> has localizations for time
zone names, abbreviations, identifiers, and formats. For example, it
contains French translations for "Eastern European Summer Time",
"<abbr title="Eastern European Summer Time">EEST</abbr>", and
"Bucharest". Its
<a href="http://unicode.org/cldr/charts/by_type/index.html">by-type
charts</a> show these values for many locales. Data are available in
both <abbr title="Locale Data Markup Language">LDML</abbr>
(an <abbr>XML</abbr> format) and <abbr>JSON</abbr>.
<li>
<a href="http://www.cl.cam.ac.uk/~mgk25/iso-time.html">A summary of
the international standard date and time notation</a> is a good
@ -660,16 +689,6 @@ formats.</li>
<a href="http://exit109.com/~ghealton/y2k/yrexamples.html">The
Best of Dates, the Worst of Dates</a> covers many problems encountered
by software developers when handling dates and time stamps.</li>
<li>The <a
href="http://unicode.org/cldr/">Unicode Common Locale Data Repository
(<abbr>CLDR</abbr>) Project</a> has localizations for time zone names,
abbreviations, identifiers, and formats. For example, it contains
French translations for "Eastern European Summer Time", "<abbr
title="Eastern European Summer Time">EEST</abbr>", and
"Bucharest". <a
href="http://unicode.org/cldr/charts/by_type/index.html">By-Type
Chart</a> shows these values for many locales.
<abbr>ICU</abbr> contains a mechanism for using this data.</li>
<li>Alphabetic time zone abbreviations should not be used as unique
identifiers for <abbr>UTC</abbr> offsets as they are ambiguous in
practice. For example, "<abbr>EST</abbr>" denotes 5 hours behind
@ -687,8 +706,8 @@ maintainers.</li>
<code><abbr>TZ</abbr></code> environment variable uses the opposite convention.
For example, one might use <code><abbr>TZ</abbr>="<abbr
title="Japan Standard Time">JST</abbr>-9"</code> and
<code><abbr>TZ</abbr>="<abbr title="Hawaii Standard
Time">HST</abbr>10"</code> for Japan and Hawaii, respectively. If the
<code><abbr>TZ</abbr>="<abbr title="Hawaii Standard Time">HST</abbr>10"</code>
for Japan and Hawaii, respectively. If the
<code><abbr>tz</abbr></code> database is available, it is usually better to use
settings like <code><abbr>TZ</abbr>="Asia/Tokyo"</code> and
<code><abbr>TZ</abbr>="Pacific/Honolulu"</code> instead, as this should avoid

View File

@ -1,4 +1,4 @@
/* $NetBSD: tzfile.h,v 1.13 2013/12/26 18:34:28 christos Exp $ */
/* $NetBSD: tzfile.h,v 1.14 2014/05/13 16:33:56 christos Exp $ */
#ifndef TZFILE_H
#define TZFILE_H
@ -98,7 +98,7 @@ struct tzhead {
*/
#ifndef TZ_MAX_TIMES
#define TZ_MAX_TIMES 1200
#define TZ_MAX_TIMES 2000
#endif /* !defined TZ_MAX_TIMES */
#ifndef TZ_MAX_TYPES

View File

@ -1,5 +1,5 @@
.\" $NetBSD: tzset.3,v 1.27 2013/12/26 18:34:28 christos Exp $
.Dd December 26, 2013
.\" $NetBSD: tzset.3,v 1.28 2014/05/13 16:33:56 christos Exp $
.Dd May 13, 2014
.Dt TZSET 3
.Os
.Sh NAME
@ -237,7 +237,7 @@ first Sunday on or after January 18).
.It IST\(mi2IDT,M3.4.4/26,M10.5.0
stands for Israel Standard Time (IST) and Israel Daylight Time (IDT),
2 hours ahead of UTC, springing forward on March's fourth
Tuesday at 26:00 (i.e., 02:00 on the first Friday on or after March
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.
.It WART4WARST,J1/0,J365/25
stands for Western Argentina Summer Time (WARST), 3 hours behind UTC.

View File

@ -1,4 +1,4 @@
/* $NetBSD: zdump.c,v 1.32 2013/12/26 18:34:28 christos Exp $ */
/* $NetBSD: zdump.c,v 1.33 2014/05/13 16:33:56 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
** 2009-05-17 by Arthur David Olson.
@ -6,7 +6,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: zdump.c,v 1.32 2013/12/26 18:34:28 christos Exp $");
__RCSID("$NetBSD: zdump.c,v 1.33 2014/05/13 16:33:56 christos Exp $");
#endif /* !defined lint */
#include "version.h"
@ -39,7 +39,9 @@ __RCSID("$NetBSD: zdump.c,v 1.32 2013/12/26 18:34:28 christos Exp $");
#ifndef HAVE_STDINT_H
# define HAVE_STDINT_H \
(199901 <= __STDC_VERSION__ || 2 < (__GLIBC__ + (0 < __GLIBC_MINOR__)))
(199901 <= __STDC_VERSION__ \
|| 2 < __GLIBC__ + (1 <= __GLIBC_MINOR__) \
|| __CYGWIN__)
#endif
#if HAVE_STDINT_H
# include "stdint.h"

View File

@ -1,4 +1,4 @@
/* $NetBSD: zic.c,v 1.44 2013/12/26 18:34:28 christos Exp $ */
/* $NetBSD: zic.c,v 1.45 2014/05/13 16:33:56 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
** 2006-07-17 by Arthur David Olson.
@ -10,7 +10,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: zic.c,v 1.44 2013/12/26 18:34:28 christos Exp $");
__RCSID("$NetBSD: zic.c,v 1.45 2014/05/13 16:33:56 christos Exp $");
#endif /* !defined lint */
#include "version.h"
@ -176,6 +176,7 @@ static const char * rfilename;
static int rlinenum;
static const char * progname;
static int timecnt;
static int timecnt_alloc;
static int typecnt;
/*
@ -261,9 +262,11 @@ static int typecnt;
static struct rule * rules;
static int nrules; /* number of rules */
static int nrules_alloc;
static struct zone * zones;
static int nzones; /* number of zones */
static int nzones_alloc;
struct link {
const char * l_filename;
@ -274,6 +277,7 @@ struct link {
static struct link * links;
static int nlinks;
static int nlinks_alloc;
struct lookup {
const char * l_word;
@ -360,7 +364,7 @@ static const int len_years[2] = {
static struct attype {
zic_t at;
unsigned char type;
} attypes[TZ_MAX_TIMES];
} * attypes;
static zic_t gmtoffs[TZ_MAX_TYPES];
static char isdsts[TZ_MAX_TYPES];
static unsigned char abbrinds[TZ_MAX_TYPES];
@ -375,16 +379,26 @@ static char roll[TZ_MAX_LEAPS];
** Memory allocation.
*/
static _Noreturn void
memory_exhausted(const char *msg)
{
fprintf(stderr, _("%s: Memory exhausted: %s\n"), progname, msg);
exit(EXIT_FAILURE);
}
static ATTRIBUTE_PURE size_t
size_product(size_t nitems, size_t itemsize)
{
if (SIZE_MAX / itemsize < nitems)
memory_exhausted("size overflow");
return nitems * itemsize;
}
static ATTRIBUTE_PURE void *
memcheck(void *const ptr)
{
if (ptr == NULL) {
const char *e = strerror(errno);
(void) fprintf(stderr, _("%s: Memory exhausted: %s\n"),
progname, e);
exit(EXIT_FAILURE);
}
if (ptr == NULL)
memory_exhausted(strerror(errno));
return ptr;
}
@ -393,6 +407,20 @@ memcheck(void *const ptr)
#define ecpyalloc(ptr) memcheck(icpyalloc(ptr))
#define ecatalloc(oldp, newp) memcheck(icatalloc((oldp), (newp)))
static void *
growalloc(void *ptr, size_t itemsize, int nitems, int *nitems_alloc)
{
if (nitems < *nitems_alloc)
return ptr;
else {
int amax = INT_MAX < SIZE_MAX ? INT_MAX : SIZE_MAX;
if ((amax - 1) / 3 * 2 < *nitems_alloc)
memory_exhausted("int overflow");
*nitems_alloc = *nitems_alloc + (*nitems_alloc >> 1) + 1;
return erealloc(ptr, size_product(*nitems_alloc, itemsize));
}
}
/*
** Error handling.
*/
@ -948,8 +976,6 @@ gethms(const char *string, const char *const errstring, const int signable)
error(_("time overflow"));
return 0;
}
if (noise && hh == HOURSPERDAY && mm == 0 && ss == 0)
warning(_("24:00 not handled by pre-1998 versions of zic"));
if (noise && (hh > HOURSPERDAY ||
(hh == HOURSPERDAY && (mm != 0 || ss != 0))))
warning(_("values over 24 hours not handled by pre-2007 versions of zic"));
@ -979,7 +1005,7 @@ inrule(char **const fields, const int nfields)
r.r_abbrvar = ecpyalloc(fields[RF_ABBRVAR]);
if (max_abbrvar_len < strlen(r.r_abbrvar))
max_abbrvar_len = strlen(r.r_abbrvar);
rules = erealloc(rules, (nrules + 1) * sizeof *rules);
rules = growalloc(rules, sizeof *rules, nrules, &nrules_alloc);
rules[nrules++] = r;
}
@ -1095,7 +1121,7 @@ inzsub(char **const fields, const int nfields, const int iscont)
return FALSE;
}
}
zones = erealloc(zones, (nzones + 1) * sizeof *zones);
zones = growalloc(zones, sizeof *zones, nzones, &nzones_alloc);
zones[nzones++] = z;
/*
** If there was an UNTIL field on this line,
@ -1228,7 +1254,7 @@ inlink(char **const fields, const int nfields)
l.l_linenum = linenum;
l.l_from = ecpyalloc(fields[LF_FROM]);
l.l_to = ecpyalloc(fields[LF_TO]);
links = erealloc(links, (nlinks + 1) * sizeof *links);
links = growalloc(links, sizeof *links, nlinks, &nlinks_alloc);
links[nlinks++] = l;
}
@ -1444,8 +1470,9 @@ writezone(const char *const name, const char *const string, char version)
static char * fullname;
static const struct tzhead tzh0;
static struct tzhead tzh;
zic_t ats[TZ_MAX_TIMES];
unsigned char types[TZ_MAX_TIMES];
zic_t *ats = emalloc(size_product(timecnt, sizeof *ats + 1));
void *typesptr = ats + timecnt;
unsigned char *types = typesptr;
/*
** Sort.
@ -1464,17 +1491,11 @@ writezone(const char *const name, const char *const string, char version)
fromi = 0;
while (fromi < timecnt && attypes[fromi].at < min_time)
++fromi;
/*
** Remember that type 0 is reserved.
*/
if (isdsts[1] == 0)
while (fromi < timecnt && attypes[fromi].type == 1)
++fromi; /* handled by default rule */
for ( ; fromi < timecnt; ++fromi) {
if (toi != 0 && ((attypes[fromi].at +
if (toi > 1 && ((attypes[fromi].at +
gmtoffs[attypes[toi - 1].type]) <=
(attypes[toi - 1].at + gmtoffs[toi == 1 ? 0
: attypes[toi - 2].type]))) {
(attypes[toi - 1].at +
gmtoffs[attypes[toi - 2].type]))) {
attypes[toi - 1].type =
attypes[fromi].type;
continue;
@ -1485,6 +1506,9 @@ writezone(const char *const name, const char *const string, char version)
}
timecnt = toi;
}
if (noise && timecnt > 1200)
warning(_("pre-2014 clients may mishandle"
" more than 1200 transition times"));
/*
** Transfer.
*/
@ -1516,6 +1540,13 @@ writezone(const char *const name, const char *const string, char version)
--timecnt32;
++timei32;
}
/*
** Output an INT32_MIN "transition" if appropriate--see below.
*/
if (timei32 > 0 && ats[timei32] > INT32_MIN) {
--timei32;
++timecnt32;
}
while (leapcnt32 > 0 && !is32(trans[leapcnt32 - 1]))
--leapcnt32;
while (leapcnt32 > 0 && !is32(trans[leapi32])) {
@ -1550,7 +1581,7 @@ writezone(const char *const name, const char *const string, char version)
int thistimei, thistimecnt;
int thisleapi, thisleapcnt;
int thistimelim, thisleaplim;
int writetype[TZ_MAX_TIMES];
int writetype[TZ_MAX_TYPES];
int typemap[TZ_MAX_TYPES];
int thistypecnt;
char thischars[TZ_MAX_CHARS];
@ -1570,11 +1601,7 @@ writezone(const char *const name, const char *const string, char version)
}
thistimelim = thistimei + thistimecnt;
thisleaplim = thisleapi + thisleapcnt;
/*
** Remember that type 0 is reserved.
*/
writetype[0] = FALSE;
for (i = 1; i < typecnt; ++i)
for (i = 0; i < typecnt; ++i)
writetype[i] = thistimecnt == timecnt;
if (thistimecnt == 0) {
/*
@ -1590,11 +1617,8 @@ writezone(const char *const name, const char *const string, char version)
/*
** For America/Godthab and Antarctica/Palmer
*/
/*
** Remember that type 0 is reserved.
*/
if (thistimei == 0)
writetype[1] = TRUE;
writetype[0] = TRUE;
}
#ifndef LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH
/*
@ -1647,26 +1671,8 @@ writezone(const char *const name, const char *const string, char version)
}
#endif /* !defined LEAVE_SOME_PRE_2011_SYSTEMS_IN_THE_LURCH */
thistypecnt = 0;
/*
** Potentially, set type 0 to that of lowest-valued time.
*/
if (thistimei > 0) {
for (i = 1; i < typecnt; ++i)
if (writetype[i] && !isdsts[i])
break;
if (i != types[thistimei - 1]) {
i = types[thistimei - 1];
gmtoffs[0] = gmtoffs[i];
isdsts[0] = isdsts[i];
ttisstds[0] = ttisstds[i];
ttisgmts[0] = ttisgmts[i];
abbrinds[0] = abbrinds[i];
writetype[0] = TRUE;
writetype[i] = FALSE;
}
}
for (i = 0; i < typecnt; ++i)
typemap[i] = writetype[i] ? thistypecnt++ : 0;
typemap[i] = writetype[i] ? thistypecnt++ : -1;
for (i = 0; i < (int)(sizeof indmap / sizeof indmap[0]); ++i)
indmap[i] = -1;
thischarcnt = 0;
@ -1711,7 +1717,12 @@ writezone(const char *const name, const char *const string, char version)
#undef DO
for (i = thistimei; i < thistimelim; ++i)
if (pass == 1)
puttzcode(ats[i], fp);
/*
** Output an INT32_MIN "transition"
** if appropriate--see above.
*/
puttzcode(((ats[i] < INT32_MIN) ?
INT32_MIN : ats[i]), fp);
else puttzcode64(ats[i], fp);
for (i = thistimei; i < thistimelim; ++i) {
unsigned char uc;
@ -1766,6 +1777,7 @@ writezone(const char *const name, const char *const string, char version)
progname, fullname);
exit(EXIT_FAILURE);
}
free(ats);
}
static void
@ -2091,11 +2103,6 @@ outzone(const struct zone *const zpfirst, const int zonecount)
updateminmax(leapminyear);
updateminmax(leapmaxyear + (leapmaxyear < ZIC_MAX));
}
/*
** Reserve type 0.
*/
gmtoffs[0] = isdsts[0] = ttisstds[0] = ttisgmts[0] = abbrinds[0] = -1;
typecnt = 1;
for (i = 0; i < zonecount; ++i) {
zp = &zpfirst[i];
if (i < zonecount - 1)
@ -2195,8 +2202,7 @@ outzone(const struct zone *const zpfirst, const int zonecount)
if (usestart) {
addtt(starttime, type);
usestart = FALSE;
} else if (stdoff != 0)
addtt(min_time, type);
} else addtt(min_time, type);
} else for (year = min_year; year <= max_year; ++year) {
if (useuntil && year > zp->z_untilrule.r_hiyear)
break;
@ -2391,10 +2397,7 @@ addtt(const zic_t starttime, int type)
timecnt = 0;
type = 0;
}
if (timecnt >= TZ_MAX_TIMES) {
error(_("too many transitions?!"));
exit(EXIT_FAILURE);
}
attypes = growalloc(attypes, sizeof *attypes, timecnt, &timecnt_alloc);
attypes[timecnt].at = starttime;
attypes[timecnt].type = type;
++timecnt;
@ -2592,7 +2595,7 @@ getfields(char *cp)
if (cp == NULL)
return NULL;
array = emalloc((strlen(cp) + 1) * sizeof *array);
array = emalloc(size_product(strlen(cp) + 1, sizeof *array));
nsubs = 0;
for ( ; ; ) {
while (isascii((unsigned char) *cp) &&