From 3b9b0236b46436ce0d91bf95b153eb300f2f3f47 Mon Sep 17 00:00:00 2001
From: lsiepel <leosiepel@gmail.com>
Date: Sun, 6 Aug 2023 20:00:12 +0200
Subject: [PATCH] [microtik] Fix changed date format in firmware v7.10 (#15362)

Signed-off-by: lsiepel <leosiepel@gmail.com>
---
 .../mikrotik/internal/util/Converter.java      | 18 +++++++++++++++---
 .../mikrotik/internal/util/ConverterTest.java  | 12 ++++++++++++
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/util/Converter.java b/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/util/Converter.java
index c9a6794c9..3dd63013c 100644
--- a/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/util/Converter.java
+++ b/bundles/org.openhab.binding.mikrotik/src/main/java/org/openhab/binding/mikrotik/internal/util/Converter.java
@@ -14,6 +14,7 @@ package org.openhab.binding.mikrotik.internal.util;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoField;
 import java.util.Locale;
 import java.util.regex.Matcher;
@@ -32,15 +33,26 @@ import org.eclipse.jdt.annotation.Nullable;
 public class Converter {
     private static final DateTimeFormatter ROUTEROS_FORMAT = DateTimeFormatter.ofPattern("MMM/dd/yyyy kk:mm:ss",
             Locale.ENGLISH);
+    private static final DateTimeFormatter ROUTEROS_FORMAT_NEW = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss",
+            Locale.ENGLISH);
 
     private static final Pattern PERIOD_PATTERN = Pattern.compile("(\\d+)([a-z]+){1,3}");
 
     public @Nullable static LocalDateTime fromRouterosTime(@Nullable String dateTimeString) {
-        if (dateTimeString == null) {
+        if (dateTimeString == null || dateTimeString.length() < 19) {
+            return null;
+        }
+        try {
+            // As of Firmware 7.10 the date format has changed to "yyyy-MM-dd HH:mm:ss"
+            if (dateTimeString.length() == 19) {
+                return LocalDateTime.parse(dateTimeString, ROUTEROS_FORMAT_NEW);
+            } else {
+                String fixedTs = dateTimeString.substring(0, 1).toUpperCase() + dateTimeString.substring(1);
+                return LocalDateTime.parse(fixedTs, ROUTEROS_FORMAT);
+            }
+        } catch (DateTimeParseException e) {
             return null;
         }
-        String fixedTs = dateTimeString.substring(0, 1).toUpperCase() + dateTimeString.substring(1);
-        return LocalDateTime.parse(fixedTs, ROUTEROS_FORMAT);
     }
 
     public @Nullable static LocalDateTime routerosPeriodBack(@Nullable String durationString) {
diff --git a/bundles/org.openhab.binding.mikrotik/src/test/java/org/openhab/binding/mikrotik/internal/util/ConverterTest.java b/bundles/org.openhab.binding.mikrotik/src/test/java/org/openhab/binding/mikrotik/internal/util/ConverterTest.java
index 02d62d12c..7f4552e2f 100644
--- a/bundles/org.openhab.binding.mikrotik/src/test/java/org/openhab/binding/mikrotik/internal/util/ConverterTest.java
+++ b/bundles/org.openhab.binding.mikrotik/src/test/java/org/openhab/binding/mikrotik/internal/util/ConverterTest.java
@@ -36,6 +36,18 @@ public class ConverterTest {
                 is(equalTo(LocalDateTime.of(2021, 1, 7, 9, 14, 11, 0))));
         assertThat(Converter.fromRouterosTime("feb/13/2021 23:59:59"),
                 is(equalTo(LocalDateTime.of(2021, 2, 13, 23, 59, 59, 0))));
+
+        assertThat(Converter.fromRouterosTime("2021-02-13 23:59:59"),
+                is(equalTo(LocalDateTime.of(2021, 2, 13, 23, 59, 59, 0))));
+        assertThat(Converter.fromRouterosTime("2020-12-11 20:45:40"),
+                is(equalTo(LocalDateTime.of(2020, 12, 11, 20, 45, 40, 0))));
+        assertThat(Converter.fromRouterosTime("2021-01-07 09:14:11"),
+                is(equalTo(LocalDateTime.of(2021, 1, 7, 9, 14, 11, 0))));
+
+        assertNull(Converter.fromRouterosTime(null));
+        assertNull(Converter.fromRouterosTime(""));
+        assertNull(Converter.fromRouterosTime("2021-18-07 09:14:11"));
+        assertNull(Converter.fromRouterosTime("feb/41/2021 23:59:59"));
     }
 
     @Test