diff --git a/framework/Timezone/test/Horde/Timezone/IcalendarTest.php b/framework/Timezone/test/Horde/Timezone/IcalendarTest.php index 754cb45f5b7..e5703889023 100644 --- a/framework/Timezone/test/Horde/Timezone/IcalendarTest.php +++ b/framework/Timezone/test/Horde/Timezone/IcalendarTest.php @@ -34,4 +34,14 @@ public function testEtc() $tz->getZone('Etc/UTC')->toVtimezone()->exportVcalendar() ); } + + public function testBug14221() + { + $tz = new Horde_Timezone_Mock('budapest'); + file_put_contents('/tmp/budapest.ics', $tz->getZone('Europe/Budapest')->toVtimezone()->exportVcalendar()); + $this->assertStringEqualsFile( + __DIR__ . '/fixtures/budapest.ics', + $tz->getZone('Europe/Budapest')->toVtimezone()->exportVcalendar() + ); + } } diff --git a/framework/Timezone/test/Horde/Timezone/fixtures/budapest b/framework/Timezone/test/Horde/Timezone/fixtures/budapest new file mode 100644 index 00000000000..448526d6c2f --- /dev/null +++ b/framework/Timezone/test/Horde/Timezone/fixtures/budapest @@ -0,0 +1,127 @@ +############################################################################### + +# Europe + +# EU rules are for the European Union, previously known as the EC, EEC, +# Common Market, etc. + +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule EU 1977 1980 - Apr Sun>=1 1:00u 1:00 S +Rule EU 1977 only - Sep lastSun 1:00u 0 - +Rule EU 1978 only - Oct 1 1:00u 0 - +Rule EU 1979 1995 - Sep lastSun 1:00u 0 - +Rule EU 1981 max - Mar lastSun 1:00u 1:00 S +Rule EU 1996 max - Oct lastSun 1:00u 0 - +# The most recent directive covers the years starting in 2002. See: +# Directive 2000/84/EC of the European Parliament and of the Council +# of 19 January 2001 on summer-time arrangements. +# http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:32000L0084:EN:NOT + +# W-Eur differs from EU only in that W-Eur uses standard time. +Rule W-Eur 1977 1980 - Apr Sun>=1 1:00s 1:00 S +Rule W-Eur 1977 only - Sep lastSun 1:00s 0 - +Rule W-Eur 1978 only - Oct 1 1:00s 0 - +Rule W-Eur 1979 1995 - Sep lastSun 1:00s 0 - +Rule W-Eur 1981 max - Mar lastSun 1:00s 1:00 S +Rule W-Eur 1996 max - Oct lastSun 1:00s 0 - + +# Older C-Eur rules are for convenience in the tables. +# From 1977 on, C-Eur differs from EU only in that C-Eur uses standard time. +Rule C-Eur 1916 only - Apr 30 23:00 1:00 S +Rule C-Eur 1916 only - Oct 1 1:00 0 - +Rule C-Eur 1917 1918 - Apr Mon>=15 2:00s 1:00 S +Rule C-Eur 1917 1918 - Sep Mon>=15 2:00s 0 - +Rule C-Eur 1940 only - Apr 1 2:00s 1:00 S +Rule C-Eur 1942 only - Nov 2 2:00s 0 - +Rule C-Eur 1943 only - Mar 29 2:00s 1:00 S +Rule C-Eur 1943 only - Oct 4 2:00s 0 - +Rule C-Eur 1944 1945 - Apr Mon>=1 2:00s 1:00 S +# Whitman gives 1944 Oct 7; go with Shanks & Pottenger. +Rule C-Eur 1944 only - Oct 2 2:00s 0 - +# From Jesper Nørgaard Welen (2008-07-13): +# +# I found what is probably a typo of 2:00 which should perhaps be 2:00s +# in the C-Eur rule from tz database version 2008d (this part was +# corrected in version 2008d). The circumstantial evidence is simply the +# tz database itself, as seen below: +# +# Zone Europe/Paris 0:09:21 - LMT 1891 Mar 15 0:01 +# 0:00 France WE%sT 1945 Sep 16 3:00 +# +# Zone Europe/Monaco 0:29:32 - LMT 1891 Mar 15 +# 0:00 France WE%sT 1945 Sep 16 3:00 +# +# Zone Europe/Belgrade 1:22:00 - LMT 1884 +# 1:00 1:00 CEST 1945 Sep 16 2:00s +# +# Rule France 1945 only - Sep 16 3:00 0 - +# Rule Belgium 1945 only - Sep 16 2:00s 0 - +# Rule Neth 1945 only - Sep 16 2:00s 0 - +# +# The rule line to be changed is: +# +# Rule C-Eur 1945 only - Sep 16 2:00 0 - +# +# It seems that Paris, Monaco, Rule France, Rule Belgium all agree on +# 2:00 standard time, e.g. 3:00 local time. However there are no +# countries that use C-Eur rules in September 1945, so the only items +# affected are apparently these fictitious zones that translate acronyms +# CET and MET: +# +# Zone CET 1:00 C-Eur CE%sT +# Zone MET 1:00 C-Eur ME%sT +# +# It this is right then the corrected version would look like: +# +# Rule C-Eur 1945 only - Sep 16 2:00s 0 - +# +# A small step for mankind though 8-) +Rule C-Eur 1945 only - Sep 16 2:00s 0 - +Rule C-Eur 1977 1980 - Apr Sun>=1 2:00s 1:00 S +Rule C-Eur 1977 only - Sep lastSun 2:00s 0 - +Rule C-Eur 1978 only - Oct 1 2:00s 0 - +Rule C-Eur 1979 1995 - Sep lastSun 2:00s 0 - +Rule C-Eur 1981 max - Mar lastSun 2:00s 1:00 S +Rule C-Eur 1996 max - Oct lastSun 2:00s 0 - + +# E-Eur differs from EU only in that E-Eur switches at midnight local time. +Rule E-Eur 1977 1980 - Apr Sun>=1 0:00 1:00 S +Rule E-Eur 1977 only - Sep lastSun 0:00 0 - +Rule E-Eur 1978 only - Oct 1 0:00 0 - +Rule E-Eur 1979 1995 - Sep lastSun 0:00 0 - +Rule E-Eur 1981 max - Mar lastSun 0:00 1:00 S +Rule E-Eur 1996 max - Oct lastSun 0:00 0 - +# Hungary +# From Paul Eggert (2014-07-15): +# Dates for 1916-1945 are taken from: +# Oross A. Jelen a múlt jövője: a nyári időszámítás Magyarországon 1916-1945. +# National Archives of Hungary (2012-10-29). +# http://mnl.gov.hu/a_het_dokumentuma/a_nyari_idoszamitas_magyarorszagon_19161945.html +# This source does not always give times, which are taken from Shanks +# & Pottenger (which disagree about the dates). +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Hungary 1918 only - Apr 1 3:00 1:00 S +Rule Hungary 1918 only - Sep 16 3:00 0 - +Rule Hungary 1919 only - Apr 15 3:00 1:00 S +Rule Hungary 1919 only - Nov 24 3:00 0 - +Rule Hungary 1945 only - May 1 23:00 1:00 S +Rule Hungary 1945 only - Nov 1 0:00 0 - +Rule Hungary 1946 only - Mar 31 2:00s 1:00 S +Rule Hungary 1946 1949 - Oct Sun>=1 2:00s 0 - +Rule Hungary 1947 1949 - Apr Sun>=4 2:00s 1:00 S +Rule Hungary 1950 only - Apr 17 2:00s 1:00 S +Rule Hungary 1950 only - Oct 23 2:00s 0 - +Rule Hungary 1954 1955 - May 23 0:00 1:00 S +Rule Hungary 1954 1955 - Oct 3 0:00 0 - +Rule Hungary 1956 only - Jun Sun>=1 0:00 1:00 S +Rule Hungary 1956 only - Sep lastSun 0:00 0 - +Rule Hungary 1957 only - Jun Sun>=1 1:00 1:00 S +Rule Hungary 1957 only - Sep lastSun 3:00 0 - +Rule Hungary 1980 only - Apr 6 1:00 1:00 S +# Zone NAME GMTOFF RULES FORMAT [UNTIL] +Zone Europe/Budapest 1:16:20 - LMT 1890 Oct + 1:00 C-Eur CE%sT 1918 + 1:00 Hungary CE%sT 1941 Apr 8 + 1:00 C-Eur CE%sT 1945 + 1:00 Hungary CE%sT 1980 Sep 28 2:00s + 1:00 EU CE%sT \ No newline at end of file diff --git a/framework/Timezone/test/Horde/Timezone/fixtures/budapest.ics b/framework/Timezone/test/Horde/Timezone/fixtures/budapest.ics new file mode 100644 index 00000000000..2f87999f151 --- /dev/null +++ b/framework/Timezone/test/Horde/Timezone/fixtures/budapest.ics @@ -0,0 +1,213 @@ +BEGIN:VTIMEZONE +TZID:Europe/Budapest +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19160430T230000 +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19161001T010000 +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19170416T020000 +RRULE:FREQ=YEARLY;BYMONTH=4;BYMONTHDAY=15,16,17,18,19,20,21;BYDAY=1MO;UNTIL + =19180421T000000Z +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19170917T020000 +RRULE:FREQ=YEARLY;BYMONTH=9;BYMONTHDAY=15,16,17,18,19,20,21;BYDAY=1MO;UNTIL + =19180915T000000Z +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19180401T030000 +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19180916T030000 +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19190415T030000 +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19191124T030000 +TZNAME:CE-T +END:STANDARD +BEGIN:STANDARD +TZOFFSETFROM:+0100 +TZOFFSETTO:+0100 +DTSTART:19421102T020000 +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19430329T020000 +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19431004T020000 +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19440403T020000 +RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1MO;UNTIL=19450401T010000Z +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19441002T020000 +TZNAME:CE-T +END:STANDARD +BEGIN:STANDARD +TZOFFSETFROM:+0100 +TZOFFSETTO:+0100 +DTSTART:19450916T020000 +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19450501T230000 +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19451101T000000 +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19460331T020000 +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19461006T020000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19491002T010000Z +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19470406T020000 +RRULE:FREQ=YEARLY;BYMONTH=4;BYMONTHDAY=4,5,6,7,8,9,10;BYDAY=1SU;UNTIL=19490 + 410T010000Z +TZNAME:CEST +END:DAYLIGHT +BEGIN:DAYLIGHT +TZOFFSETFROM:+0200 +TZOFFSETTO:+0200 +DTSTART:19500417T020000 +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19501023T020000 +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19540523T000000 +RRULE:FREQ=YEARLY;BYMONTH=5;BYMONTHDAY=23;UNTIL=19550522T230000Z +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19541003T000000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYMONTHDAY=3;UNTIL=19551002T230000Z +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19560603T000000 +RRULE:FREQ=YEARLY;BYMONTH=6;BYDAY=1SU;UNTIL=19560602T230000Z +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19560930T000000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9;UNTIL=19560929T230000Z +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19570602T010000 +RRULE:FREQ=YEARLY;BYMONTH=6;BYDAY=1SU;UNTIL=19570602T000000Z +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19570929T030000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9;UNTIL=19570929T020000Z +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19800406T010000 +TZNAME:CEST +END:DAYLIGHT +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19800406T010000 +RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU;UNTIL=19800406T000000Z +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19800928T010000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9;UNTIL=19950923T230000Z +TZNAME:CE-T +END:STANDARD +BEGIN:DAYLIGHT +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +DTSTART:19810329T010000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 +TZNAME:CEST +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +DTSTART:19961027T010000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:CE-T +END:STANDARD +END:VTIMEZONE