diff --git a/build.gradle b/build.gradle index 950caa5..47514ae 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { plugins { id "ca.coglinc.javacc" version "2.4.0" - id "org.sonarqube" version "4.0.0.2929" + id "org.sonarqube" version "6.2.0.5505" } // Apply the java plugin to add support for Java diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8801379..3bc5ff6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionSha256Sum=03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip -networkTimeout=10000 -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/src/main/java/ch/poole/openinghoursparser/DateWithOffset.java b/src/main/java/ch/poole/openinghoursparser/DateWithOffset.java index 6ba62ce..8f2678a 100644 --- a/src/main/java/ch/poole/openinghoursparser/DateWithOffset.java +++ b/src/main/java/ch/poole/openinghoursparser/DateWithOffset.java @@ -82,16 +82,23 @@ public boolean undefinedDay() { return day == UNDEFINED_MONTH_DAY && nthWeekDay == null && weekDayOffset == null && varDate == null; } + /** + * Check for an undefined year value + * + * @return true if the year is undefined + */ + public boolean undefinedYear() { + return year == YearRange.UNDEFINED_YEAR; + } + @Override public String toString() { StringBuilder b = new StringBuilder(); - if (year != YearRange.UNDEFINED_YEAR) { + if (!undefinedYear()) { b.append(year); } if (month != null) { - if (year != YearRange.UNDEFINED_YEAR) { - b.append(" "); - } + addSpaceIfYearisPresent(b); b.append(month); } if (nthWeekDay != null) { @@ -104,14 +111,12 @@ public String toString() { b.append(']'); } if (day != UNDEFINED_MONTH_DAY) { - if (year != YearRange.UNDEFINED_YEAR || month != null) { + if (!undefinedYear() || month != null) { b.append(" "); } - b.append(String.format(Locale.US, "%02d",day)); + b.append(String.format(Locale.US, "%02d", day)); } else if (varDate != null) { - if (year != YearRange.UNDEFINED_YEAR) { - b.append(" "); - } + addSpaceIfYearisPresent(b); b.append(varDate); } // offsets @@ -137,6 +142,17 @@ public String toString() { return b.toString(); } + /** + * Add a space to separate a year value from the following data + * + * @param b the StringBuilder + */ + private void addSpaceIfYearisPresent(@NotNull StringBuilder b) { + if (!undefinedYear()) { + b.append(" "); + } + } + @Override public boolean equals(Object other) { if (other instanceof DateWithOffset) { diff --git a/src/main/java/ch/poole/openinghoursparser/OpeningHoursParser.jj b/src/main/java/ch/poole/openinghoursparser/OpeningHoursParser.jj index 35a39cc..8d7d501 100644 --- a/src/main/java/ch/poole/openinghoursparser/OpeningHoursParser.jj +++ b/src/main/java/ch/poole/openinghoursparser/OpeningHoursParser.jj @@ -917,32 +917,33 @@ DateRange date_range() : ) ( endDate = datewithoffset(startDate.undefinedDay()) + ( + mdr.interval = interval() + { + if (startDate.day != DateWithOffset.UNDEFINED_MONTH_DAY || endDate.day != DateWithOffset.UNDEFINED_MONTH_DAY || startDate.varDate!=null || endDate.varDate!=null) { + throw new OpeningHoursParseException(tr("interval_not_allowed_here"), token != null ? token.next : null); + } + } + )? { if (strict && to != null) { throw new OpeningHoursParseException(tr("to_instead_of_dash"), token != null ? token.next : null); } - if ((startDate.undefinedDay() && !endDate.undefinedDay()) || (!startDate.undefinedDay() && endDate.undefinedDay())) { + if ((startDate.undefinedDay() || endDate.undefinedDay()) && mdr.interval == 0 && (!startDate.undefinedYear() || !endDate.undefinedYear())) { if (strict) { throw new OpeningHoursParseException(tr("missing_day_in_range", startDate.toString(), endDate.toString()), token != null ? token.next : null); } else { - // fix this + // fix this up if (startDate.undefinedDay()) { startDate.setDay(1); - } else { + } + if (endDate.undefinedDay()) { endDate.setDay(Month.lastDay(endDate.getYear(), endDate.getMonth())); } } } mdr.endDate = endDate; } - ( - mdr.interval = interval() - { - if (startDate.day != DateWithOffset.UNDEFINED_MONTH_DAY || endDate.day != DateWithOffset.UNDEFINED_MONTH_DAY || startDate.varDate!=null || endDate.varDate!=null) { - throw new OpeningHoursParseException(tr("interval_not_allowed_here"), token != null ? token.next : null); - } - } - )? ) | < PLUS > diff --git a/src/test/java/ch/poole/openinghoursparser/UnitTest.java b/src/test/java/ch/poole/openinghoursparser/UnitTest.java index cf30152..640779f 100644 --- a/src/test/java/ch/poole/openinghoursparser/UnitTest.java +++ b/src/test/java/ch/poole/openinghoursparser/UnitTest.java @@ -814,6 +814,63 @@ public void dateRange() { fail(pex.getMessage()); } } + + @Test + public void dateRange2() { + OpeningHoursParser parser = new OpeningHoursParser(new ByteArrayInputStream("1999 Jun -2001 Jul".getBytes())); + try { + List rules = parser.rules(false); + assertEquals(1, rules.size()); + Rule r = rules.get(0); + assertEquals(1, r.dates.size()); + DateRange range = r.dates.get(0); + DateWithOffset start = range.getStartDate(); + assertNotNull(start); + assertEquals(1999, start.getYear()); + assertEquals(Month.JUN, start.getMonth()); + assertEquals(1, start.getDay()); + DateWithOffset end = range.getEndDate(); + assertNotNull(end); + assertEquals(2001, end.getYear()); + assertEquals(Month.JUL, end.getMonth()); + assertEquals(31, end.getDay()); + } catch (ParseException pex) { + fail(pex.getMessage()); + } + } + + @Test + public void dateRange3() { + OpeningHoursParser parser = new OpeningHoursParser(new ByteArrayInputStream("1999 Jun -2001 Jul".getBytes())); + try { + List rules = parser.rules(true); + fail("this should have thrown an exception"); + } catch (ParseException pex) { + // + } + } + + @Test + public void dateRange4() { + OpeningHoursParser parser = new OpeningHoursParser(new ByteArrayInputStream("1999 Jun -2001 Jul/7".getBytes())); + try { + List rules = parser.rules(false); + assertEquals(1, rules.size()); + Rule r = rules.get(0); + assertEquals(1, r.dates.size()); + DateRange range = r.dates.get(0); + DateWithOffset start = range.getStartDate(); + assertNotNull(start); + assertEquals(1999, start.getYear()); + assertEquals(Month.JUN, start.getMonth()); + DateWithOffset end = range.getEndDate(); + assertEquals(2001, end.getYear()); + assertEquals(Month.JUL, end.getMonth()); + assertEquals(7, range.getInterval()); + } catch (ParseException pex) { + fail(pex.getMessage()); + } + } @Test public void invalidDateRange() { diff --git a/test-data/oh.txt-result b/test-data/oh.txt-result index a117d66..ea9d272 100644 --- a/test-data/oh.txt-result +++ b/test-data/oh.txt-result @@ -5870,7 +5870,7 @@ 0 11:30-17:00,18:00-21:00 0 11:30-17:00,18:00-22:30 0 11:30-17:00; Fr-Sa 11:30-21:00; Su 12:00-15:30 -0 11:30-17:00; Sep 03-Jun 30 Mo-Fr off; Sep 19-Apr 29 off +0 11:30-17:00; Sep 03-Jun Mo-Fr off; Sep 19-Apr 29 off 0 11:30-17:00; Su off 0 11:30-17:00; We-Sa 11:30-16:00,18:00-24:00; Su off 0 11:30-17:30 @@ -8612,7 +8612,7 @@ 0 2010 Dec 16,2011 Jan 20,Feb 24,Mar 17: 19:00+ 0 2010 Jul 03-Aug 01: open 0 2011 Jan 07 Tu-Fr 15:00-18:00 -0 2011 Jul-Aug: Mo-Su 10:00-17:00 +0 2011 Jul 01-Aug 31: Mo-Su 10:00-17:00 0 2013 1 1 @@ -13345,7 +13345,7 @@ 0 Apr 15-30 08:30-15:00, Sa-Su off; May 01-31 08:30-17:00; Jun 01-Aug 20 08:30-18:00; Aug 21-Sep 30 08:30-17:00; Oct 01-Oct 15 08:30-17:00, Sa-Su off 0 Apr 15-Jun 30 10:00-16:30; Jul 01-Aug 31 10:00-17:30; Sep 01-Oct 31 10:00-16:30 0 Apr 15-Oct 03: Tu-We 14:00-18:00; Th-Su 11:00-18:00 || "Individuelle Öffnungszeiten nach Absprache" -0 Apr 15-Oct 31 13:30-22:00 +0 Apr 15-Oct 13:30-22:00 0 Apr 15-Oct 14 06:00-22:30; Oct 15-Apr 14 06:30-20:30 0 Apr 15-Oct 14 06:30-22:30; Oct 15-Apr 14 06:30-20:30 0 Apr 15-Oct 14 06:30-22:30; Oct 15-Apr 14 06:30-20:30 @@ -13531,7 +13531,7 @@ 0 Apr-Nov 11:00-22:00; We off 0 Apr-Nov 11:00-23:00 0 Apr-Nov 13:00-23:00 -0 Apr 01-Nov 15 +0 Apr-Nov 15 0 Apr-Nov: Fr-Su 14:00-17:00 0 Apr-Nov: Mo-Fr 10:00-18:00; Sa 09:00-12:00; Dec-Mar: Mo 13:00-18:00; Tu-Su 09:00-12:00,13:00-18:00 0 Apr-Nov: Mo-Fr 11:00-sunset; Sa,Su 10:00-sunset @@ -15173,13 +15173,13 @@ 0 easter -3 days-easter +1 day 11:00-21:00; May 29-Aug 30 11:00-23:00; Sep 06-Dec 20 Th 17:30-21:00, Fr-Sa 11:30-21:00, Su 11:30-16:00 0 easter -42 days 0 easter -60 days-easter -2 days,Oct 25-Dec 24: "je ca. 2 Monate vor Ostern und Weihnachten, siehe www.rk-schoko.de" -0 easter-Aug 31 10:00-16:00 +0 easter-Aug 10:00-16:00 0 easter-Dec 31 12:00-22:00; Mo off; Jun-Sep 12:00-22:00 0 easter-Nov 01 10:00-19:00; Nov 01-easter 10:00-17:00 0 easter-Nov 01: Mo-Su 11:00-19:00 0 easter-Nov Su[1]: Su 13:00-17:00; Su[1,3] 13:00-17:00 "Schmiedevorführung" -0 easter-Oct 31 -0 easter-Oct 31 09:00-20:00 +0 easter-Oct +0 easter-Oct 09:00-20:00 0 easter-Oct 01 12:00-20:00 "circa season" 0 easter-Oct 15: Tu-Sa 11:00-17:00, Su,PH 14:00-17:00 || "Sonderöffnungen und Führungen nach telefonischer Vereinbarung" 0 easter-Oct 26: Sa,Su,PH 10:00-12:00,13:30-17:00 @@ -15188,7 +15188,7 @@ 0 easter-Oct 31: Mo-Sa 13:00-18:00 0 easter-Oct 03 "only Su 14:00-16:00" 0 easter-Oct Su[2]: Su,PH 11:00-17:00; "außerdem nach Vereinbarung" -0 easter-Sep 30 +0 easter-Sep 0 easter sunset+ 0 "easter to winter" 1 @@ -19542,8 +19542,8 @@ 1 0 Mar-Nov 12:30-22:30 0 Mar-Nov 13:00-22:00 -0 Mar 01-Nov 15 -0 Mar 01-Nov 02 +0 Mar-Nov 15 +0 Mar-Nov 02 0 Mar-Nov 06:00-23:00 0 Mar-Nov: Fr 14:00-18:00; Mar-Nov: Sa 10:00-16:00 0 Mar-Nov: Fr 14:00-18:00, Sa 09:00-15:00; Dec-Feb: Sa 09:00-15:00 @@ -19953,7 +19953,7 @@ 0 May 02-Oct 31 Tu-Su 11:00-19:00; "Announce visit at other times" 0 May 02-Oct 05 Mo-Su,PH 10:00-13:00,14:00-18:00 0 May 02-Sep 30: Mo-Fr 10:00-24:00, Sa-Su 08:30-24:00 -0 May 02-Sep 30 Mo-Fr 09:00-23:00 +0 May 02-Sep Mo-Fr 09:00-23:00 0 May 30-Nov 15: 00:00-24:00 0 May 03-Nov 08: Sa 08:00-12:00 0 May 03-Oct 25: Tu 08:00-12:00 @@ -58654,7 +58654,7 @@ 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH 09:00-16:00 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off -0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off; 2016 Feb-Mar off "Wasserschaden" +0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off; 2016 Feb 01-Mar 31 off "Wasserschaden" 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-14:00 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-14:00 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-15:00 @@ -83599,7 +83599,7 @@ 0 Mo off; Tu-Th 15:00-19:00; Fr 13:00-20:00; Sa 10:00-15:00 0 Mo off; Tu,Th 15:00-19:00; We,Fr,Su off; Sa 10:00-14:00 0 Mo off; Tu-Th 15:00-21:00; Fr 15:00-22:00; Sa 13:00-22:00; Su,PH 13:00-21:00; "Zavírací doba dle návštěvosti." -0 Mo off; Tu-Th 15:00-22:00; Fr 15:00-23:00; Sa 18:00-23:00; Su,PH off; 2016 Jun-Aug Sa off; 2016 Jun-Aug Mo-Fr 11:00-22:00; 2016 Jul 18-31 off +0 Mo off; Tu-Th 15:00-22:00; Fr 15:00-23:00; Sa 18:00-23:00; Su,PH off; 2016 Jun 01-Aug 31 Sa off; 2016 Jun 01-Aug 31 Mo-Fr 11:00-22:00; 2016 Jul 18-31 off 0 Mo off; Tu-Th 15:00-23:00; Fr 15:00-03:00; Sa 12:00-03:00; Su off 0 Mo off; Tu-Th 15:00-23:00, Fr-Su 13:00-01:00 0 Mo off; Tu,Th 15:30-18:30; We,Fr 09:30-12:00 @@ -98665,7 +98665,7 @@ 0 Mo-Su 09:00-13:00,15:00-18:00 0 Mo-Su 09:00-13:00,15:00-19:00 0 Mo-Su 09:00-13:00,15:00-19:00 -0 Mo-Su 09:00-13:00,15:00-19:00; Nov 15-Apr 30 off +0 Mo-Su 09:00-13:00,15:00-19:00; Nov 15-Apr off 0 Mo-Su 09:00-13:00,15:30-18:00 0 Mo-Su 09:00-13:00,15:30-19:30 0 Mo-Su 09:00-13:00,15:30-19:30 @@ -131780,7 +131780,7 @@ 0 Oct-Feb off 0 Oct-Jan,Apr-Jul: Mo,Th 21:00-01:00, We[1],We[3],We[5] 18:00-01:00 0 Oct-Jun -0 Oct 01-Jun 30: Mo,Sa 09:00-12:00; Tu,Th,Fr 09:00-12:00,14:00-18:00; Su,We off; Jul,Aug: Mo-Sa 10:00-12:30,15:00-19:00; Su 10:00-12:30; Jun 20-Jun 30: Mo,Tu,Th,Fr 09:00-12:00,14:00-18:00; Sa 09:00-12:00,14:00-17:00, We 09:00-12:00, Su off; Sep: Mo,Tu,Th,Fr 00:00 +0 Oct-Jun 30: Mo,Sa 09:00-12:00; Tu,Th,Fr 09:00-12:00,14:00-18:00; Su,We off; Jul,Aug: Mo-Sa 10:00-12:30,15:00-19:00; Su 10:00-12:30; Jun 20-Jun 30: Mo,Tu,Th,Fr 09:00-12:00,14:00-18:00; Sa 09:00-12:00,14:00-17:00, We 09:00-12:00, Su off; Sep: Mo,Tu,Th,Fr 00:00 0 Oct-Jun Mo-Fr 09:30-19:00; Jul-Sep Mo-Fr 10:30-17:00 0 Oct-Jun: We 20:00-01:00; Mo[1] 20:00-01:00 0 Oct-Mar diff --git a/test-data/oh.txt-result-strict b/test-data/oh.txt-result-strict index f16b169..f442ea0 100644 --- a/test-data/oh.txt-result-strict +++ b/test-data/oh.txt-result-strict @@ -8612,7 +8612,7 @@ 0 2010 Dec 16,2011 Jan 20,Feb 24,Mar 17: 19:00+ 1 1 -0 2011 Jul-Aug: Mo-Su 10:00-17:00 +1 0 2013 1 1 @@ -13345,7 +13345,7 @@ 0 Apr 15-30 08:30-15:00, Sa-Su off; May 01-31 08:30-17:00; Jun 01-Aug 20 08:30-18:00; Aug 21-Sep 30 08:30-17:00; Oct 01-Oct 15 08:30-17:00, Sa-Su off 1 0 Apr 15-Oct 03: Tu-We 14:00-18:00; Th-Su 11:00-18:00 || "Individuelle Öffnungszeiten nach Absprache" -1 +0 Apr 15-Oct 13:30-22:00 0 Apr 15-Oct 14 06:00-22:30; Oct 15-Apr 14 06:30-20:30 0 Apr 15-Oct 14 06:30-22:30; Oct 15-Apr 14 06:30-20:30 0 Apr 15-Oct 14 06:30-22:30; Oct 15-Apr 14 06:30-20:30 @@ -13531,7 +13531,7 @@ 0 Apr-Nov 11:00-22:00; We off 0 Apr-Nov 11:00-23:00 0 Apr-Nov 13:00-23:00 -1 +0 Apr-Nov 15 0 Apr-Nov: Fr-Su 14:00-17:00 0 Apr-Nov: Mo-Fr 10:00-18:00; Sa 09:00-12:00; Dec-Mar: Mo 13:00-18:00; Tu-Su 09:00-12:00,13:00-18:00 0 Apr-Nov: Mo-Fr 11:00-sunset; Sa,Su 10:00-sunset @@ -15173,13 +15173,13 @@ 1 0 easter -42 days 0 easter -60 days-easter -2 days,Oct 25-Dec 24: "je ca. 2 Monate vor Ostern und Weihnachten, siehe www.rk-schoko.de" -1 +0 easter-Aug 10:00-16:00 0 easter-Dec 31 12:00-22:00; Mo off; Jun-Sep 12:00-22:00 1 1 0 easter-Nov Su[1]: Su 13:00-17:00; Su[1,3] 13:00-17:00 "Schmiedevorführung" -1 -1 +0 easter-Oct +0 easter-Oct 09:00-20:00 1 0 easter-Oct 15: Tu-Sa 11:00-17:00, Su,PH 14:00-17:00 || "Sonderöffnungen und Führungen nach telefonischer Vereinbarung" 0 easter-Oct 26: Sa,Su,PH 10:00-12:00,13:30-17:00 @@ -15188,7 +15188,7 @@ 0 easter-Oct 31: Mo-Sa 13:00-18:00 1 0 easter-Oct Su[2]: Su,PH 11:00-17:00; "außerdem nach Vereinbarung" -1 +0 easter-Sep 0 easter sunset+ 0 "easter to winter" 1 @@ -19542,7 +19542,7 @@ 1 0 Mar-Nov 12:30-22:30 0 Mar-Nov 13:00-22:00 -1 +0 Mar-Nov 15 1 0 Mar-Nov 06:00-23:00 0 Mar-Nov: Fr 14:00-18:00; Mar-Nov: Sa 10:00-16:00 @@ -58654,7 +58654,7 @@ 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH 09:00-16:00 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off -0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off; 2016 Feb-Mar off "Wasserschaden" +1 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-14:00 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-14:00 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-15:00 @@ -83599,7 +83599,7 @@ 0 Mo off; Tu-Th 15:00-19:00; Fr 13:00-20:00; Sa 10:00-15:00 0 Mo off; Tu,Th 15:00-19:00; We,Fr,Su off; Sa 10:00-14:00 0 Mo off; Tu-Th 15:00-21:00; Fr 15:00-22:00; Sa 13:00-22:00; Su,PH 13:00-21:00; "Zavírací doba dle návštěvosti." -0 Mo off; Tu-Th 15:00-22:00; Fr 15:00-23:00; Sa 18:00-23:00; Su,PH off; 2016 Jun-Aug Sa off; 2016 Jun-Aug Mo-Fr 11:00-22:00; 2016 Jul 18-31 off +1 0 Mo off; Tu-Th 15:00-23:00; Fr 15:00-03:00; Sa 12:00-03:00; Su off 0 Mo off; Tu-Th 15:00-23:00, Fr-Su 13:00-01:00 0 Mo off; Tu,Th 15:30-18:30; We,Fr 09:30-12:00 @@ -98665,7 +98665,7 @@ 0 Mo-Su 09:00-13:00,15:00-18:00 0 Mo-Su 09:00-13:00,15:00-19:00 0 Mo-Su 09:00-13:00,15:00-19:00 -1 +0 Mo-Su 09:00-13:00,15:00-19:00; Nov 15-Apr off 0 Mo-Su 09:00-13:00,15:30-18:00 0 Mo-Su 09:00-13:00,15:30-19:30 0 Mo-Su 09:00-13:00,15:30-19:30 diff --git a/test-data/oh.txt-result-time-strict b/test-data/oh.txt-result-time-strict index 7b5f77b..0854e13 100644 --- a/test-data/oh.txt-result-time-strict +++ b/test-data/oh.txt-result-time-strict @@ -8612,7 +8612,7 @@ 0 2010 Dec 16,2011 Jan 20,Feb 24,Mar 17: 19:00+ 1 1 -0 2011 Jul-Aug: Mo-Su 10:00-17:00 +1 0 2013 1 1 @@ -13345,7 +13345,7 @@ 0 Apr 15-30 08:30-15:00, Sa-Su off; May 01-31 08:30-17:00; Jun 01-Aug 20 08:30-18:00; Aug 21-Sep 30 08:30-17:00; Oct 01-Oct 15 08:30-17:00, Sa-Su off 1 0 Apr 15-Oct 03: Tu-We 14:00-18:00; Th-Su 11:00-18:00 || "Individuelle Öffnungszeiten nach Absprache" -1 +0 Apr 15-Oct 13:30-22:00 0 Apr 15-Oct 14 06:00-22:30; Oct 15-Apr 14 06:30-20:30 0 Apr 15-Oct 14 06:30-22:30; Oct 15-Apr 14 06:30-20:30 0 Apr 15-Oct 14 06:30-22:30; Oct 15-Apr 14 06:30-20:30 @@ -13531,7 +13531,7 @@ 0 Apr-Nov 11:00-22:00; We off 0 Apr-Nov 11:00-23:00 0 Apr-Nov 13:00-23:00 -1 +0 Apr-Nov 15 0 Apr-Nov: Fr-Su 14:00-17:00 0 Apr-Nov: Mo-Fr 10:00-18:00; Sa 09:00-12:00; Dec-Mar: Mo 13:00-18:00; Tu-Su 09:00-12:00,13:00-18:00 0 Apr-Nov: Mo-Fr 11:00-sunset; Sa,Su 10:00-sunset @@ -15173,13 +15173,13 @@ 1 0 easter -42 days 0 easter -60 days-easter -2 days,Oct 25-Dec 24: "je ca. 2 Monate vor Ostern und Weihnachten, siehe www.rk-schoko.de" -1 +0 easter-Aug 10:00-16:00 0 easter-Dec 31 12:00-22:00; Mo off; Jun-Sep 12:00-22:00 1 1 0 easter-Nov Su[1]: Su 13:00-17:00; Su[1,3] 13:00-17:00 "Schmiedevorführung" -1 -1 +0 easter-Oct +0 easter-Oct 09:00-20:00 1 0 easter-Oct 15: Tu-Sa 11:00-17:00, Su,PH 14:00-17:00 || "Sonderöffnungen und Führungen nach telefonischer Vereinbarung" 0 easter-Oct 26: Sa,Su,PH 10:00-12:00,13:30-17:00 @@ -15188,7 +15188,7 @@ 0 easter-Oct 31: Mo-Sa 13:00-18:00 1 0 easter-Oct Su[2]: Su,PH 11:00-17:00; "außerdem nach Vereinbarung" -1 +0 easter-Sep 0 easter sunset+ 0 "easter to winter" 1 @@ -19542,7 +19542,7 @@ 1 0 Mar-Nov 12:30-22:30 0 Mar-Nov 13:00-22:00 -1 +0 Mar-Nov 15 1 0 Mar-Nov 06:00-23:00 0 Mar-Nov: Fr 14:00-18:00; Mar-Nov: Sa 10:00-16:00 @@ -58654,7 +58654,7 @@ 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH 09:00-16:00 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off -0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; PH off; 2016 Feb-Mar off "Wasserschaden" +1 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-14:00 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-14:00 0 Mo-Fr 09:00-18:00; Sa 09:00-16:00; Su 09:00-15:00 @@ -83599,7 +83599,7 @@ 0 Mo off; Tu-Th 15:00-19:00; Fr 13:00-20:00; Sa 10:00-15:00 0 Mo off; Tu,Th 15:00-19:00; We,Fr,Su off; Sa 10:00-14:00 0 Mo off; Tu-Th 15:00-21:00; Fr 15:00-22:00; Sa 13:00-22:00; Su,PH 13:00-21:00; "Zavírací doba dle návštěvosti." -0 Mo off; Tu-Th 15:00-22:00; Fr 15:00-23:00; Sa 18:00-23:00; Su,PH off; 2016 Jun-Aug Sa off; 2016 Jun-Aug Mo-Fr 11:00-22:00; 2016 Jul 18-31 off +1 1 1 0 Mo off; Tu,Th 15:30-18:30; We,Fr 09:30-12:00 @@ -98665,7 +98665,7 @@ 0 Mo-Su 09:00-13:00,15:00-18:00 0 Mo-Su 09:00-13:00,15:00-19:00 0 Mo-Su 09:00-13:00,15:00-19:00 -1 +0 Mo-Su 09:00-13:00,15:00-19:00; Nov 15-Apr off 0 Mo-Su 09:00-13:00,15:30-18:00 0 Mo-Su 09:00-13:00,15:30-19:30 0 Mo-Su 09:00-13:00,15:30-19:30