<p dir="ltr">There are <a href="http://github.com/evansiroky/timezone-boundary-builder">github.com/evansiroky/timezone-boundary-builder</a> that do this.<br></p>
<p dir="ltr">Responding to topic discussed earlier on the list, I believe most of those large software publisher deviate from the official tz database in some ways. Most of those software and system available on the market put Asia/Urumqi on +8 while tzdb have it +6.</p>
<div class="gmail_extra"><br><div class="gmail_quote">2017年11月14日 07:28 於 "Guy Harris" <<a href="mailto:guy@alum.mit.edu">guy@alum.mit.edu</a>> 寫道:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Nov 13, 2017, at 2:57 PM, Robert Elz <<a href="mailto:kre@munnari.OZ.AU">kre@munnari.OZ.AU</a>> wrote:<br>
<br>
>    Date:        Mon, 13 Nov 2017 12:12:51 -0800<br>
>    From:        Guy Harris <<a href="mailto:guy@alum.mit.edu">guy@alum.mit.edu</a>><br>
>    Message-ID:  <<a href="mailto:1331A59A-26DB-4D0B-8BC2-07448C5F1874@alum.mit.edu">1331A59A-26DB-4D0B-8BC2-<wbr>07448C5F1874@alum.mit.edu</a>><br>
><br>
>  | If your UI is expected to be used by people who *aren't* familiar<br>
>  | with tzdb names, it should not use tzdb names, whether it's a GUI<br>
>  | interface or not.<br>
><br>
> The standard way to find out the time in some specified location<br>
> is<br>
><br>
>       TZ=something date [+%...]<br>
><br>
> (in scripts, or on the command line).<br>
><br>
> If the "something" is not to be a tzdb name, what do you suggest using ?<br>
<br>
I suggest having command that takes a location and prints out the tzdb name for the location:<br>
<br>
        TZ=`tzid San Francisco` date<br>
<br>
or something such as that.  "America/Los_Angeles" isn't a location, it's a tzid.  "Los Angeles", "San Francisco", "Pinole", etc. are locations.<br>
<br>
For example, Apple appears to have an SQLite database /System/Library/<wbr>PrivateFrameworks/GeoKit.<wbr>framework/Resources/world.<wbr>geokit:<br>
<br>
sqlite> .tables<br>
ZGEOKITPLACE   ZGEOPLACENAME  Z_METADATA     Z_MODELCACHE   Z_PRIMARYKEY<br>
sqlite> .schema<br>
CREATE TABLE ZGEOKITPLACE ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZEMBARGO INTEGER, ZGEONAMEID INTEGER, ZPOPULATION INTEGER, ZELEVATION INTEGER, ZISCAPITAL INTEGER, ZCOUNTRY INTEGER, ZAREA INTEGER, ZLATITUDE FLOAT, ZLONGITUDE FLOAT, ZNAME VARCHAR, ZREGIONALCODE VARCHAR, ZTIMEZONENAME VARCHAR, ZCODE VARCHAR, ZLANGUAGES VARCHAR );<br>
CREATE TABLE ZGEOPLACENAME ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZAR INTEGER, ZCA INTEGER, ZCS INTEGER, ZDA INTEGER, ZDE INTEGER, ZEL INTEGER, ZEN INTEGER, ZES INTEGER, ZFI INTEGER, ZFR INTEGER, ZHE INTEGER, ZHR INTEGER, ZHU INTEGER, ZID INTEGER, ZIT INTEGER, ZJA INTEGER, ZKO INTEGER, ZMS INTEGER, ZNL INTEGER, ZNO INTEGER, ZPL INTEGER, ZPT INTEGER, ZPT_BR INTEGER, ZRO INTEGER, ZRU INTEGER, ZSK INTEGER, ZSV INTEGER, ZTH INTEGER, ZTR INTEGER, ZUK INTEGER, ZVI INTEGER, ZZH INTEGER, ZZH_TW INTEGER, ZPLACE INTEGER, Z1_PLACE INTEGER, ZNAME VARCHAR );<br>
CREATE INDEX ZGEOKITPLACE_ZGEONAMEID_INDEX ON ZGEOKITPLACE (ZGEONAMEID);<br>
CREATE INDEX ZGEOKITPLACE_ZLATITUDE_INDEX ON ZGEOKITPLACE (ZLATITUDE);<br>
CREATE INDEX ZGEOKITPLACE_ZLONGITUDE_INDEX ON ZGEOKITPLACE (ZLONGITUDE);<br>
CREATE INDEX ZGEOKITPLACE_ZPOPULATION_INDEX ON ZGEOKITPLACE (ZPOPULATION);<br>
CREATE INDEX ZGEOKITPLACE_ZISCAPITAL_INDEX ON ZGEOKITPLACE (ZISCAPITAL);<br>
CREATE INDEX ZGEOKITPLACE_ZTIMEZONENAME_<wbr>INDEX ON ZGEOKITPLACE (ZTIMEZONENAME);<br>
CREATE INDEX ZGEOKITPLACE_ZCOUNTRY_INDEX ON ZGEOKITPLACE (ZCOUNTRY);<br>
CREATE INDEX ZGEOKITPLACE_ZCODE_INDEX ON ZGEOKITPLACE (ZCODE);<br>
CREATE INDEX ZGEOKITPLACE_Z_ENT_INDEX ON ZGEOKITPLACE (Z_ENT);<br>
CREATE INDEX ZGEOPLACENAME_ZDA_INDEX ON ZGEOPLACENAME (ZDA);<br>
CREATE INDEX ZGEOPLACENAME_ZDE_INDEX ON ZGEOPLACENAME (ZDE);<br>
CREATE INDEX ZGEOPLACENAME_ZEN_INDEX ON ZGEOPLACENAME (ZEN);<br>
CREATE INDEX ZGEOPLACENAME_ZES_INDEX ON ZGEOPLACENAME (ZES);<br>
CREATE INDEX ZGEOPLACENAME_ZFI_INDEX ON ZGEOPLACENAME (ZFI);<br>
CREATE INDEX ZGEOPLACENAME_ZFR_INDEX ON ZGEOPLACENAME (ZFR);<br>
CREATE INDEX ZGEOPLACENAME_ZIT_INDEX ON ZGEOPLACENAME (ZIT);<br>
CREATE INDEX ZGEOPLACENAME_ZJA_INDEX ON ZGEOPLACENAME (ZJA);<br>
CREATE INDEX ZGEOPLACENAME_ZKO_INDEX ON ZGEOPLACENAME (ZKO);<br>
CREATE INDEX ZGEOPLACENAME_ZNAME_INDEX ON ZGEOPLACENAME (ZNAME);<br>
CREATE INDEX ZGEOPLACENAME_ZNL_INDEX ON ZGEOPLACENAME (ZNL);<br>
CREATE INDEX ZGEOPLACENAME_ZNO_INDEX ON ZGEOPLACENAME (ZNO);<br>
CREATE INDEX ZGEOPLACENAME_ZPL_INDEX ON ZGEOPLACENAME (ZPL);<br>
CREATE INDEX ZGEOPLACENAME_ZPT_INDEX ON ZGEOPLACENAME (ZPT);<br>
CREATE INDEX ZGEOPLACENAME_ZPT_BR_INDEX ON ZGEOPLACENAME (ZPT_BR);<br>
CREATE INDEX ZGEOPLACENAME_ZRU_INDEX ON ZGEOPLACENAME (ZRU);<br>
CREATE INDEX ZGEOPLACENAME_ZSV_INDEX ON ZGEOPLACENAME (ZSV);<br>
CREATE INDEX ZGEOPLACENAME_ZZH_INDEX ON ZGEOPLACENAME (ZZH);<br>
CREATE INDEX ZGEOPLACENAME_ZZH_TW_INDEX ON ZGEOPLACENAME (ZZH_TW);<br>
CREATE INDEX ZGEOPLACENAME_ZPLACE_INDEX ON ZGEOPLACENAME (ZPLACE);<br>
CREATE INDEX ZGEOPLACENAME_Z_ENT_INDEX ON ZGEOPLACENAME (Z_ENT);<br>
CREATE TABLE Z_PRIMARYKEY (Z_ENT INTEGER PRIMARY KEY, Z_NAME VARCHAR, Z_SUPER INTEGER, Z_MAX INTEGER);<br>
CREATE TABLE Z_METADATA (Z_VERSION INTEGER PRIMARY KEY, Z_UUID VARCHAR(255), Z_PLIST BLOB);<br>
CREATE TABLE Z_MODELCACHE (Z_CONTENT BLOB);<br>
<br>
I haven't fired up Mike T's SQLite Database App to try to figure out how to use it to translate a city name to a tzid, but that might be one way to implement the tzid command.<br>
<br>
> Like it or not, the tzdb identifiers *are* the identifiers used to<br>
> name and select time zones.<br>
<br>
They are the identifiers used to *identify* time zones.<br>
<br>
They should not be the only way to *select* time zones; UIs should be offered that allow people to specify a location and have code figure out the time zone.<br>
<br>
</blockquote></div></div>