I've started to take a look at this, and it appears to be nice work that will head us in the right direction; thanks. I found a problem, though, in that tzwinnow is not winnowing out as much as I expect. For example, tzwinnow -a 1970z should find that Africa/Accra and Africa/Dakar are duplicates, since they've both been at plain GMT since 1970, but tzwinnow considers them to be distinct for some reason. One suggestion: it would be nice for tzwinnow to have an option where it ignores differences due only to the time zone abbreviations, for applications that care only about UTC offsets. I found the problem with Accra and Dakar by running the following test script, which is not intended to be portable or fast but should run on any GNU/Linux host with the necessary packages installed. This script found that the version of the tz database that you used had 417 zones (this does not count links), of which 190 are duplicates from the year 2013 on. Hence it found 227 distinct zones from the year 2013 on, a considerably smaller number than what you found with tzwinnow. If we ignore time zone abbreviations, a variant of the script finds 314 duplicates, which means there are 103 distinct zones today. Having to choose from 103 values should be significantly easier for users than having to choose from 417. #! /bin/sh TOPDIR=$1 test -f "$TOPDIR/etc/zdump" || { echo >&2 "$0: usage: $0 topdir"; exit 1; } start_time_t=0 start_year=2013 limit_year=2500 # Prepend "." to the path, since this is meant to be run # in the source directory, which contains tzwinnow, zdump, and maybe 'date'. LC_ALL=C PATH=.:$PATH TZ=UTC0 export LC_ALL PATH TZ date_format='%Y-%m-%dT%H:%M:%S %Z' for date_origin_option in '-d@' '-r' ''; do test -n "$date_origin_option" || { echo >&2 "date is dumb"; exit 1; } date_output=$(date $date_origin_option$start_time_t "+$date_format") [ "$date_output" = '1970-01-01T00:00:00 UTC' ] && break done zonedir=$TOPDIR/etc/zoneinfo tmp=$(mktemp -d) || exit # trap 'status=$?; rm -fr $tmp; exit $status' 0 # trap exit 1 2 13 15 (cd $zonedir && find * ! -name '*.tab' -type f -ls | sort | awk '{if (inum != $1) print $NF; inum = $1; }' | sort ) >$tmp/names tzwinnow -a ${start_year}z -B ${limit_year}z -z "$zonedir" -l \ <$tmp/names >$tmp/tzwinnow.out for name in $(cat $tmp/names); do dest=$tmp/zdump.out/$name mkdir -p $(dirname $dest) (TZ=$zonedir/$name date $date_origin_option$start_time_t "+$date_format" && zdump -V -c $start_year,$limit_year $name | sed 's/^[^ ]* *//' ) >$dest || break done (cd $tmp/zdump.out && fdupes -qr . | sed 's@^\./@@') >$tmp/check.out echo "output is in: $tmp"