2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.mikrotik.internal.util;
15 import java.time.LocalDateTime;
16 import java.time.format.DateTimeFormatter;
17 import java.time.format.DateTimeParseException;
18 import java.time.temporal.ChronoField;
19 import java.util.Locale;
20 import java.util.regex.Matcher;
21 import java.util.regex.Pattern;
23 import org.eclipse.jdt.annotation.NonNullByDefault;
24 import org.eclipse.jdt.annotation.Nullable;
27 * The {@link Converter} is a utility class having functions to convert RouterOS-specific data representation strings
28 * to regular Java types.
30 * @author Oleg Vivtash - Initial contribution
33 public class Converter {
34 private static final DateTimeFormatter ROUTEROS_FORMAT = DateTimeFormatter.ofPattern("MMM/dd/yyyy kk:mm:ss",
36 private static final DateTimeFormatter ROUTEROS_FORMAT_NEW = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss",
39 private static final Pattern PERIOD_PATTERN = Pattern.compile("(\\d+)([a-z]+){1,3}");
41 public @Nullable static LocalDateTime fromRouterosTime(@Nullable String dateTimeString) {
42 if (dateTimeString == null || dateTimeString.length() < 19) {
46 // As of Firmware 7.10 the date format has changed to "yyyy-MM-dd HH:mm:ss"
47 if (dateTimeString.length() == 19) {
48 return LocalDateTime.parse(dateTimeString, ROUTEROS_FORMAT_NEW);
50 String fixedTs = dateTimeString.substring(0, 1).toUpperCase() + dateTimeString.substring(1);
51 return LocalDateTime.parse(fixedTs, ROUTEROS_FORMAT);
53 } catch (DateTimeParseException e) {
58 public @Nullable static LocalDateTime routerosPeriodBack(@Nullable String durationString) {
59 return routerosPeriodBack(durationString, LocalDateTime.now());
62 public @Nullable static LocalDateTime routerosPeriodBack(@Nullable String durationString,
63 LocalDateTime fromDateTime) {
64 if (durationString == null) {
68 Matcher m = PERIOD_PATTERN.matcher(durationString);
69 LocalDateTime ts = fromDateTime;
71 int amount = Integer.parseInt(m.group(1));
72 String periodKey = m.group(2);
75 ts = ts.minusYears(amount);
78 ts = ts.minusWeeks(amount);
81 ts = ts.minusDays(amount);
84 ts = ts.minusHours(amount);
87 ts = ts.minusMinutes(amount);
90 ts = ts.minusSeconds(amount);
93 ts = ts.plus(amount, ChronoField.MILLI_OF_SECOND.getBaseUnit());
96 throw new IllegalArgumentException(
97 String.format("Unable to parse duration %s - %s is unknown", durationString, periodKey));