diff --git a/src/timezone/.gitignore b/src/timezone/.gitignore index f844c9fcf1..673f864b43 100644 --- a/src/timezone/.gitignore +++ b/src/timezone/.gitignore @@ -1 +1,2 @@ /zic +/abbrevs.txt diff --git a/src/timezone/Makefile b/src/timezone/Makefile index 2cecaec5e6..6cfe95019b 100644 --- a/src/timezone/Makefile +++ b/src/timezone/Makefile @@ -55,6 +55,11 @@ ifeq (,$(with_system_tzdata)) endif $(MAKE) -C tznames $@ +abbrevs.txt: zic $(TZDATAFILES) + mkdir junkdir + $(ZIC) -P -d junkdir -p '$(POSIXRULES)' $(TZDATAFILES) | LANG=C sort | uniq >abbrevs.txt + rm -rf junkdir + installdirs: $(MKDIR_P) '$(DESTDIR)$(datadir)' @@ -65,4 +70,4 @@ endif $(MAKE) -C tznames $@ clean distclean maintainer-clean: - rm -f zic$(X) $(ZICOBJS) + rm -f zic$(X) $(ZICOBJS) abbrevs.txt diff --git a/src/timezone/README b/src/timezone/README index 201b293881..d09b8854a0 100644 --- a/src/timezone/README +++ b/src/timezone/README @@ -22,11 +22,17 @@ Since time zone rules change frequently in some parts of the world, we should endeavor to update the data files before each PostgreSQL release. -At each update, we should check if time zone offsets have changed. -Just search for the current or previous year and see what has changed. -Sometimes a country changes its time zone offsets, for example Georgia -in 2004. Just grepping in the zic database files for 2004 is enough to -spot such a change. Then the files under tznames/ should be updated. +While the files under data/ can just be duplicated when updating, manual +effort is needed to update the time zone abbreviation lists under tznames/. +These need to be changed whenever new abbreviations are invented or the +UTC offset associated with an existing abbreviation changes. To detect +if this has happened, after installing new files under data/ do + gmake abbrevs.txt +which will produce a file showing all abbreviations that are in current +use according to the data/ files. Compare this to known_abbrevs.txt, +which is the list that existed last time the tznames/ files were updated. +Update tznames/ as seems appropriate, then replace known_abbrevs.txt +in the same commit. When there has been a new release of Windows (probably including Service Packs), the list of matching timezones need to be updated. Run the diff --git a/src/timezone/known_abbrevs.txt b/src/timezone/known_abbrevs.txt new file mode 100644 index 0000000000..d2c490bea4 --- /dev/null +++ b/src/timezone/known_abbrevs.txt @@ -0,0 +1,200 @@ +ACT -18000 +ADDT -7200 D +ADT -10800 D +ADT 14400 D +AFT 16200 +AKST -32400 +ALMST 25200 D +AMT -14400 +AMT 14400 +ANAT 39600 +APT -10800 D +AQTT 14400 +AQTT 18000 +ART -10800 +AST -14400 +AST 10800 +AWT -10800 D +AZOT -3600 +AZST 18000 D +BDT 21600 +BEAT 9000 +BEAUT 9885 +BNT 28800 +BOT -14400 +BRT -10800 +BTT 21600 +CAST 10800 D +CAT 7200 +CCT 23400 +CDT -14400 D +CDT -18000 D +CDT 32400 D +CEST 7200 D +CET 3600 +CHAST 45900 +CHOST 36000 D +CIT 28800 +CKHST -34200 D +CLT -14400 +COT -18000 +CPT -18000 D +CST -21600 +CST 28800 +CST 34200 +CVT -3600 +CWT -18000 D +CXT 25200 +ChST 36000 +DAVT 25200 +DDUT 36000 +EAST -21600 +EAT 10800 +ECT -18000 +EDT -14400 D +EEST 10800 D +EET 7200 +EGST 0 D +EPT -14400 D +EST -18000 +EST 36000 +FJT 43200 +FKT -10800 +FNT -7200 +GALT -21600 +GAMT -32400 +GEST 14400 D +GFT -10800 +GILT 43200 +GMT 0 +GMT+1 -3600 +GMT+10 -36000 +GMT+11 -39600 +GMT+12 -43200 +GMT+2 -7200 +GMT+3 -10800 +GMT+4 -14400 +GMT+5 -18000 +GMT+6 -21600 +GMT+7 -25200 +GMT+8 -28800 +GMT+9 -32400 +GMT-1 3600 +GMT-10 36000 +GMT-11 39600 +GMT-12 43200 +GMT-13 46800 +GMT-14 50400 +GMT-2 7200 +GMT-3 10800 +GMT-4 14400 +GMT-5 18000 +GMT-6 21600 +GMT-7 25200 +GMT-8 28800 +GMT-9 32400 +GST -7200 +GST 14400 +GYT -14400 +HAST -36000 +HKT 28800 +HOVST 28800 D +HST -36000 +ICT 25200 +ICT 28800 +IDDT 14400 D +IOT 21600 +IRDT 16200 D +IRKT 25200 +IST 23400 D +JST 32400 +KDT 36000 D +KGST 21600 D +KOST 43200 +KRAT 21600 +KST 28800 +LHST 39600 D +LINT 50400 +LKT 21600 +MAGT 36000 +MART -34200 +MAWT 21600 +MDDT -18000 D +MDT -21600 D +MET 3600 +MHT 43200 +MMT 23400 +MPT -21600 D +MST -25200 +MUT 14400 +MVT 18000 +MWT -21600 D +MYT 28800 +NCT 39600 +NDDT -5400 D +NFT 41400 +NOVST 25200 D +NPT 20700 +NRT 43200 +NUT -39600 +NZST 43200 +OMST 18000 +ORAT 18000 +PET -18000 +PETT 39600 +PGT 36000 +PHOT 46800 +PKT 18000 +PMDT -7200 D +PONT 39600 +PPT -25200 D +PST -28800 +PWT -25200 D +PWT 32400 +PYST -10800 D +QYZT 21600 +RET 14400 +ROTT -10800 +SAKT 36000 +SAMT 14400 +SAST 10800 D +SAST 7200 +SBT 39600 +SCT 14400 +SGT 28800 +SRT -10800 +SST -39600 +SYOT 10800 +TAHT -36000 +TFT 18000 +TJT 18000 +TKT -36000 +TMT 18000 +TOST 50400 D +TRUT 36000 +TVT 43200 +UCT 0 +ULAST 32400 D +UTC 0 +UYHST -9000 D +UZT 18000 +VET -14400 +VLAST 32400 +VOST 21600 +VUT 39600 +WAKT 43200 +WARST -10800 D +WART -14400 +WAST 7200 D +WAT -3600 +WAT 0 +WAT 3600 +WEST 3600 D +WET 0 +WFT 43200 +WGST -7200 D +WIT 25200 +WST -39600 +WST 28800 +YAKT 28800 +YEKT 18000 diff --git a/src/timezone/zic.c b/src/timezone/zic.c index 0aa90ebfca..2c34b874e3 100644 --- a/src/timezone/zic.c +++ b/src/timezone/zic.c @@ -181,6 +181,8 @@ static int max_year; static zic_t min_time; static int min_year; static int noise; +static int print_abbrevs; +static zic_t print_cutoff; static const char *rfilename; static int rlinenum; static const char *progname; @@ -457,7 +459,7 @@ static void usage(FILE *stream, int status) { (void) fprintf(stream, _("%s: usage is %s \ -[ --version ] [ --help ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n\ +[ --version ] [ --help ] [ -v ] [ -P ] [ -l localtime ] [ -p posixrules ] \\\n\ \t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n\ \n\ Report bugs to tz@elsie.nci.nih.gov.\n"), @@ -498,7 +500,7 @@ main(int argc, char *argv[]) { usage(stdout, EXIT_SUCCESS); } - while ((c = getopt(argc, argv, "d:l:p:L:vsy:")) != EOF && c != -1) + while ((c = getopt(argc, argv, "d:l:p:L:vPsy:")) != EOF && c != -1) switch (c) { default: @@ -561,6 +563,10 @@ main(int argc, char *argv[]) case 'v': noise = TRUE; break; + case 'P': + print_abbrevs = TRUE; + print_cutoff = time(NULL); + break; case 's': (void) printf("%s: -s ignored\n", progname); break; @@ -1780,6 +1786,21 @@ writezone(const char *name, const char *string) puttzcode(gmtoffs[i], fp); (void) putc(isdsts[i], fp); (void) putc((unsigned char) indmap[abbrinds[i]], fp); + + /* Print current timezone abbreviations if requested */ + if (print_abbrevs && pass == 2 && + (ats[i] >= print_cutoff || i == typecnt - 1)) + { + char *thisabbrev = &thischars[indmap[abbrinds[i]]]; + + /* filter out assorted junk entries */ + if (strcmp(thisabbrev, GRANDPARENTED) != 0 && + strcmp(thisabbrev, "zzz") != 0) + fprintf(stdout, "%s\t%ld%s\n", + thisabbrev, + gmtoffs[i], + isdsts[i] ? "\tD" : ""); + } } if (thischarcnt != 0) (void) fwrite((void *) thischars,