branch: externals/excorporate commit 33438100688ee58db2a0350950338e309dbd3df1 Author: Thomas Fitzsimmons <fitz...@fitzsim.org> Commit: Thomas Fitzsimmons <fitz...@fitzsim.org>
Implement time zone conversion function * excorporate-time-zones.el: New file. --- excorporate-time-zones.el | 866 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 866 insertions(+) diff --git a/excorporate-time-zones.el b/excorporate-time-zones.el new file mode 100644 index 0000000..0a2cd80 --- /dev/null +++ b/excorporate-time-zones.el @@ -0,0 +1,866 @@ +;;; excorporate-time-zones.el --- time zone conversion *- lexical-binding: t -*- + +;; Copyright (C) 2021 Free Software Foundation, Inc. + +;; Author: Thomas Fitzsimmons <fitz...@fitzsim.org> +;; Keywords: calendar + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Hash tables and functions that map (current-time-zone) values to +;; time zone names recognized by Exchange servers. + +;; For example: +;; (current-time-zone) => (-14400 "EDT") +;; (exco-time-zone) => "Eastern Standard Time" + +;;; Code: + +;; Generated with: + +;;(insert +;; (concat "(defvar exco--time-zone-olson-to-server " +;; (with-current-buffer +;; (url-retrieve-synchronously +;; (concat "https://raw.githubusercontent.com/unicode-org/cldr/" +;; "master/common/supplemental/windowsZones.xml")) +;; (goto-char (point-min)) +;; (search-forward-regexp "^<!DOC") +;; (move-beginning-of-line nil) +;; (delete-region (point-min) (point)) +;; (let ((table (make-hash-table :test #'equal)) +;; (zone-lines +;; (nth 3 (nth 5 (car (xml-parse-region +;; (point-min) (point-max))))))) +;; (dolist (zone-line zone-lines) +;; (when (and (listp zone-line) (equal (car zone-line) 'mapZone)) +;; (let ((names (split-string +;; (cdaddr (car (cdr zone-line))) " ")) +;; (zone (cdaar (cdr zone-line)))) +;; (dolist (name names) +;; (puthash name zone table))))) +;; (format "%S" table))) +;; " \"A hash table mapping IANA/Olson time zone" +;; " names to server time zone names.\")")) + +(defvar exco--time-zone-olson-to-server + #s(hash-table + size 487 + test equal + rehash-size 1.5 + rehash-threshold 0.8125 + data + ("Etc/GMT+12" "Dateline Standard Time" + "Etc/GMT+11" "UTC-11" + "Pacific/Pago_Pago" "UTC-11" + "Pacific/Niue" "UTC-11" + "Pacific/Midway" "UTC-11" + "America/Adak" "Aleutian Standard Time" + "Pacific/Honolulu" "Hawaiian Standard Time" + "Pacific/Rarotonga" "Hawaiian Standard Time" + "Pacific/Tahiti" "Hawaiian Standard Time" + "Pacific/Johnston" "Hawaiian Standard Time" + "Etc/GMT+10" "Hawaiian Standard Time" + "Pacific/Marquesas" "Marquesas Standard Time" + "America/Anchorage" "Alaskan Standard Time" + "America/Juneau" "Alaskan Standard Time" + "America/Metlakatla" "Alaskan Standard Time" + "America/Nome" "Alaskan Standard Time" + "America/Sitka" "Alaskan Standard Time" + "America/Yakutat" "Alaskan Standard Time" + "Etc/GMT+9" "UTC-09" + "Pacific/Gambier" "UTC-09" + "America/Tijuana" "Pacific Standard Time (Mexico)" + "America/Santa_Isabel" "Pacific Standard Time (Mexico)" + "Etc/GMT+8" "UTC-08" + "Pacific/Pitcairn" "UTC-08" + "America/Los_Angeles" "Pacific Standard Time" + "America/Vancouver" "Pacific Standard Time" + "PST8PDT" "Pacific Standard Time" + "America/Phoenix" "US Mountain Standard Time" + "America/Creston" "US Mountain Standard Time" + "America/Dawson_Creek" "US Mountain Standard Time" + "America/Fort_Nelson" "US Mountain Standard Time" + "America/Hermosillo" "US Mountain Standard Time" + "Etc/GMT+7" "US Mountain Standard Time" + "America/Chihuahua" "Mountain Standard Time (Mexico)" + "America/Mazatlan" "Mountain Standard Time (Mexico)" + "America/Denver" "Mountain Standard Time" + "America/Edmonton" "Mountain Standard Time" + "America/Cambridge_Bay" "Mountain Standard Time" + "America/Inuvik" "Mountain Standard Time" + "America/Yellowknife" "Mountain Standard Time" + "America/Ojinaga" "Mountain Standard Time" + "America/Boise" "Mountain Standard Time" + "MST7MDT" "Mountain Standard Time" + "America/Whitehorse" "Yukon Standard Time" + "America/Dawson" "Yukon Standard Time" + "America/Guatemala" "Central America Standard Time" + "America/Belize" "Central America Standard Time" + "America/Costa_Rica" "Central America Standard Time" + "Pacific/Galapagos" "Central America Standard Time" + "America/Tegucigalpa" "Central America Standard Time" + "America/Managua" "Central America Standard Time" + "America/El_Salvador" "Central America Standard Time" + "Etc/GMT+6" "Central America Standard Time" + "America/Chicago" "Central Standard Time" + "America/Winnipeg" "Central Standard Time" + "America/Rainy_River" "Central Standard Time" + "America/Rankin_Inlet" "Central Standard Time" + "America/Resolute" "Central Standard Time" + "America/Matamoros" "Central Standard Time" + "America/Indiana/Knox" "Central Standard Time" + "America/Indiana/Tell_City" "Central Standard Time" + "America/Menominee" "Central Standard Time" + "America/North_Dakota/Beulah" "Central Standard Time" + "America/North_Dakota/Center" "Central Standard Time" + "America/North_Dakota/New_Salem" "Central Standard Time" + "CST6CDT" "Central Standard Time" + "Pacific/Easter" "Easter Island Standard Time" + "America/Mexico_City" "Central Standard Time (Mexico)" + "America/Bahia_Banderas" "Central Standard Time (Mexico)" + "America/Merida" "Central Standard Time (Mexico)" + "America/Monterrey" "Central Standard Time (Mexico)" + "America/Regina" "Canada Central Standard Time" + "America/Swift_Current" "Canada Central Standard Time" + "America/Bogota" "SA Pacific Standard Time" + "America/Rio_Branco" "SA Pacific Standard Time" + "America/Eirunepe" "SA Pacific Standard Time" + "America/Coral_Harbour" "SA Pacific Standard Time" + "America/Guayaquil" "SA Pacific Standard Time" + "America/Jamaica" "SA Pacific Standard Time" + "America/Cayman" "SA Pacific Standard Time" + "America/Panama" "SA Pacific Standard Time" + "America/Lima" "SA Pacific Standard Time" + "Etc/GMT+5" "SA Pacific Standard Time" + "America/Cancun" "Eastern Standard Time (Mexico)" + "America/New_York" "Eastern Standard Time" + "America/Nassau" "Eastern Standard Time" + "America/Toronto" "Eastern Standard Time" + "America/Iqaluit" "Eastern Standard Time" + "America/Montreal" "Eastern Standard Time" + "America/Nipigon" "Eastern Standard Time" + "America/Pangnirtung" "Eastern Standard Time" + "America/Thunder_Bay" "Eastern Standard Time" + "America/Detroit" "Eastern Standard Time" + "America/Indiana/Petersburg" "Eastern Standard Time" + "America/Indiana/Vincennes" "Eastern Standard Time" + "America/Indiana/Winamac" "Eastern Standard Time" + "America/Kentucky/Monticello" "Eastern Standard Time" + "America/Louisville" "Eastern Standard Time" + "EST5EDT" "Eastern Standard Time" + "America/Port-au-Prince" "Haiti Standard Time" + "America/Havana" "Cuba Standard Time" + "America/Indianapolis" "US Eastern Standard Time" + "America/Indiana/Marengo" "US Eastern Standard Time" + "America/Indiana/Vevay" "US Eastern Standard Time" + "America/Grand_Turk" "Turks And Caicos Standard Time" + "America/Asuncion" "Paraguay Standard Time" + "America/Halifax" "Atlantic Standard Time" + "Atlantic/Bermuda" "Atlantic Standard Time" + "America/Glace_Bay" "Atlantic Standard Time" + "America/Goose_Bay" "Atlantic Standard Time" + "America/Moncton" "Atlantic Standard Time" + "America/Thule" "Atlantic Standard Time" + "America/Caracas" "Venezuela Standard Time" + "America/Cuiaba" "Central Brazilian Standard Time" + "America/Campo_Grande" "Central Brazilian Standard Time" + "America/La_Paz" "SA Western Standard Time" + "America/Antigua" "SA Western Standard Time" + "America/Anguilla" "SA Western Standard Time" + "America/Aruba" "SA Western Standard Time" + "America/Barbados" "SA Western Standard Time" + "America/St_Barthelemy" "SA Western Standard Time" + "America/Kralendijk" "SA Western Standard Time" + "America/Manaus" "SA Western Standard Time" + "America/Boa_Vista" "SA Western Standard Time" + "America/Porto_Velho" "SA Western Standard Time" + "America/Blanc-Sablon" "SA Western Standard Time" + "America/Curacao" "SA Western Standard Time" + "America/Dominica" "SA Western Standard Time" + "America/Santo_Domingo" "SA Western Standard Time" + "America/Grenada" "SA Western Standard Time" + "America/Guadeloupe" "SA Western Standard Time" + "America/Guyana" "SA Western Standard Time" + "America/St_Kitts" "SA Western Standard Time" + "America/St_Lucia" "SA Western Standard Time" + "America/Marigot" "SA Western Standard Time" + "America/Martinique" "SA Western Standard Time" + "America/Montserrat" "SA Western Standard Time" + "America/Puerto_Rico" "SA Western Standard Time" + "America/Lower_Princes" "SA Western Standard Time" + "America/Port_of_Spain" "SA Western Standard Time" + "America/St_Vincent" "SA Western Standard Time" + "America/Tortola" "SA Western Standard Time" + "America/St_Thomas" "SA Western Standard Time" + "Etc/GMT+4" "SA Western Standard Time" + "America/Santiago" "Pacific SA Standard Time" + "America/St_Johns" "Newfoundland Standard Time" + "America/Araguaina" "Tocantins Standard Time" + "America/Sao_Paulo" "E. South America Standard Time" + "America/Cayenne" "SA Eastern Standard Time" + "Antarctica/Rothera" "SA Eastern Standard Time" + "Antarctica/Palmer" "SA Eastern Standard Time" + "America/Fortaleza" "SA Eastern Standard Time" + "America/Belem" "SA Eastern Standard Time" + "America/Maceio" "SA Eastern Standard Time" + "America/Recife" "SA Eastern Standard Time" + "America/Santarem" "SA Eastern Standard Time" + "Atlantic/Stanley" "SA Eastern Standard Time" + "America/Paramaribo" "SA Eastern Standard Time" + "Etc/GMT+3" "SA Eastern Standard Time" + "America/Buenos_Aires" "Argentina Standard Time" + "America/Argentina/La_Rioja" "Argentina Standard Time" + "America/Argentina/Rio_Gallegos" "Argentina Standard Time" + "America/Argentina/Salta" "Argentina Standard Time" + "America/Argentina/San_Juan" "Argentina Standard Time" + "America/Argentina/San_Luis" "Argentina Standard Time" + "America/Argentina/Tucuman" "Argentina Standard Time" + "America/Argentina/Ushuaia" "Argentina Standard Time" + "America/Catamarca" "Argentina Standard Time" + "America/Cordoba" "Argentina Standard Time" + "America/Jujuy" "Argentina Standard Time" + "America/Mendoza" "Argentina Standard Time" + "America/Godthab" "Greenland Standard Time" + "America/Montevideo" "Montevideo Standard Time" + "America/Punta_Arenas" "Magallanes Standard Time" + "America/Miquelon" "Saint Pierre Standard Time" + "America/Bahia" "Bahia Standard Time" + "Etc/GMT+2" "UTC-02" + "America/Noronha" "UTC-02" + "Atlantic/South_Georgia" "UTC-02" + "Atlantic/Azores" "Azores Standard Time" + "America/Scoresbysund" "Azores Standard Time" + "Atlantic/Cape_Verde" "Cape Verde Standard Time" + "Etc/GMT+1" "Cape Verde Standard Time" + "Etc/GMT" "UTC" + "America/Danmarkshavn" "UTC" + "Etc/UTC" "UTC" + "Europe/London" "GMT Standard Time" + "Atlantic/Canary" "GMT Standard Time" + "Atlantic/Faeroe" "GMT Standard Time" + "Europe/Guernsey" "GMT Standard Time" + "Europe/Dublin" "GMT Standard Time" + "Europe/Isle_of_Man" "GMT Standard Time" + "Europe/Jersey" "GMT Standard Time" + "Europe/Lisbon" "GMT Standard Time" + "Atlantic/Madeira" "GMT Standard Time" + "Atlantic/Reykjavik" "Greenwich Standard Time" + "Africa/Ouagadougou" "Greenwich Standard Time" + "Africa/Abidjan" "Greenwich Standard Time" + "Africa/Accra" "Greenwich Standard Time" + "Africa/Banjul" "Greenwich Standard Time" + "Africa/Conakry" "Greenwich Standard Time" + "Africa/Bissau" "Greenwich Standard Time" + "Africa/Monrovia" "Greenwich Standard Time" + "Africa/Bamako" "Greenwich Standard Time" + "Africa/Nouakchott" "Greenwich Standard Time" + "Atlantic/St_Helena" "Greenwich Standard Time" + "Africa/Freetown" "Greenwich Standard Time" + "Africa/Dakar" "Greenwich Standard Time" + "Africa/Lome" "Greenwich Standard Time" + "Africa/Sao_Tome" "Sao Tome Standard Time" + "Africa/Casablanca" "Morocco Standard Time" + "Africa/El_Aaiun" "Morocco Standard Time" + "Europe/Berlin" "W. Europe Standard Time" + "Europe/Andorra" "W. Europe Standard Time" + "Europe/Vienna" "W. Europe Standard Time" + "Europe/Zurich" "W. Europe Standard Time" + "Europe/Busingen" "W. Europe Standard Time" + "Europe/Gibraltar" "W. Europe Standard Time" + "Europe/Rome" "W. Europe Standard Time" + "Europe/Vaduz" "W. Europe Standard Time" + "Europe/Luxembourg" "W. Europe Standard Time" + "Europe/Monaco" "W. Europe Standard Time" + "Europe/Malta" "W. Europe Standard Time" + "Europe/Amsterdam" "W. Europe Standard Time" + "Europe/Oslo" "W. Europe Standard Time" + "Europe/Stockholm" "W. Europe Standard Time" + "Arctic/Longyearbyen" "W. Europe Standard Time" + "Europe/San_Marino" "W. Europe Standard Time" + "Europe/Vatican" "W. Europe Standard Time" + "Europe/Budapest" "Central Europe Standard Time" + "Europe/Tirane" "Central Europe Standard Time" + "Europe/Prague" "Central Europe Standard Time" + "Europe/Podgorica" "Central Europe Standard Time" + "Europe/Belgrade" "Central Europe Standard Time" + "Europe/Ljubljana" "Central Europe Standard Time" + "Europe/Bratislava" "Central Europe Standard Time" + "Europe/Paris" "Romance Standard Time" + "Europe/Brussels" "Romance Standard Time" + "Europe/Copenhagen" "Romance Standard Time" + "Europe/Madrid" "Romance Standard Time" + "Africa/Ceuta" "Romance Standard Time" + "Europe/Warsaw" "Central European Standard Time" + "Europe/Sarajevo" "Central European Standard Time" + "Europe/Zagreb" "Central European Standard Time" + "Europe/Skopje" "Central European Standard Time" + "Africa/Lagos" "W. Central Africa Standard Time" + "Africa/Luanda" "W. Central Africa Standard Time" + "Africa/Porto-Novo" "W. Central Africa Standard Time" + "Africa/Kinshasa" "W. Central Africa Standard Time" + "Africa/Bangui" "W. Central Africa Standard Time" + "Africa/Brazzaville" "W. Central Africa Standard Time" + "Africa/Douala" "W. Central Africa Standard Time" + "Africa/Algiers" "W. Central Africa Standard Time" + "Africa/Libreville" "W. Central Africa Standard Time" + "Africa/Malabo" "W. Central Africa Standard Time" + "Africa/Niamey" "W. Central Africa Standard Time" + "Africa/Ndjamena" "W. Central Africa Standard Time" + "Africa/Tunis" "W. Central Africa Standard Time" + "Etc/GMT-1" "W. Central Africa Standard Time" + "Asia/Amman" "Jordan Standard Time" + "Europe/Bucharest" "GTB Standard Time" + "Asia/Nicosia" "GTB Standard Time" + "Asia/Famagusta" "GTB Standard Time" + "Europe/Athens" "GTB Standard Time" + "Asia/Beirut" "Middle East Standard Time" + "Africa/Cairo" "Egypt Standard Time" + "Europe/Chisinau" "E. Europe Standard Time" + "Asia/Damascus" "Syria Standard Time" + "Asia/Hebron" "West Bank Standard Time" + "Asia/Gaza" "West Bank Standard Time" + "Africa/Johannesburg" "South Africa Standard Time" + "Africa/Bujumbura" "South Africa Standard Time" + "Africa/Gaborone" "South Africa Standard Time" + "Africa/Lubumbashi" "South Africa Standard Time" + "Africa/Maseru" "South Africa Standard Time" + "Africa/Blantyre" "South Africa Standard Time" + "Africa/Maputo" "South Africa Standard Time" + "Africa/Kigali" "South Africa Standard Time" + "Africa/Juba" "South Africa Standard Time" + "Africa/Mbabane" "South Africa Standard Time" + "Africa/Lusaka" "South Africa Standard Time" + "Africa/Harare" "South Africa Standard Time" + "Etc/GMT-2" "South Africa Standard Time" + "Europe/Kiev" "FLE Standard Time" + "Europe/Mariehamn" "FLE Standard Time" + "Europe/Sofia" "FLE Standard Time" + "Europe/Tallinn" "FLE Standard Time" + "Europe/Helsinki" "FLE Standard Time" + "Europe/Vilnius" "FLE Standard Time" + "Europe/Riga" "FLE Standard Time" + "Europe/Uzhgorod" "FLE Standard Time" + "Europe/Zaporozhye" "FLE Standard Time" + "Asia/Jerusalem" "Israel Standard Time" + "Europe/Kaliningrad" "Kaliningrad Standard Time" + "Africa/Khartoum" "Sudan Standard Time" + "Africa/Tripoli" "Libya Standard Time" + "Africa/Windhoek" "Namibia Standard Time" + "Asia/Baghdad" "Arabic Standard Time" + "Europe/Istanbul" "Turkey Standard Time" + "Asia/Riyadh" "Arab Standard Time" + "Asia/Bahrain" "Arab Standard Time" + "Asia/Kuwait" "Arab Standard Time" + "Asia/Qatar" "Arab Standard Time" + "Asia/Aden" "Arab Standard Time" + "Europe/Minsk" "Belarus Standard Time" + "Europe/Moscow" "Russian Standard Time" + "Europe/Kirov" "Russian Standard Time" + "Europe/Simferopol" "Russian Standard Time" + "Africa/Nairobi" "E. Africa Standard Time" + "Antarctica/Syowa" "E. Africa Standard Time" + "Africa/Djibouti" "E. Africa Standard Time" + "Africa/Asmera" "E. Africa Standard Time" + "Africa/Addis_Ababa" "E. Africa Standard Time" + "Indian/Comoro" "E. Africa Standard Time" + "Indian/Antananarivo" "E. Africa Standard Time" + "Africa/Mogadishu" "E. Africa Standard Time" + "Africa/Dar_es_Salaam" "E. Africa Standard Time" + "Africa/Kampala" "E. Africa Standard Time" + "Indian/Mayotte" "E. Africa Standard Time" + "Etc/GMT-3" "E. Africa Standard Time" + "Asia/Tehran" "Iran Standard Time" + "Asia/Dubai" "Arabian Standard Time" + "Asia/Muscat" "Arabian Standard Time" + "Etc/GMT-4" "Arabian Standard Time" + "Europe/Astrakhan" "Astrakhan Standard Time" + "Europe/Ulyanovsk" "Astrakhan Standard Time" + "Asia/Baku" "Azerbaijan Standard Time" + "Europe/Samara" "Russia Time Zone 3" + "Indian/Mauritius" "Mauritius Standard Time" + "Indian/Reunion" "Mauritius Standard Time" + "Indian/Mahe" "Mauritius Standard Time" + "Europe/Saratov" "Saratov Standard Time" + "Asia/Tbilisi" "Georgian Standard Time" + "Europe/Volgograd" "Volgograd Standard Time" + "Asia/Yerevan" "Caucasus Standard Time" + "Asia/Kabul" "Afghanistan Standard Time" + "Asia/Tashkent" "West Asia Standard Time" + "Antarctica/Mawson" "West Asia Standard Time" + "Asia/Oral" "West Asia Standard Time" + "Asia/Aqtau" "West Asia Standard Time" + "Asia/Aqtobe" "West Asia Standard Time" + "Asia/Atyrau" "West Asia Standard Time" + "Indian/Maldives" "West Asia Standard Time" + "Indian/Kerguelen" "West Asia Standard Time" + "Asia/Dushanbe" "West Asia Standard Time" + "Asia/Ashgabat" "West Asia Standard Time" + "Asia/Samarkand" "West Asia Standard Time" + "Etc/GMT-5" "West Asia Standard Time" + "Asia/Yekaterinburg" "Ekaterinburg Standard Time" + "Asia/Karachi" "Pakistan Standard Time" + "Asia/Qyzylorda" "Qyzylorda Standard Time" + "Asia/Calcutta" "India Standard Time" + "Asia/Colombo" "Sri Lanka Standard Time" + "Asia/Katmandu" "Nepal Standard Time" + "Asia/Almaty" "Central Asia Standard Time" + "Antarctica/Vostok" "Central Asia Standard Time" + "Asia/Urumqi" "Central Asia Standard Time" + "Indian/Chagos" "Central Asia Standard Time" + "Asia/Bishkek" "Central Asia Standard Time" + "Asia/Qostanay" "Central Asia Standard Time" + "Etc/GMT-6" "Central Asia Standard Time" + "Asia/Dhaka" "Bangladesh Standard Time" + "Asia/Thimphu" "Bangladesh Standard Time" + "Asia/Omsk" "Omsk Standard Time" + "Asia/Rangoon" "Myanmar Standard Time" + "Indian/Cocos" "Myanmar Standard Time" + "Asia/Bangkok" "SE Asia Standard Time" + "Antarctica/Davis" "SE Asia Standard Time" + "Indian/Christmas" "SE Asia Standard Time" + "Asia/Jakarta" "SE Asia Standard Time" + "Asia/Pontianak" "SE Asia Standard Time" + "Asia/Phnom_Penh" "SE Asia Standard Time" + "Asia/Vientiane" "SE Asia Standard Time" + "Asia/Saigon" "SE Asia Standard Time" + "Etc/GMT-7" "SE Asia Standard Time" + "Asia/Barnaul" "Altai Standard Time" + "Asia/Hovd" "W. Mongolia Standard Time" + "Asia/Krasnoyarsk" "North Asia Standard Time" + "Asia/Novokuznetsk" "North Asia Standard Time" + "Asia/Novosibirsk" "N. Central Asia Standard Time" + "Asia/Tomsk" "Tomsk Standard Time" + "Asia/Shanghai" "China Standard Time" + "Asia/Hong_Kong" "China Standard Time" + "Asia/Macau" "China Standard Time" + "Asia/Irkutsk" "North Asia East Standard Time" + "Asia/Singapore" "Singapore Standard Time" + "Asia/Brunei" "Singapore Standard Time" + "Asia/Makassar" "Singapore Standard Time" + "Asia/Kuala_Lumpur" "Singapore Standard Time" + "Asia/Kuching" "Singapore Standard Time" + "Asia/Manila" "Singapore Standard Time" + "Etc/GMT-8" "Singapore Standard Time" + "Australia/Perth" "W. Australia Standard Time" + "Asia/Taipei" "Taipei Standard Time" + "Asia/Ulaanbaatar" "Ulaanbaatar Standard Time" + "Asia/Choibalsan" "Ulaanbaatar Standard Time" + "Australia/Eucla" "Aus Central W. Standard Time" + "Asia/Chita" "Transbaikal Standard Time" + "Asia/Tokyo" "Tokyo Standard Time" + "Asia/Jayapura" "Tokyo Standard Time" + "Pacific/Palau" "Tokyo Standard Time" + "Asia/Dili" "Tokyo Standard Time" + "Etc/GMT-9" "Tokyo Standard Time" + "Asia/Pyongyang" "North Korea Standard Time" + "Asia/Seoul" "Korea Standard Time" + "Asia/Yakutsk" "Yakutsk Standard Time" + "Asia/Khandyga" "Yakutsk Standard Time" + "Australia/Adelaide" "Cen. Australia Standard Time" + "Australia/Broken_Hill" "Cen. Australia Standard Time" + "Australia/Darwin" "AUS Central Standard Time" + "Australia/Brisbane" "E. Australia Standard Time" + "Australia/Lindeman" "E. Australia Standard Time" + "Australia/Sydney" "AUS Eastern Standard Time" + "Australia/Melbourne" "AUS Eastern Standard Time" + "Pacific/Port_Moresby" "West Pacific Standard Time" + "Antarctica/DumontDUrville" "West Pacific Standard Time" + "Pacific/Truk" "West Pacific Standard Time" + "Pacific/Guam" "West Pacific Standard Time" + "Pacific/Saipan" "West Pacific Standard Time" + "Etc/GMT-10" "West Pacific Standard Time" + "Australia/Hobart" "Tasmania Standard Time" + "Australia/Currie" "Tasmania Standard Time" + "Antarctica/Macquarie" "Tasmania Standard Time" + "Asia/Vladivostok" "Vladivostok Standard Time" + "Asia/Ust-Nera" "Vladivostok Standard Time" + "Australia/Lord_Howe" "Lord Howe Standard Time" + "Pacific/Bougainville" "Bougainville Standard Time" + "Asia/Srednekolymsk" "Russia Time Zone 10" + "Asia/Magadan" "Magadan Standard Time" + "Pacific/Norfolk" "Norfolk Standard Time" + "Asia/Sakhalin" "Sakhalin Standard Time" + "Pacific/Guadalcanal" "Central Pacific Standard Time" + "Antarctica/Casey" "Central Pacific Standard Time" + "Pacific/Ponape" "Central Pacific Standard Time" + "Pacific/Kosrae" "Central Pacific Standard Time" + "Pacific/Noumea" "Central Pacific Standard Time" + "Pacific/Efate" "Central Pacific Standard Time" + "Etc/GMT-11" "Central Pacific Standard Time" + "Asia/Kamchatka" "Russia Time Zone 11" + "Asia/Anadyr" "Russia Time Zone 11" + "Pacific/Auckland" "New Zealand Standard Time" + "Antarctica/McMurdo" "New Zealand Standard Time" + "Etc/GMT-12" "UTC+12" + "Pacific/Tarawa" "UTC+12" + "Pacific/Majuro" "UTC+12" + "Pacific/Kwajalein" "UTC+12" + "Pacific/Nauru" "UTC+12" + "Pacific/Funafuti" "UTC+12" + "Pacific/Wake" "UTC+12" + "Pacific/Wallis" "UTC+12" + "Pacific/Fiji" "Fiji Standard Time" + "Pacific/Chatham" "Chatham Islands Standard Time" + "Etc/GMT-13" "UTC+13" + "Pacific/Enderbury" "UTC+13" + "Pacific/Fakaofo" "UTC+13" + "Pacific/Tongatapu" "Tonga Standard Time" + "Pacific/Apia" "Samoa Standard Time" + "Pacific/Kiritimati" "Line Islands Standard Time" + "Etc/GMT-14" "Line Islands Standard Time")) + "A hash table mapping IANA/Olson time zone names to server time zone names.") + +;; Generated with: +;;(defun zdump-line-to-current-time-zone-value () +;; "Convert a zdump line to the format returned by `current-time-zone'." +;; (unless (eobp) +;; (search-forward " ") +;; (search-forward " ") +;; (let ((start (point))) +;; (forward-word) +;; (let* ((offset-string (buffer-substring-no-properties start (point))) +;; (offset-number-hours +;; (* (string-to-number (substring offset-string 0 3)) 3600)) +;; (offset-number +;; (if (= (length offset-string) 3) +;; offset-number-hours +;; (let ((offset-number-minutes +;; (string-to-number (substring offset-string 3)))) +;; (if (< offset-number-hours 0) +;; (- offset-number-hours (* offset-number-minutes 60)) +;; (+ offset-number-hours (* offset-number-minutes 60))))))) +;; (prog1 +;; (cond ((eolp) +;; (list offset-number offset-string)) +;; ((progn (search-forward " ") (= (char-after (point)) 9)) +;; (list offset-number offset-string)) +;; (t +;; (let ((start (point))) +;; (forward-word) +;; (list offset-number +;; (buffer-substring-no-properties start (point)))))) +;; (move-end-of-line nil) +;; (forward-char)))))) +;; +;;(insert +;; (concat +;; "(defvar exco--time-zone-emacs-to-olson " +;; (let ((table (make-hash-table :test #'equal))) +;; (dolist (file +;; (split-string +;; (org-trim (shell-command-to-string +;; "find /usr/share/zoneinfo/right -type f")) +;; "\n")) +;; (with-temp-buffer +;; (goto-char (point-min)) +;; (shell-command (format "zdump -c 2020,2021 -i %S" file) t) +;; (next-line) +;; (next-line) +;; (while (not (eobp)) +;; (let* ((key (zdump-line-to-current-time-zone-value)) +;; (value (substring file (length "/usr/share/zoneinfo/right/"))) +;; (values (gethash key table))) +;; (if values +;; (unless (member value values) +;; (puthash key (cons value values) table)) +;; (puthash key (list value) table)))))) +;; (format "%S" table)) +;; "(concat \"A hash table mapping `current-time-zone' values to\" +;; \" IANA/Olson time zone names.\")")) + +;; `exco-time-zone' only uses one of these, but I thought knowing this +;; mapping might be generally useful. +(defvar exco--time-zone-emacs-to-olson + #s(hash-table + size 97 + test equal + rehash-size 1.5 + rehash-threshold 0.8125 + data + ((-43200 "-12") ("Etc/GMT+12") + (-39600 "SST") ("Pacific/Pago_Pago") + (-39600 "-11") ("Etc/GMT+11" "Pacific/Niue") + (-36000 "HST") ("HST" "America/Adak" "Pacific/Honolulu") + (-36000 "-10") ("Etc/GMT+10" "Pacific/Tahiti" "Pacific/Rarotonga") + (-34200 "-0930") ("Pacific/Marquesas") + (-32400 "HDT") ("America/Adak") + (-32400 "AKST") ("America/Sitka" "America/Anchorage" "America/Nome" + "America/Metlakatla" "America/Yakutat" "America/Juneau") + (-32400 "-09") ("Etc/GMT+9" "Pacific/Gambier") + (-28800 "PST") ("America/Dawson" "America/Vancouver" + "America/Whitehorse" "America/Tijuana" + "America/Los_Angeles" "PST8PDT") + (-28800 "AKDT") ("America/Sitka" "America/Anchorage" "America/Nome" + "America/Metlakatla" "America/Yakutat" "America/Juneau") + (-28800 "-08") ("Etc/GMT+8" "Pacific/Pitcairn") + (-25200 "PDT") ("America/Dawson" "America/Vancouver" + "America/Whitehorse" "America/Tijuana" + "America/Los_Angeles" "PST8PDT") + (-25200 "MST") ("MST7MDT" "America/Dawson" "America/Yellowknife" + "America/Fort_Nelson" "America/Creston" + "America/Cambridge_Bay" "America/Boise" + "America/Mazatlan" "America/Chihuahua" "America/Phoenix" + "America/Inuvik" "America/Hermosillo" "America/Edmonton" + "America/Whitehorse" "America/Dawson_Creek" + "America/Ojinaga" "America/Denver" "MST") + (-25200 "-07") ("Etc/GMT+7") + (-21600 "MDT") ("MST7MDT" "America/Yellowknife" "America/Cambridge_Bay" + "America/Boise" "America/Mazatlan" "America/Chihuahua" + "America/Inuvik" "America/Edmonton" "America/Ojinaga" + "America/Denver") + (-21600 "CST") ("CST6CDT" "America/Managua" "America/Belize" + "America/Regina" "America/Rankin_Inlet" + "America/Tegucigalpa" "America/Resolute" + "America/North_Dakota/Beulah" + "America/North_Dakota/New_Salem" + "America/North_Dakota/Center" "America/Merida" + "America/Guatemala" "America/Winnipeg" "America/Chicago" + "America/Swift_Current" "America/Menominee" + "America/Monterrey" "America/Mexico_City" + "America/El_Salvador" "America/Indiana/Tell_City" + "America/Indiana/Knox" "America/Costa_Rica" + "America/Matamoros" "America/Bahia_Banderas" + "America/Rainy_River") + (-21600 "-06") ("Etc/GMT+6" "Pacific/Easter" "Pacific/Galapagos") + (-18000 "EST") ("EST5EDT" "America/Detroit" "America/Port-au-Prince" + "America/Jamaica" "America/Iqaluit" "America/Grand_Turk" + "America/Kentucky/Monticello" + "America/Kentucky/Louisville" "America/Cancun" + "America/Toronto" "America/Atikokan" "America/Panama" + "America/Pangnirtung" "America/Indiana/Indianapolis" + "America/Indiana/Vevay" "America/Indiana/Vincennes" + "America/Indiana/Petersburg" "America/Indiana/Winamac" + "America/Indiana/Marengo" "America/Nipigon" + "America/Nassau" "America/New_York" + "America/Thunder_Bay" "EST") + (-18000 "CST") ("America/Havana") + (-18000 "CDT") ("CST6CDT" "America/Rankin_Inlet" "America/Resolute" + "America/North_Dakota/Beulah" + "America/North_Dakota/New_Salem" + "America/North_Dakota/Center" "America/Merida" + "America/Winnipeg" "America/Chicago" "America/Menominee" + "America/Monterrey" "America/Mexico_City" + "America/Indiana/Tell_City" "America/Indiana/Knox" + "America/Matamoros" "America/Bahia_Banderas" + "America/Rainy_River") + (-18000 "-05") ("America/Rio_Branco" "America/Eirunepe" "America/Lima" + "America/Bogota" "America/Guayaquil" "Etc/GMT+5" + "Pacifibc/Easter") + (-14400 "EDT") ("EST5EDT" "America/Detroit" "America/Port-au-Prince" + "America/Iqaluit" "America/Grand_Turk" + "America/Kentucky/Monticello" + "America/Kentucky/Louisville" "America/Toronto" + "America/Pangnirtung" "America/Indiana/Indianapolis" + "America/Indiana/Vevay" "America/Indiana/Vincennes" + "America/Indiana/Petersburg" "America/Indiana/Winamac" + "America/Indiana/Marengo" "America/Nipigon" + "America/Nassau" "America/New_York" + "America/Thunder_Bay") + (-14400 "CDT") ("America/Havana") + (-14400 "AST") ("Atlantic/Bermuda" "America/Thule" "America/Glace_Bay" + "America/Goose_Bay" "America/Puerto_Rico" + "America/Santo_Domingo" "America/Curacao" + "America/Barbados" "America/Blanc-Sablon" + "America/Martinique" "America/Moncton" "America/Halifax" + "America/Port_of_Spain") + (-14400 "-04") ("America/Santiago" "America/Cuiaba" "America/Caracas" + "America/La_Paz" "America/Porto_Velho" "America/Guyana" + "America/Campo_Grande" "America/Manaus" + "America/Asuncion" "America/Boa_Vista" "Etc/GMT+4") + (-12600 "NST") ("America/St_Johns") + (-10800 "ADT") ("Atlantic/Bermuda" "America/Thule" "America/Glace_Bay" + "America/Goose_Bay" "America/Moncton" "America/Halifax") + (-10800 "-03") ("Atlantic/Stanley" "America/Miquelon" "America/Santiago" + "America/Santarem" "America/Argentina/Ushuaia" + "America/Argentina/Jujuy" + "America/Argentina/Rio_Gallegos" + "America/Argentina/La_Rioja" + "America/Argentina/San_Juan" "America/Argentina/Salta" + "America/Argentina/San_Luis" "America/Argentina/Tucuman" + "America/Argentina/Mendoza" + "America/Argentina/Catamarca" + "America/Argentina/Cordoba" + "America/Argentina/Buenos_Aires" + "America/Bahia" "America/Cayenne" "America/Sao_Paulo" + "America/Maceio" "America/Fortaleza" + "America/Paramaribo" "America/Araguaina" "America/Belem" + "America/Nuuk" "America/Punta_Arenas" + "America/Montevideo" "America/Asuncion" "America/Recife" + "Etc/GMT+3" "Antarctica/Palmer" "Antarctica/Rothera") + ( -9000 "NDT") ("America/St_Johns") + ( -7200 "-02") ("Atlantic/South_Georgia" "America/Miquelon" + "America/Nuuk" "America/Noronha" "Etc/GMT+2") + ( -3600 "-01") ("Atlantic/Cape_Verde" "Atlantic/Azores" + "America/Scoresbysund" "Etc/GMT+1") + ( 0 "+00") ("Atlantic/Azores" "Africa/El_Aaiun" "Africa/Casablanca" + "America/Scoresbysund" "Antarctica/Troll") + ( 0 "-00") ("Factory") + ( 0 "GMT") ("Atlantic/Reykjavik" "Africa/Abidjan" "Africa/Monrovia" + "Africa/Sao_Tome" "Africa/Bissau" "Africa/Accra" + "Europe/London" "Europe/Dublin" "America/Danmarkshavn" + "Etc/GMT") + ( 0 "UTC") ("Etc/UTC") + ( 0 "WET") ("Atlantic/Faroe" "Atlantic/Canary" "Atlantic/Madeira" + "Europe/Lisbon" "WET") + ( +3600 "+01") ("Africa/El_Aaiun" "Africa/Casablanca" "Etc/GMT-1") + ( +3600 "BST") ("Europe/London") + ( +3600 "CET") ("Africa/Tunis" "Africa/Ceuta" "Africa/Algiers" "CET" + "Europe/Oslo" "Europe/Berlin" "Europe/Amsterdam" + "Europe/Rome" "Europe/Budapest" "Europe/Tirane" + "Europe/Copenhagen" "Europe/Belgrade" "Europe/Malta" + "Europe/Warsaw" "Europe/Vienna" "Europe/Stockholm" + "Europe/Paris" "Europe/Andorra" "Europe/Brussels" + "Europe/Madrid" "Europe/Gibraltar" "Europe/Zurich" + "Europe/Monaco" "Europe/Prague" "Europe/Luxembourg") + ( +3600 "IST") ("Europe/Dublin") + ( +3600 "MET") ("MET") + ( +3600 "WAT") ("Africa/Ndjamena" "Africa/Lagos") + ( +3600 "WEST") ("Atlantic/Faroe" "Atlantic/Canary" "Atlantic/Madeira" + "Europe/Lisbon" "WET") + ( +7200 "+02") ("Etc/GMT-2" "Antarctica/Troll") + ( +7200 "CAT") ("Africa/Khartoum" "Africa/Maputo" "Africa/Windhoek") + ( +7200 "CEST") ("Africa/Ceuta" "CET" "Europe/Oslo" "Europe/Berlin" + "Europe/Amsterdam" "Europe/Rome" "Europe/Budapest" + "Europe/Tirane" "Europe/Copenhagen" "Europe/Belgrade" + "Europe/Malta" "Europe/Warsaw" "Europe/Vienna" + "Europe/Stockholm" "Europe/Paris" "Europe/Andorra" + "Europe/Brussels" "Europe/Madrid" "Europe/Gibraltar" + "Europe/Zurich" "Europe/Monaco" "Europe/Prague" + "Europe/Luxembourg") + ( +7200 "EET") ("Africa/Cairo" "Africa/Tripoli" "Europe/Zaporozhye" + "Europe/Kiev" "Europe/Riga" "Europe/Chisinau" + "Europe/Athens" "Europe/Helsinki" "Europe/Uzhgorod" + "Europe/Bucharest" "Europe/Kaliningrad" "Europe/Sofia" + "Europe/Vilnius" "Europe/Tallinn" "EET" "Asia/Beirut" + "Asia/Amman" "Asia/Damascus" "Asia/Nicosia" + "Asia/Hebron" "Asia/Famagusta" "Asia/Gaza") + ( +7200 "IST") ("Asia/Jerusalem") + ( +7200 "MEST") ("MET") + ( +7200 "SAST") ("Africa/Johannesburg") + (+10800 "+03") ("Europe/Volgograd" "Europe/Minsk" "Europe/Istanbul" + "Europe/Kirov" "Etc/GMT-3" "Asia/Riyadh" "Asia/Baghdad" + "Asia/Qatar" "Antarctica/Syowa") + (+10800 "EAT") ("Africa/Nairobi" "Africa/Juba") + (+10800 "EEST") ("Europe/Zaporozhye" "Europe/Kiev" "Europe/Riga" + "Europe/Chisinau" "Europe/Athens" "Europe/Helsinki" + "Europe/Uzhgorod" "Europe/Bucharest" "Europe/Sofia" + "Europe/Vilnius" "Europe/Tallinn" "EET" "Asia/Beirut" + "Asia/Amman" "Asia/Damascus" "Asia/Nicosia" + "Asia/Hebron" "Asia/Famagusta" "Asia/Gaza") + (+10800 "IDT") ("Asia/Jerusalem") + (+10800 "MSK") ("Europe/Moscow" "Europe/Simferopol") + (+12600 "+0330") ("Asia/Tehran") + (+14400 "+04") ("Indian/Mauritius" "Indian/Reunion" "Indian/Mahe" + "Europe/Samara" "Europe/Volgograd" "Europe/Astrakhan" + "Europe/Saratov" "Europe/Ulyanovsk" "Etc/GMT-4" + "Asia/Baku" "Asia/Yerevan" "Asia/Dubai" "Asia/Tbilisi") + (+16200 "+0430") ("Asia/Tehran" "Asia/Kabul") + (+18000 "+05") ("Indian/Maldives" "Indian/Kerguelen" "Etc/GMT-5" + "Asia/Aqtobe" "Asia/Oral" "Asia/Aqtau" "Asia/Tashkent" + "Asia/Dushanbe" "Asia/Atyrau" "Asia/Yekaterinburg" + "Asia/Samarkand" "Asia/Ashgabat" "Asia/Qyzylorda" + "Antarctica/Mawson") + (+18000 "PKT") ("Asia/Karachi") + (+19800 "+0530") ("Asia/Colombo") + (+19800 "IST") ("Asia/Kolkata") + (+20700 "+0545") ("Asia/Kathmandu") + (+21600 "+06") ("Indian/Chagos" "Etc/GMT-6" "Asia/Qostanay" + "Asia/Thimphu" "Asia/Bishkek" "Asia/Urumqi" "Asia/Omsk" + "Asia/Almaty" "Asia/Dhaka" "Antarctica/Vostok") + (+23400 "+0630") ("Indian/Cocos" "Asia/Yangon") + (+25200 "+07") ("Indian/Christmas" "Etc/GMT-7" "Asia/Hovd" + "Asia/Novokuznetsk" "Asia/Bangkok" "Asia/Tomsk" + "Asia/Barnaul" "Asia/Ho_Chi_Minh" "Asia/Novosibirsk" + "Asia/Krasnoyarsk" "Antarctica/Davis") + (+25200 "WIB") ("Asia/Jakarta" "Asia/Pontianak") + (+28800 "+08") ("Etc/GMT-8" "Asia/Brunei" "Asia/Kuching" + "Asia/Ulaanbaatar" "Asia/Kuala_Lumpur" "Asia/Singapore" + "Asia/Choibalsan" "Asia/Irkutsk" "Antarctica/Casey") + (+28800 "AWST") ("Australia/Perth") + (+28800 "CST") ("Asia/Macau" "Asia/Shanghai" "Asia/Taipei") + (+28800 "HKT") ("Asia/Hong_Kong") + (+28800 "PST") ("Asia/Manila") + (+28800 "WITA") ("Asia/Makassar") + (+31500 "+0845") ("Australia/Eucla") + (+32400 "+09") ("Etc/GMT-9" "Asia/Yakutsk" "Asia/Chita" "Asia/Khandyga" + "Asia/Dili" "Pacific/Palau") + (+32400 "JST") ("Asia/Tokyo") + (+32400 "KST") ("Asia/Seoul" "Asia/Pyongyang") + (+32400 "WIT") ("Asia/Jayapura") + (+34200 "ACST") ("Australia/Darwin" "Australia/Adelaide" + "Australia/Broken_Hill") + (+36000 "+10") ("Etc/GMT-10" "Asia/Ust-Nera" "Asia/Vladivostok" + "Pacific/Chuuk" "Pacific/Port_Moresby" + "Antarctica/DumontDUrville") + (+36000 "AEST") ("Australia/Melbourne" "Australia/Lindeman" + "Australia/Hobart" "Australia/Brisbane" + "Australia/Sydney" "Antarctica/Macquarie") + (+36000 "ChST") ("Pacific/Guam") + (+37800 "+1030") ("Australia/Lord_Howe") + (+37800 "ACDT") ("Australia/Adelaide" "Australia/Broken_Hill") + (+39600 "+11") ("Australia/Lord_Howe" "Etc/GMT-11" "Asia/Magadan" + "Asia/Sakhalin" "Asia/Srednekolymsk" "Pacific/Norfolk" + "Pacific/Pohnpei" "Pacific/Guadalcanal" "Pacific/Kosrae" + "Pacific/Bougainville" "Pacific/Noumea" "Pacific/Efate" + "Antarctica/Casey") + (+39600 "AEDT") ("Australia/Melbourne" "Australia/Hobart" + "Australia/Sydney" "Antarctica/Macquarie") + (+43200 "+12") ("Etc/GMT-12" "Asia/Anadyr" "Asia/Kamchatka" + "Pacific/Wake" "Pacific/Majuro" "Pacific/Norfolk" + "Pacific/Nauru" "Pacific/Funafuti" "Pacific/Fiji" + "Pacific/Kwajalein" "Pacific/Tarawa" "Pacific/Wallis") + (+43200 "NZST") ("Pacific/Auckland") + (+45900 "+1245") ("Pacific/Chatham") + (+46800 "+13") ("Etc/GMT-13" "Pacific/Tongatapu" "Pacific/Enderbury" + "Pacific/Fiji" "Pacific/Fakaofo" "Pacific/Apia") + (+46800 "NZDT") ("Pacific/Auckland") + (+49500 "+1345") ("Pacific/Chatham") + (+50400 "+14") ("Etc/GMT-14" "Pacific/Kiritimati" "Pacific/Apia"))) + (concat "A hash table mapping `current-time-zone' values to" + " IANA/Olson time zone names.")) + +(defun excorporate-customize-time-zone () + "Prompt for a server-style time zone from a list of valid values." + (interactive) + (let ((zone (completing-read + "Excorporate time zone: " + (cons "Emacs Built-in" + (hash-table-values exco--time-zone-olson-to-server)) + nil t))) + (customize-save-variable 'excorporate-time-zone + (if (equal zone "Emacs Built-in") nil zone)))) + +(defun exco-time-zone (&optional emacs-time-zone) + "Return server style time zone string. +Return `excorporate-time-zone' if it is non-nil, or look up the +time zone based on `current-time-zone' otherwise. +If EMACS-TIME-ZONE is specified, convert it to a server time zone." + (if (and (not emacs-time-zone) excorporate-time-zone) + excorporate-time-zone + (or + (catch 'found + (dolist (zone + (gethash (or emacs-time-zone (current-time-zone)) + exco--time-zone-emacs-to-olson)) + (let ((server-zone (gethash zone exco--time-zone-olson-to-server))) + (when server-zone (throw 'found server-zone))))) + (error (concat "Excorporate: Could not compute server time zone; " + "Run `excorporate-customize-time-zone'"))))) + +(provide 'excorporate-time-zones) + +;;; excorporate-time-zones.el ends here