diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2017-03-18 12:05:09 +1300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-18 12:05:09 +1300 |
commit | 185dfcb02c504fbceae89ece513e51a630a39870 (patch) | |
tree | 837a2188c44afbe4f5c81d19d295c9495dc70d11 /src/org/traccar/helper | |
parent | 8beecc6b90975c972ba76ffbb5a7c975de25530c (diff) | |
parent | 7f6280f725100d446405d5f92ca8bd9435d621f4 (diff) | |
download | trackermap-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')
-rw-r--r-- | src/org/traccar/helper/Parser.java | 111 |
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); + } + } |