Commits

Jon Nylander committed f9e3e30

Continued work to solidify detection of Fiji/Kamchatka. Success.

However, there seems to be some major confusion as to when DST
actually started this year in Damascus. Windows claims not until
April 5th, IANA claims march 29th. How to solve?

  • Participants
  • Parent commits 285b6e9

Comments (0)

Files changed (2)

       'use strict';
       var HEMISPHERE_SOUTH = 's',
           
-          /* This is the year used to do primary checkups */
-          REFERENCE_YEAR = 2011,
           /**
            * Gets the offset in minutes from UTC for a certain date.
            * @param {Date} date
               if (year !== undefined) {
                 d.setFullYear(year);
               }
+              d.setMonth(month);
               d.setDate(date);
-              d.setMonth(month);
               return d;
           },
 
           },
 
           get_june_offset = function (year) {
-
               return get_date_offset(get_date(year, 5, 2));
           },
 
           /**
            * Private method.
-           * Checks whether a given date is in daylight savings time.
+           * Checks whether a given date is in daylight saving time.
            * If the date supplied is after august, we assume that we're checking
            * for southern hemisphere DST.
            * @param {Date} date
            * @returns {Boolean}
            */
           date_is_dst = function (date) {
-              var base_offset = ((date.getMonth() > 7 ? get_june_offset(date.getFullYear())
-                                                  : get_january_offset(date.getFullYear()))),
-                  date_offset = get_date_offset(date);
+              var is_southern = date.getMonth() > 7,
+                  base_offset = is_southern ? get_june_offset(date.getFullYear()) : 
+                                              get_january_offset(date.getFullYear()),
+                  date_offset = get_date_offset(date),
+                  is_west = base_offset < 0,
+                  dst_offset = base_offset - date_offset;
+                  
+              if (!is_west && !is_southern) {
+                  return dst_offset < 0;
+              }
 
-
-              return (base_offset - date_offset) !== 0;
+              return dst_offset !== 0;
           },
 
           /**
            */
 
           lookup_key = function () {
-              var january_offset = get_january_offset(REFERENCE_YEAR),
-                  june_offset = get_june_offset(REFERENCE_YEAR),
+              var january_offset = get_january_offset(),
+                  june_offset = get_june_offset(),
                   diff = january_offset - june_offset;
 
               if (diff < 0) {
 
             var ru_pre_dst_change = new Date(2010, 6, 15, 1, 0, 0, 0), // In 2010 Russia had DST, this allows us to detect Russia :)
                 dst_starts = {
-                    'America/Denver':       new Date(2011, 2, 13, 3, 0, 0, 0),
-                    'America/Mazatlan':     new Date(2011, 3, 3, 3, 0, 0, 0),
-                    'America/Chicago':      new Date(2011, 2, 13, 3, 0, 0, 0),
-                    'America/Mexico_City':  new Date(2011, 3, 3, 3, 0, 0, 0),
-                    'America/Asuncion':     new Date(2012, 9, 7, 3, 0, 0, 0),
-                    'America/Santiago':     new Date(2012, 9, 3, 3, 0, 0, 0),
+                    'America/Denver': new Date(2011, 2, 13, 3, 0, 0, 0),
+                    'America/Mazatlan': new Date(2011, 3, 3, 3, 0, 0, 0),
+                    'America/Chicago': new Date(2011, 2, 13, 3, 0, 0, 0),
+                    'America/Mexico_City': new Date(2011, 3, 3, 3, 0, 0, 0),
+                    'America/Asuncion': new Date(2012, 9, 7, 3, 0, 0, 0),
+                    'America/Santiago': new Date(2012, 9, 3, 3, 0, 0, 0),
                     'America/Campo_Grande': new Date(2012, 9, 21, 5, 0, 0, 0),
-                    'America/Montevideo':   new Date(2011, 9, 2, 3, 0, 0, 0),
-                    'America/Sao_Paulo':    new Date(2011, 9, 16, 5, 0, 0, 0),
-                    'America/Los_Angeles':  new Date(2011, 2, 13, 8, 0, 0, 0),
+                    'America/Montevideo': new Date(2011, 9, 2, 3, 0, 0, 0),
+                    'America/Sao_Paulo': new Date(2011, 9, 16, 5, 0, 0, 0),
+                    'America/Los_Angeles': new Date(2011, 2, 13, 8, 0, 0, 0),
                     'America/Santa_Isabel': new Date(2011, 3, 5, 8, 0, 0, 0),
-                    'America/Havana':       new Date(2012, 2, 10, 2, 0, 0, 0),
-                    'America/New_York':     new Date(2012, 2, 10, 7, 0, 0, 0),
-                    'Europe/Helsinki':      new Date(2013, 2, 31, 5, 0, 0, 0),
-                    'Pacific/Auckland':     new Date(2011, 8, 26, 7, 0, 0, 0),
-                    'Pacific/Fiji':         new Date(2010, 10, 29, 23, 0, 0, 0),
-                    'America/Halifax':      new Date(2011, 2, 13, 6, 0, 0, 0),
-                    'America/Goose_Bay':    new Date(2011, 2, 13, 2, 1, 0, 0),
-                    'America/Miquelon':     new Date(2011, 2, 13, 5, 0, 0, 0),
-                    'America/Godthab':      new Date(2011, 2, 27, 1, 0, 0, 0),
+                    'America/Havana': new Date(2012, 2, 10, 2, 0, 0, 0),
+                    'America/New_York': new Date(2012, 2, 10, 7, 0, 0, 0),
+                    'Europe/Helsinki': new Date(2013, 2, 31, 5, 0, 0, 0),
+                    'Pacific/Auckland': new Date(2011, 8, 26, 7, 0, 0, 0),
+                    'America/Halifax': new Date(2011, 2, 13, 6, 0, 0, 0),
+                    'America/Goose_Bay': new Date(2011, 2, 13, 2, 1, 0, 0),
+                    'America/Miquelon': new Date(2011, 2, 13, 5, 0, 0, 0),
+                    'America/Godthab': new Date(2011, 2, 27, 1, 0, 0, 0),
                     'Europe/Moscow': ru_pre_dst_change,
                     'Asia/Amman': new Date(2013, 2, 29, 1, 0, 0, 0),
                     'Asia/Beirut': new Date(2013, 2, 31, 2, 0, 0, 0),
                     'Asia/Damascus': new Date(2013, 3, 6, 2, 0, 0, 0),
                     'Asia/Jerusalem': new Date(2013, 2, 29, 5, 0, 0, 0),
-                    'Asia/Nicosia': new Date(2013, 2, 31, 3, 1, 0, 0),
                     'Asia/Yekaterinburg': ru_pre_dst_change,
                     'Asia/Omsk': ru_pre_dst_change,
                     'Asia/Krasnoyarsk': ru_pre_dst_change,
                     'Asia/Baku': new Date(2013, 2, 31, 4, 0, 0),
                     'Asia/Yerevan': new Date(2013, 2, 31, 3, 0, 0),
                     'Asia/Kamchatka': ru_pre_dst_change,
+                    'Asia/Gaza': new Date(2010, 2, 27, 4, 0, 0),
+                    'Africa/Cairo': new Date(2010, 4, 1, 3, 0, 0),
                     'Europe/Minsk': ru_pre_dst_change,
                     'Pacific/Apia': new Date(2010, 10, 1, 1, 0, 0, 0),
+                    'Pacific/Fiji': new Date(2010, 11, 1, 0, 0, 0),
                     'Australia/Perth': new Date(2008, 10, 1, 1, 0, 0, 0)
                 };
 
               'America/Chicago':      ['America/Chicago', 'America/Mexico_City'],
               'America/Santiago':     ['America/Santiago', 'America/Asuncion', 'America/Campo_Grande'],
               'America/Montevideo':   ['America/Montevideo', 'America/Sao_Paulo'],
-              'Asia/Beirut':          ['Asia/Amman', 'Asia/Jerusalem', 'Asia/Beirut', 'Asia/Nicosia', 'Europe/Helsinki','Asia/Damascus'],
+              'Asia/Beirut':          ['Asia/Amman', 'Asia/Jerusalem', 'Asia/Beirut', 'Europe/Helsinki','Asia/Damascus'],
               'Pacific/Auckland':     ['Pacific/Auckland', 'Pacific/Fiji'],
               'America/Los_Angeles':  ['America/Los_Angeles', 'America/Santa_Isabel'],
               'America/New_York':     ['America/Havana', 'America/New_York'],
               'Asia/Tokyo':           ['Asia/Irkutsk'],
               'Australia/Brisbane':   ['Asia/Yakutsk'],
               'Pacific/Noumea':       ['Asia/Vladivostok'],
-              'Pacific/Tarawa':       ['Asia/Kamchatka'],
+              'Pacific/Tarawa':       ['Asia/Kamchatka', 'Pacific/Fiji'],
               'Pacific/Tongatapu':    ['Pacific/Apia'],
               'Asia/Baghdad':         ['Europe/Minsk'],
-              'Asia/Baku':            ['Asia/Yerevan','Asia/Baku']
+              'Asia/Baku':            ['Asia/Yerevan','Asia/Baku'],
+              'Africa/Johannesburg':  ['Asia/Gaza', 'Africa/Cairo']
           },
 
           timezone_name = tz_name,

File test/smoke_tests.sh

 'America/Sao_Paulo'
 'Asia/Gaza'
 'Europe/Helsinki'
-'Europe/Istanbul'
 'Asia/Damascus'
 'Asia/Jerusalem'
 'Pacific/Fiji'
 'America/Havana'
 'America/Goose_Bay'
 'America/Miquelon'
-'Africa/Cairo'
 'Europe/Moscow'
 'Asia/Yekaterinburg'
 'Asia/Omsk'