Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java	(revision 13146)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java	(revision 13147)
@@ -199,5 +199,5 @@
                     if (condition.matches(".*[0-9]:[0-9]{2}.*")) {
                         final List<OpeningHourTest.OpeningHoursTestError> errors = openingHourTest.checkOpeningHourSyntax(
-                                "", condition, true, LanguageInfo.getJOSMLocaleCode());
+                                "", condition, OpeningHourTest.CheckMode.TIME_RANGE, true, LanguageInfo.getJOSMLocaleCode());
                         if (!errors.isEmpty()) {
                             return errors.get(0).getMessage();
Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/OpeningHourTest.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/OpeningHourTest.java	(revision 13146)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/OpeningHourTest.java	(revision 13147)
@@ -57,7 +57,11 @@
                 ENGINE.eval("var nominatimJSON = {address: {state: 'Bayern', country_code: 'de'}};");
                 ENGINE.eval(
-                        "var oh = function (value, tag_key, locale) {" +
+                        "var oh = function (value, tag_key, mode, locale) {" +
                         " try {" +
-                        "    var r = new opening_hours(value, nominatimJSON, {tag_key: tag_key, locale: locale});" +
+                        "    var conf = {tag_key: tag_key, locale: locale};" +
+                        "    if (mode > -1) {" +
+                        "      conf.mode = mode;" +
+                        "    }" +
+                        "    var r = new opening_hours(value, nominatimJSON, conf);" +
                         "    r.getErrors = function() {return [];};" +
                         "    return r;" +
@@ -77,4 +81,24 @@
 
     /**
+     * In OSM, the syntax originally designed to describe opening hours, is now used to describe a few other things as well.
+     * Some of those other tags work with points in time instead of time ranges.
+     * To support this the mode can be specified.
+     * @since 13147
+     */
+    public enum CheckMode {
+        /** time ranges (opening_hours, lit, …) default */
+        TIME_RANGE(0),
+        /** points in time */
+        POINTS_IN_TIME(1),
+        /** both (time ranges and points in time, used by collection_times, service_times, …) */
+        BOTH(2);
+        private final int code;
+
+        CheckMode(int code) {
+            this.code = code;
+        }
+    }
+
+    /**
      * Parses the opening hour syntax of the {@code value} given according to
      * <a href="https://github.com/ypid/opening_hours.js">opening_hours.js</a> and returns an object on which
@@ -82,12 +106,13 @@
      * @param value the opening hour value to be checked
      * @param tagKey the OSM key (should be "opening_hours", "collection_times" or "service_times")
+     * @param mode whether to validate {@code value} as a time range, or points in time, or both. Can be null
      * @param locale the locale code used for localizing messages
      * @return The value returned by the underlying method. Usually a {@code jdk.nashorn.api.scripting.ScriptObjectMirror}
      * @throws ScriptException if an error occurs during invocation of the underlying method
      * @throws NoSuchMethodException if underlying method with given name or matching argument types cannot be found
-     * @since 13145
-     */
-    public Object parse(String value, String tagKey, String locale) throws ScriptException, NoSuchMethodException {
-        return ((Invocable) ENGINE).invokeFunction("oh", value, tagKey, locale);
+     * @since 13147
+     */
+    public Object parse(String value, String tagKey, CheckMode mode, String locale) throws ScriptException, NoSuchMethodException {
+        return ((Invocable) ENGINE).invokeFunction("oh", value, tagKey, mode != null ? mode.code : -1, locale);
     }
 
@@ -183,5 +208,5 @@
      */
     public List<OpeningHoursTestError> checkOpeningHourSyntax(final String key, final String value) {
-        return checkOpeningHourSyntax(key, value, false, LanguageInfo.getJOSMLocaleCode());
+        return checkOpeningHourSyntax(key, value, null, false, LanguageInfo.getJOSMLocaleCode());
     }
 
@@ -192,9 +217,10 @@
      * @param key the OSM key (should be "opening_hours", "collection_times" or "service_times").
      * @param value the opening hour value to be checked.
+     * @param mode whether to validate {@code value} as a time range, or points in time, or both. Can be null
      * @param ignoreOtherSeverity whether to ignore errors with {@link Severity#OTHER}.
      * @param locale the locale code used for localizing messages
      * @return a list of {@link TestError} or an empty list
      */
-    public List<OpeningHoursTestError> checkOpeningHourSyntax(final String key, final String value,
+    public List<OpeningHoursTestError> checkOpeningHourSyntax(final String key, final String value, CheckMode mode,
             boolean ignoreOtherSeverity, String locale) {
         if (ENGINE == null || value == null || value.isEmpty()) {
@@ -203,5 +229,5 @@
         final List<OpeningHoursTestError> errors = new ArrayList<>();
         try {
-            final Object r = parse(value, key, locale);
+            final Object r = parse(value, key, mode, locale);
             String prettifiedValue = null;
             try {
Index: /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java	(revision 13146)
+++ /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java	(revision 13147)
@@ -77,7 +77,7 @@
     @Test
     public void testI18n() {
-        assertTrue(openingHourTest.checkOpeningHourSyntax("opening_hours", ".", false, "de")
+        assertTrue(openingHourTest.checkOpeningHourSyntax("opening_hours", ".", null, false, "de")
                 .get(0).toString().contains("Unerwartetes Zeichen"));
-        assertFalse(openingHourTest.checkOpeningHourSyntax("opening_hours", ".", false, "en")
+        assertFalse(openingHourTest.checkOpeningHourSyntax("opening_hours", ".", null, false, "en")
                 .get(0).toString().contains("Unerwartetes Zeichen"));
     }
