diff --git a/src/corelib/time/qtimezoneprivate_data_p.h b/src/corelib/time/qtimezoneprivate_data_p.h index 8dbeb415048..28fbff2d842 100644 --- a/src/corelib/time/qtimezoneprivate_data_p.h +++ b/src/corelib/time/qtimezoneprivate_data_p.h @@ -768,39 +768,43 @@ static constexpr UtcData utcDataTable[] = { { 7657,-43200 }, // UTC-12:00 { 7667,-39600 }, // UTC-11:00 { 7677,-36000 }, // UTC-10:00 - { 7687,-32400 }, // UTC-09:00 - { 7697,-28800 }, // UTC-08:00 - { 7707,-25200 }, // UTC-07:00 - { 7717,-21600 }, // UTC-06:00 - { 7727,-18000 }, // UTC-05:00 - { 7737,-16200 }, // UTC-04:30 - { 7747,-14400 }, // UTC-04:00 - { 7757,-12600 }, // UTC-03:30 - { 7767,-10800 }, // UTC-03:00 - { 7777, -7200 }, // UTC-02:00 - { 7787, -3600 }, // UTC-01:00 - { 7797, 0 }, // UTC - { 7821, 3600 }, // UTC+01:00 - { 7831, 7200 }, // UTC+02:00 - { 7841, 10800 }, // UTC+03:00 - { 7851, 12600 }, // UTC+03:30 - { 7861, 14400 }, // UTC+04:00 - { 7871, 16200 }, // UTC+04:30 - { 7881, 18000 }, // UTC+05:00 - { 7891, 19800 }, // UTC+05:30 - { 7901, 20700 }, // UTC+05:45 - { 7911, 21600 }, // UTC+06:00 - { 7921, 23400 }, // UTC+06:30 - { 7931, 25200 }, // UTC+07:00 - { 7941, 28800 }, // UTC+08:00 - { 7951, 30600 }, // UTC+08:30 - { 7961, 32400 }, // UTC+09:00 - { 7971, 34200 }, // UTC+09:30 - { 7981, 36000 }, // UTC+10:00 - { 7991, 39600 }, // UTC+11:00 - { 8001, 43200 }, // UTC+12:00 - { 8011, 46800 }, // UTC+13:00 - { 8021, 50400 }, // UTC+14:00 + { 7687,-34200 }, // UTC-09:30 + { 7697,-32400 }, // UTC-09:00 + { 7707,-28800 }, // UTC-08:00 + { 7717,-25200 }, // UTC-07:00 + { 7727,-21600 }, // UTC-06:00 + { 7737,-18000 }, // UTC-05:00 + { 7747,-16200 }, // UTC-04:30 + { 7757,-14400 }, // UTC-04:00 + { 7767,-12600 }, // UTC-03:30 + { 7777,-10800 }, // UTC-03:00 + { 7787, -7200 }, // UTC-02:00 + { 7797, -3600 }, // UTC-01:00 + { 7807, 0 }, // UTC + { 7831, 3600 }, // UTC+01:00 + { 7841, 7200 }, // UTC+02:00 + { 7851, 10800 }, // UTC+03:00 + { 7861, 12600 }, // UTC+03:30 + { 7871, 14400 }, // UTC+04:00 + { 7881, 16200 }, // UTC+04:30 + { 7891, 18000 }, // UTC+05:00 + { 7901, 19800 }, // UTC+05:30 + { 7911, 20700 }, // UTC+05:45 + { 7921, 21600 }, // UTC+06:00 + { 7931, 23400 }, // UTC+06:30 + { 7941, 25200 }, // UTC+07:00 + { 7951, 28800 }, // UTC+08:00 + { 7961, 30600 }, // UTC+08:30 + { 7971, 31500 }, // UTC+08:45 + { 7981, 32400 }, // UTC+09:00 + { 7991, 34200 }, // UTC+09:30 + { 8001, 36000 }, // UTC+10:00 + { 8011, 37800 }, // UTC+10:30 + { 8021, 39600 }, // UTC+11:00 + { 8031, 43200 }, // UTC+12:00 + { 8041, 45900 }, // UTC+12:45 + { 8051, 46800 }, // UTC+13:00 + { 8061, 50400 }, // UTC+14:00 }; static constexpr char windowsIdData[] = { @@ -1489,28 +1493,31 @@ static constexpr char ianaIdData[] = { 0x6f, 0x72, 0x73, 0x65, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, -0x2d, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x39, 0x3a, 0x30, 0x30, -0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, -0x37, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x36, 0x3a, 0x30, 0x30, 0x0, 0x55, -0x54, 0x43, 0x2d, 0x30, 0x35, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, -0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, -0x2d, 0x30, 0x33, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x30, 0x30, -0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, -0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x20, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x30, 0x3a, -0x30, 0x30, 0x20, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, -0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, -0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, -0x33, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, -0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, -0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, -0x2b, 0x30, 0x35, 0x3a, 0x34, 0x35, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x30, 0x30, -0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, -0x37, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, -0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, -0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, -0x2b, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x31, 0x3a, 0x30, 0x30, -0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, -0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x34, 0x3a, 0x30, 0x30, 0x0 +0x2d, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x39, 0x3a, 0x33, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x39, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, +0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x37, 0x3a, 0x30, 0x30, 0x0, 0x55, +0x54, 0x43, 0x2d, 0x30, 0x36, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x35, 0x3a, +0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, +0x2d, 0x30, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x33, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, +0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, +0x54, 0x43, 0x20, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x20, 0x55, 0x54, 0x43, +0x2d, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, +0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x33, 0x30, 0x0, 0x55, +0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, +0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, +0x2b, 0x30, 0x35, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x34, 0x35, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, +0x36, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x37, 0x3a, 0x30, 0x30, 0x0, 0x55, +0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, +0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x34, 0x35, 0x0, 0x55, 0x54, 0x43, +0x2b, 0x30, 0x39, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, 0x33, 0x30, +0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, +0x30, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, +0x54, 0x43, 0x2b, 0x31, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32, 0x3a, +0x34, 0x35, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, +0x2b, 0x31, 0x34, 0x3a, 0x30, 0x30, 0x0 }; static constexpr char aliasIdData[] = { diff --git a/util/locale_database/cldr2qtimezone.py b/util/locale_database/cldr2qtimezone.py index 2129d48b8b2..c382d78cd20 100755 --- a/util/locale_database/cldr2qtimezone.py +++ b/util/locale_database/cldr2qtimezone.py @@ -185,6 +185,18 @@ def main(out, err): subsequent_indent=' ', width=80)) + '\n') return 1 + # Offsets of the windows tables, that are whole numbers of minutes, in minutes: + winOff = set(m for m, s in (divmod(v, 60) for k, v in windowsIdList) if s == 0) + winUtc = set(f'UTC-{h:02}:{m:02}' + for h, m in (divmod(-o, 60) for o in winOff if o < 0)).union( + f'UTC+{h:02}:{m:02}' + for h, m in (divmod(o, 60) for o in winOff if o > 0)) + # All such offsets should be represented by entries in utcIdList: + newUtc = winUtc.difference(n for n, o in utcIdList) + if newUtc: + err.write(f'Please add {", ".join(newUtc)} to zonedata.utcIdList\n') + return 1 + out.write('Input files parsed, now writing data\n') try: diff --git a/util/locale_database/zonedata.py b/util/locale_database/zonedata.py index bf320388010..79f4ede7548 100644 --- a/util/locale_database/zonedata.py +++ b/util/locale_database/zonedata.py @@ -17,17 +17,23 @@ here, research the relevant zone's offset and add a new entry to the list of twoples, preserving the ordering. Internet search engines and timeanddate.com can help with researching the offset. Note that some UTC offset zones (giving only the hour) are present in windowsIdList. +When adding an entry to windowsIdList, check whether its offset +corresponds to that of some entry in utcIdList; if not, add such an +entry. The utcIdList is again a list of tuples (name, offset), associating various UTC-offset names with their offsets in seconds. Aside from 'UTC' itself, shared with windowsIdList, these include minutes in -their offsets even when they are whole hour offsets. It is not clear -where this particular list of offsets came from, but entries should -not be removed as they make up the available zones of the UTC -back-end. (That recognizes other offset zones, and its is-available -check will accept them, but it leaves them out of its list. There are, -after all, thousands of possible offset zones, but relatively few are -widely used.) +their offsets even when they are whole hour offsets. The list contains +the UTC-equivalents of all offsets seen in the windowsIdList, plus the +whole hours out to ±14 hours, the two verbose forms of UTC±00:00 and +any legacy entries from past Windows zone offsets. Entries should not +be removed, even if the relevant Windows ID becomes obsolete or +switches to a different offset, as they make up the available zones of +the UTC back-end. (That recognizes other offset zones, and its +is-available check will accept them, but it leaves them out of its +list. There are, after all, thousands of possible offset zones, but +relatively few are widely used.) Note: -00:00 (without the UTC prefix) was introduced in RFC3339 as a way to indicate that a date-time has been converted to UTC but its use @@ -51,6 +57,7 @@ utcIdList = ( ('UTC-12:00', -43200), ('UTC-11:00', -39600), ('UTC-10:00', -36000), + ('UTC-09:30', -34200), ('UTC-09:00', -32400), ('UTC-08:00', -28800), ('UTC-07:00', -25200), @@ -79,11 +86,14 @@ utcIdList = ( ('UTC+07:00', 25200), ('UTC+08:00', 28800), ('UTC+08:30', 30600), + ('UTC+08:45', 31500), ('UTC+09:00', 32400), ('UTC+09:30', 34200), ('UTC+10:00', 36000), + ('UTC+10:30', 37800), ('UTC+11:00', 39600), ('UTC+12:00', 43200), + ('UTC+12:45', 45900), ('UTC+13:00', 46800), ('UTC+14:00', 50400), )