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.temporal.ChronoField;
18 import java.util.Locale;
19 import java.util.regex.Matcher;
20 import java.util.regex.Pattern;
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.eclipse.jdt.annotation.Nullable;
26 * The {@link Converter} is a utility class having functions to convert RouterOS-specific data representation strings
27 * to regular Java types.
29 * @author Oleg Vivtash - Initial contribution
32 public class Converter {
33 private static final DateTimeFormatter ROUTEROS_FORMAT = DateTimeFormatter.ofPattern("MMM/dd/yyyy kk:mm:ss",
36 private static final Pattern PERIOD_PATTERN = Pattern.compile("(\\d+)([a-z]+){1,3}");
38 public @Nullable static LocalDateTime fromRouterosTime(@Nullable String dateTimeString) {
39 if (dateTimeString == null) {
42 String fixedTs = dateTimeString.substring(0, 1).toUpperCase() + dateTimeString.substring(1);
43 return LocalDateTime.parse(fixedTs, ROUTEROS_FORMAT);
46 public @Nullable static LocalDateTime routerosPeriodBack(@Nullable String durationString) {
47 return routerosPeriodBack(durationString, LocalDateTime.now());
50 public @Nullable static LocalDateTime routerosPeriodBack(@Nullable String durationString,
51 LocalDateTime fromDateTime) {
52 if (durationString == null) {
56 Matcher m = PERIOD_PATTERN.matcher(durationString);
57 LocalDateTime ts = fromDateTime;
59 int amount = Integer.parseInt(m.group(1));
60 String periodKey = m.group(2);
63 ts = ts.minusYears(amount);
66 ts = ts.minusWeeks(amount);
69 ts = ts.minusDays(amount);
72 ts = ts.minusHours(amount);
75 ts = ts.minusMinutes(amount);
78 ts = ts.minusSeconds(amount);
81 ts = ts.plus(amount, ChronoField.MILLI_OF_SECOND.getBaseUnit());
84 throw new IllegalArgumentException(
85 String.format("Unable to parse duration %s - %s is unknown", durationString, periodKey));