aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/helper/Parser.java
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2017-03-18 12:05:09 +1300
committerGitHub <noreply@github.com>2017-03-18 12:05:09 +1300
commit185dfcb02c504fbceae89ece513e51a630a39870 (patch)
tree837a2188c44afbe4f5c81d19d295c9495dc70d11 /src/org/traccar/helper/Parser.java
parent8beecc6b90975c972ba76ffbb5a7c975de25530c (diff)
parent7f6280f725100d446405d5f92ca8bd9435d621f4 (diff)
downloadtrackermap-server-185dfcb02c504fbceae89ece513e51a630a39870.tar.gz
trackermap-server-185dfcb02c504fbceae89ece513e51a630a39870.tar.bz2
trackermap-server-185dfcb02c504fbceae89ece513e51a630a39870.zip
Merge pull request #3018 from jon-stumpf/jss-parse-nextDateTime
Date and time decoding improvements
Diffstat (limited to 'src/org/traccar/helper/Parser.java')
-rw-r--r--src/org/traccar/helper/Parser.java111
1 files changed, 110 insertions, 1 deletions
diff --git a/src/org/traccar/helper/Parser.java b/src/org/traccar/helper/Parser.java
index d64993ccb..2253b79fc 100644
--- a/src/org/traccar/helper/Parser.java
+++ b/src/org/traccar/helper/Parser.java
@@ -15,13 +15,15 @@
*/
package org.traccar.helper;
+import java.util.Date;
+import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Parser {
private int position;
- private Matcher matcher;
+ private final Matcher matcher;
public Parser(Pattern pattern, String input) {
matcher = pattern.matcher(input);
@@ -165,4 +167,111 @@ public class Parser {
return nextCoordinate(CoordinateFormat.DEG_MIN_HEM);
}
+ public enum DateTimeFormat {
+ HMS, // HHMMSS
+ SMH, // SSMMHH
+
+ HMS_YMD, // HHMMSSYYYYMMDD or HHMMSSYYMMDD
+ HMS_DMY, // HHMMSSDDMMYYYY or HHMMSSDDMMYY
+ SMH_YMD, // SSMMHHYYYYMMDD or SSMMHHYYMMDD
+ SMH_DMY, // SSMMHHDDMMYYYY or SSMMHHDDMMYY
+
+ DMY_HMS, // DDMMYYYYHHMMSS or DDMMYYHHMMSS
+ DMY_HMSS, // DDMMYYYYHHMMSS.sss or DDMMYYHHMMSS.sss
+ YMD_HMS, // YYYYMMDDHHMMSS or YYMMDDHHMMSS
+ YMD_HMSS, // YYYYMMDDHHMMSS.sss or YYMMDDHHMMSS.sss
+ }
+
+ private static final DateTimeFormat DEFAULT_FORMAT = DateTimeFormat.YMD_HMS;
+ private static final String DEFAULT_TZ = "UTC";
+ private static final int DEFAULT_RADIX = 10;
+
+ public Date nextDateTime(DateTimeFormat format, String tz, int radix) {
+ int year = 0, month = 0, day = 0;
+ int hour = 0, minute = 0, second = 0, millisecond = 0;
+ TimeZone timeZone = TimeZone.getTimeZone(tz);
+
+ switch (format) {
+ case HMS:
+ hour = nextInt(radix); minute = nextInt(radix); second = nextInt(radix);
+ break;
+ case SMH:
+ second = nextInt(radix); minute = nextInt(radix); hour = nextInt(radix);
+ break;
+ case HMS_YMD:
+ hour = nextInt(radix); minute = nextInt(radix); second = nextInt(radix);
+ year = nextInt(radix); month = nextInt(radix); day = nextInt(radix);
+ break;
+ case HMS_DMY:
+ hour = nextInt(radix); minute = nextInt(radix); second = nextInt(radix);
+ day = nextInt(radix); month = nextInt(radix); year = nextInt(radix);
+ break;
+ case SMH_YMD:
+ second = nextInt(radix); minute = nextInt(radix); hour = nextInt(radix);
+ year = nextInt(radix); month = nextInt(radix); day = nextInt(radix);
+ break;
+ case SMH_DMY:
+ second = nextInt(radix); minute = nextInt(radix); hour = nextInt(radix);
+ day = nextInt(radix); month = nextInt(radix); year = nextInt(radix);
+ break;
+ case DMY_HMS:
+ case DMY_HMSS:
+ day = nextInt(radix); month = nextInt(radix); year = nextInt(radix);
+ hour = nextInt(radix); minute = nextInt(radix); second = nextInt(radix);
+ break;
+ case YMD_HMS:
+ case YMD_HMSS:
+ default:
+ year = nextInt(radix); month = nextInt(radix); day = nextInt(radix);
+ hour = nextInt(radix); minute = nextInt(radix); second = nextInt(radix);
+ break;
+ }
+
+ if (format == DateTimeFormat.YMD_HMSS || format == DateTimeFormat.DMY_HMSS) {
+ millisecond = nextInt(radix); // (ddd)
+ }
+
+ if (year >= 0 && year < 100) {
+ year += 2000;
+ }
+
+ DateBuilder dateBuilder = new DateBuilder(timeZone);
+
+ if (format != DateTimeFormat.HMS || format != DateTimeFormat.SMH) {
+ dateBuilder.setDate(year, month, day);
+ }
+
+ dateBuilder.setTime(hour, minute, second, millisecond);
+
+ return dateBuilder.getDate();
+ }
+
+ public Date nextDateTime(String tz, int radix) {
+ return nextDateTime(DEFAULT_FORMAT, tz, radix);
+ }
+
+ public Date nextDateTime(DateTimeFormat format, int radix) {
+ return nextDateTime(format, DEFAULT_TZ, radix);
+ }
+
+ public Date nextDateTime(DateTimeFormat format, String tz) {
+ return nextDateTime(format, tz, DEFAULT_RADIX);
+ }
+
+ public Date nextDateTime(DateTimeFormat format) {
+ return nextDateTime(format, DEFAULT_TZ, DEFAULT_RADIX);
+ }
+
+ public Date nextDateTime(String tz) {
+ return nextDateTime(DEFAULT_FORMAT, tz, DEFAULT_RADIX);
+ }
+
+ public Date nextDateTime(int radix) {
+ return nextDateTime(DEFAULT_FORMAT, DEFAULT_TZ, radix);
+ }
+
+ public Date nextDateTime() {
+ return nextDateTime(DEFAULT_FORMAT, DEFAULT_TZ, DEFAULT_RADIX);
+ }
+
}