Migrate simple date formatter

This commit is contained in:
Anton Tananaev
2026-05-11 07:45:57 -07:00
parent c9aaa6d22c
commit 7ecfd8d6d6
23 changed files with 176 additions and 132 deletions

View File

@@ -32,14 +32,18 @@ import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
@Singleton
public class MediaManager {
private static final Logger LOGGER = LoggerFactory.getLogger(MediaManager.class);
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault());
private final Path path;
@Inject
@@ -67,7 +71,7 @@ public class MediaManager {
public String writeFile(String uniqueId, ByteBuf buf, String extension) {
if (path != null) {
int size = buf.readableBytes();
String name = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "." + extension;
String name = DATE_FORMAT.format(Instant.now()) + "." + extension;
try (FileOutputStream output = new FileOutputStream(createFile(uniqueId, name));
FileChannel fileChannel = output.getChannel()) {
ByteBuffer byteBuffer = buf.nioBuffer();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2016 Anton Tananaev (anton@traccar.org)
* Copyright 2016 - 2026 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -63,6 +63,10 @@ public final class DateUtil {
return Date.from(Instant.from(DateTimeFormatter.ISO_ZONED_DATE_TIME.parse(value)));
}
public static Date parse(DateTimeFormatter formatter, String value) {
return Date.from(Instant.from(formatter.parse(value)));
}
public static String formatDate(Date date) {
return formatDate(date, true);
}

View File

@@ -27,6 +27,7 @@ import org.traccar.config.Keys;
import org.traccar.helper.BitUtil;
import org.traccar.helper.DataConverter;
import org.traccar.helper.DateBuilder;
import org.traccar.helper.DateUtil;
import org.traccar.helper.Parser;
import org.traccar.helper.PatternBuilder;
import org.traccar.helper.UnitsConverter;
@@ -36,20 +37,21 @@ import org.traccar.model.Position;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AtrackProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyyMMddHHmmss").withZone(ZoneOffset.UTC);
private static final int MIN_DATA_LENGTH = 40;
private boolean longDate;
@@ -547,13 +549,7 @@ public class AtrackProtocolDecoder extends BaseProtocolDecoder {
String time = parser.next();
if (time.length() >= 14) {
try {
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
position.setTime(dateFormat.parse(time));
} catch (ParseException e) {
throw new RuntimeException(e);
}
position.setTime(DateUtil.parse(DATE_FORMAT, time));
} else {
position.setTime(new Date(Long.parseLong(time) * 1000));
}

View File

@@ -22,6 +22,7 @@ import org.traccar.BaseHttpProtocolDecoder;
import org.traccar.session.DeviceSession;
import org.traccar.Protocol;
import org.traccar.helper.BitUtil;
import org.traccar.helper.DateUtil;
import org.traccar.helper.UnitsConverter;
import org.traccar.model.Position;
@@ -31,18 +32,19 @@ import jakarta.json.JsonObject;
import java.io.StringReader;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.TimeZone;
public class DmtHttpProtocolDecoder extends BaseHttpProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneOffset.UTC);
public DmtHttpProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -67,10 +69,7 @@ public class DmtHttpProtocolDecoder extends BaseHttpProtocolDecoder {
}
private Collection<Position> decodeTraditional(
Channel channel, SocketAddress remoteAddress, JsonObject root) throws ParseException {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Channel channel, SocketAddress remoteAddress, JsonObject root) {
DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, root.getString("IMEI"));
if (deviceSession == null) {
@@ -90,7 +89,7 @@ public class DmtHttpProtocolDecoder extends BaseHttpProtocolDecoder {
position.set(Position.KEY_INDEX, record.getInt("SeqNo"));
position.set(Position.KEY_EVENT, record.getInt("Reason"));
position.setDeviceTime(dateFormat.parse(record.getString("DateUTC")));
position.setDeviceTime(DateUtil.parse(DATE_FORMAT, record.getString("DateUTC")));
JsonArray fields = record.getJsonArray("Fields");
@@ -98,7 +97,7 @@ public class DmtHttpProtocolDecoder extends BaseHttpProtocolDecoder {
JsonObject field = fields.getJsonObject(j);
switch (field.getInt("FType")) {
case 0:
position.setFixTime(dateFormat.parse(field.getString("GpsUTC")));
position.setFixTime(DateUtil.parse(DATE_FORMAT, field.getString("GpsUTC")));
position.setLatitude(field.getJsonNumber("Lat").doubleValue());
position.setLongitude(field.getJsonNumber("Long").doubleValue());
position.setAltitude(field.getInt("Alt"));

View File

@@ -34,14 +34,16 @@ import org.traccar.model.WifiAccessPoint;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern;
public class FifotrackProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyMMddHHmmss").withZone(ZoneOffset.UTC);
private ByteBuf photo;
public FifotrackProtocolDecoder(Protocol protocol) {
@@ -240,9 +242,7 @@ public class FifotrackProtocolDecoder extends BaseProtocolDecoder {
position.setNetwork(network);
DateFormat dateFormat = new SimpleDateFormat("yyMMddHHmmss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
String response = index + ",A03," + dateFormat.format(new Date());
String response = index + ",A03," + DATE_FORMAT.format(Instant.now());
sendResponse(channel, remoteAddress, imei, response);
return position;

View File

@@ -58,13 +58,19 @@ import javax.xml.xpath.XPathFactory;
import java.io.StringReader;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
public class GlobalstarProtocolDecoder extends BaseHttpProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("dd/MM/yyyy hh:mm:ss z", Locale.ENGLISH).withZone(ZoneId.systemDefault());
private final DocumentBuilder documentBuilder;
private final XPath xPath;
private final XPathExpression messageExpression;
@@ -94,7 +100,7 @@ public class GlobalstarProtocolDecoder extends BaseHttpProtocolDecoder {
rootElement.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
rootElement.setAttribute(
"xsi:noNamespaceSchemaLocation", "http://cody.glpconnect.com/XSD/StuResponse_Rev1_0.xsd");
rootElement.setAttribute("deliveryTimeStamp", new SimpleDateFormat("dd/MM/yyyy hh:mm:ss z").format(new Date()));
rootElement.setAttribute("deliveryTimeStamp", DATE_FORMAT.format(Instant.now()));
rootElement.setAttribute("messageID", "00000000000000000000000000000000");
rootElement.setAttribute("correlationID", messageId);
document.appendChild(rootElement);

View File

@@ -28,14 +28,16 @@ import org.traccar.model.Network;
import org.traccar.model.Position;
import java.net.SocketAddress;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern;
public class ItsProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("ddMMyyyyHHmmss").withZone(ZoneOffset.UTC);
public ItsProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -140,9 +142,7 @@ public class ItsProtocolDecoder extends BaseProtocolDecoder {
if (sentence.startsWith("$,01,")) {
channel.writeAndFlush(new NetworkMessage("$,1,*", remoteAddress));
} else if (sentence.startsWith("$,LGN,")) {
DateFormat dateFormat = new SimpleDateFormat("ddMMyyyyHHmmss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
String time = dateFormat.format(new Date());
String time = DATE_FORMAT.format(Instant.now());
channel.writeAndFlush(new NetworkMessage("$LGN" + time + "*", remoteAddress));
} else if (sentence.startsWith("$,HBT,")) {
channel.writeAndFlush(new NetworkMessage("$HBT*", remoteAddress));

View File

@@ -30,12 +30,16 @@ import org.traccar.model.Command;
import java.net.URI;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Set;
public class Jt808ProtocolEncoder extends BaseProtocolEncoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyMMddHHmmss").withZone(ZoneId.systemDefault());
public Jt808ProtocolEncoder(Protocol protocol) {
super(protocol);
}
@@ -103,8 +107,7 @@ public class Jt808ProtocolEncoder extends BaseProtocolEncoder {
case Command.TYPE_ENGINE_RESUME:
if (alternative) {
data.writeByte(command.getType().equals(Command.TYPE_ENGINE_STOP) ? 0x01 : 0x00);
data.writeBytes(DataConverter.parseHex(
new SimpleDateFormat("yyMMddHHmmss").format(new Date())));
data.writeBytes(DataConverter.parseHex(DATE_FORMAT.format(Instant.now())));
return decoder.formatMessage(
Jt808ProtocolDecoder.MSG_OIL_CONTROL, id, false, data);
} else {

View File

@@ -21,6 +21,7 @@ import org.traccar.BaseProtocolDecoder;
import org.traccar.session.DeviceSession;
import org.traccar.Protocol;
import org.traccar.helper.DateBuilder;
import org.traccar.helper.DateUtil;
import org.traccar.helper.Parser;
import org.traccar.helper.PatternBuilder;
import org.traccar.helper.UnitsConverter;
@@ -30,17 +31,17 @@ import org.traccar.model.Position;
import org.traccar.model.WifiAccessPoint;
import java.net.SocketAddress;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.LinkedList;
import java.util.List;
import java.util.TimeZone;
import java.util.regex.Pattern;
public class MictrackProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyMMddHHmmss").withZone(ZoneOffset.UTC);
public MictrackProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -58,12 +59,6 @@ public class MictrackProtocolDecoder extends BaseProtocolDecoder {
.number("(dd)(dd)(dd)") // date (ddmmyy)
.compile();
private Date decodeTime(String data) throws ParseException {
DateFormat dateFormat = new SimpleDateFormat("yyMMddHHmmss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.parse(data);
}
private String decodeAlarm(int event) {
return switch (event) {
case 0 -> Position.ALARM_POWER_ON;
@@ -76,14 +71,14 @@ public class MictrackProtocolDecoder extends BaseProtocolDecoder {
};
}
private void decodeLocation(Position position, String data) throws ParseException {
private void decodeLocation(Position position, String data) {
int index = 0;
String[] values = data.split("\\+");
position.set(Position.KEY_SATELLITES, Integer.parseInt(values[index++]));
position.setValid(true);
position.setTime(decodeTime(values[index++]));
position.setTime(DateUtil.parse(DATE_FORMAT, values[index++]));
position.setLatitude(Double.parseDouble(values[index++]));
position.setLongitude(Double.parseDouble(values[index++]));
position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(values[index++])));
@@ -118,11 +113,11 @@ public class MictrackProtocolDecoder extends BaseProtocolDecoder {
}
private void decodeNetwork(
Position position, String data, boolean hasWifi, boolean hasSsid, boolean hasCell) throws ParseException {
Position position, String data, boolean hasWifi, boolean hasSsid, boolean hasCell) {
int index = 0;
String[] values = data.split("\\+");
getLastLocation(position, decodeTime(values[index++]));
getLastLocation(position, DateUtil.parse(DATE_FORMAT, values[index++]));
Network network = new Network();
@@ -142,13 +137,13 @@ public class MictrackProtocolDecoder extends BaseProtocolDecoder {
position.set(Position.KEY_BATTERY, Integer.parseInt(values[index++]) * 0.001);
}
private void decodeStatus(Position position, String data) throws ParseException {
private void decodeStatus(Position position, String data) {
int index = 0;
String[] values = data.split("\\+");
position.set(Position.KEY_SATELLITES, Integer.parseInt(values[index++]));
getLastLocation(position, decodeTime(values[index++]));
getLastLocation(position, DateUtil.parse(DATE_FORMAT, values[index++]));
index += 4; // fix values

View File

@@ -24,16 +24,20 @@ import org.traccar.NetworkMessage;
import org.traccar.Protocol;
import org.traccar.helper.BitUtil;
import org.traccar.helper.DateBuilder;
import org.traccar.helper.DateUtil;
import org.traccar.helper.UnitsConverter;
import org.traccar.model.Position;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class NoranProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
public NoranProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -129,8 +133,7 @@ public class NoranProtocolDecoder extends BaseProtocolDecoder {
position.setDeviceId(deviceSession.getDeviceId());
if (newFormat) {
DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
position.setTime(dateFormat.parse(buf.readSlice(17).toString(StandardCharsets.US_ASCII)));
position.setTime(DateUtil.parse(DATE_FORMAT, buf.readSlice(17).toString(StandardCharsets.US_ASCII)));
buf.readByte();
}

View File

@@ -29,13 +29,15 @@ import org.traccar.config.Config;
import org.traccar.config.Keys;
import java.net.SocketAddress;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.TimeZone;
public class OrbcommProtocolPoller extends BaseProtocolPoller {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneOffset.UTC);
private final String accessId;
private final String password;
private final String host;
@@ -60,9 +62,7 @@ public class OrbcommProtocolPoller extends BaseProtocolPoller {
encoder.addParam("access_id", accessId);
encoder.addParam("password", password);
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
encoder.addParam("start_utc", dateFormat.format(startTime));
encoder.addParam("start_utc", DATE_FORMAT.format(startTime.toInstant()));
HttpRequest request = new DefaultFullHttpRequest(
HttpVersion.HTTP_1_1, HttpMethod.GET, encoder.toString(), Unpooled.buffer());

View File

@@ -39,14 +39,17 @@ import org.traccar.model.WifiAccessPoint;
import java.io.StringReader;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class OsmAndProtocolDecoder extends BaseHttpProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
private double minAccuracy;
public OsmAndProtocolDecoder(Protocol protocol) {
@@ -118,8 +121,7 @@ public class OsmAndProtocolDecoder extends BaseHttpProtocolDecoder {
if (value.contains("T")) {
position.setTime(DateUtil.parseDate(value));
} else {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
position.setTime(dateFormat.parse(value));
position.setTime(DateUtil.parse(DATE_FORMAT, value));
}
}
break;

View File

@@ -27,12 +27,16 @@ import org.traccar.model.Network;
import org.traccar.model.Position;
import java.net.SocketAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern;
public class Pt60ProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault());
public Pt60ProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -63,7 +67,7 @@ public class Pt60ProtocolDecoder extends BaseProtocolDecoder {
private void sendResponse(Channel channel, SocketAddress remoteAddress, String format, int type, String imei) {
if (channel != null) {
String message;
String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String time = DATE_FORMAT.format(Instant.now());
if (format.equals("G")) {
message = String.format("@G#@,V01,38,%s,@R#@", time);
} else {

View File

@@ -21,15 +21,19 @@ import jakarta.json.JsonObject;
import org.apache.kafka.common.utils.ByteBufferInputStream;
import org.traccar.BaseMqttProtocolDecoder;
import org.traccar.Protocol;
import org.traccar.helper.DateUtil;
import org.traccar.helper.UnitsConverter;
import org.traccar.model.Position;
import org.traccar.session.DeviceSession;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class PuiProtocolDecoder extends BaseMqttProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZone(ZoneId.systemDefault());
public PuiProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -51,8 +55,7 @@ public class PuiProtocolDecoder extends BaseMqttProtocolDecoder {
position.setValid(true);
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
position.setTime(dateFormat.parse(json.getString("ts")));
position.setTime(DateUtil.parse(DATE_FORMAT, json.getString("ts")));
JsonObject location = json.getJsonObject("location");
position.setLatitude(location.getJsonNumber("lat").doubleValue());

View File

@@ -19,6 +19,7 @@ import io.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
import org.traccar.session.DeviceSession;
import org.traccar.Protocol;
import org.traccar.helper.DateUtil;
import org.traccar.helper.UnitsConverter;
import org.traccar.model.CellTower;
import org.traccar.model.Network;
@@ -26,12 +27,14 @@ import org.traccar.model.Position;
import org.traccar.model.WifiAccessPoint;
import java.net.SocketAddress;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class S168ProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyMMddHHmmss").withZone(ZoneOffset.UTC);
public S168ProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -69,9 +72,7 @@ public class S168ProtocolDecoder extends BaseProtocolDecoder {
case "GDATA":
position.setValid(values[index++].equals("A"));
position.set(Position.KEY_SATELLITES, Integer.parseInt(values[index++]));
DateFormat dateFormat = new SimpleDateFormat("yyMMddHHmmss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
position.setTime(dateFormat.parse(values[index++]));
position.setTime(DateUtil.parse(DATE_FORMAT, values[index++]));
position.setLatitude(Double.parseDouble(values[index++]));
position.setLongitude(Double.parseDouble(values[index++]));
position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(values[index++])));

View File

@@ -25,6 +25,7 @@ import org.traccar.NetworkMessage;
import org.traccar.Protocol;
import org.traccar.helper.BitUtil;
import org.traccar.helper.Checksum;
import org.traccar.helper.DateUtil;
import org.traccar.model.Position;
import org.traccar.session.DeviceSession;
@@ -32,13 +33,15 @@ import java.io.StringReader;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class SnapperProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("ddMMyyHHmmss").withZone(ZoneOffset.UTC);
public SnapperProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -126,9 +129,7 @@ public class SnapperProtocolDecoder extends BaseProtocolDecoder {
position.setLongitude(-position.getLongitude());
}
DateFormat dateFormat = new SimpleDateFormat("ddMMyyHHmmss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
position.setTime(dateFormat.parse(json.getString("d") + json.getString("t").split("\\.")[0]));
position.setTime(DateUtil.parse(DATE_FORMAT, json.getString("d") + json.getString("t").split("\\.")[0]));
String lat = json.getString("la");
position.setLatitude(Integer.parseInt(lat.substring(0, 2)) + Double.parseDouble(lat.substring(2)) / 60);

View File

@@ -18,14 +18,19 @@ package org.traccar.protocol;
import io.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
import org.traccar.session.DeviceSession;
import org.traccar.helper.DateUtil;
import org.traccar.helper.UnitsConverter;
import org.traccar.model.Position;
import java.net.SocketAddress;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class StarcomProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyy/MM/dd HH:mm:ss").withZone(ZoneId.systemDefault());
public StarcomProtocolDecoder(StarcomProtocol protocol) {
super(protocol);
}
@@ -52,7 +57,7 @@ public class StarcomProtocolDecoder extends BaseProtocolDecoder {
}
}
case "gps_valid" -> position.setValid(Integer.parseInt(value) != 0);
case "datetime_actual" -> position.setTime(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(value));
case "datetime_actual" -> position.setTime(DateUtil.parse(DATE_FORMAT, value));
case "latitude" -> position.setLatitude(Double.parseDouble(value));
case "longitude" -> position.setLongitude(Double.parseDouble(value));
case "altitude" -> position.setAltitude(Double.parseDouble(value));

View File

@@ -20,16 +20,21 @@ import org.traccar.BaseProtocolDecoder;
import org.traccar.session.DeviceSession;
import org.traccar.Protocol;
import org.traccar.helper.BitUtil;
import org.traccar.helper.DateUtil;
import org.traccar.model.Position;
import java.net.SocketAddress;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
public class TelemaxProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyMMddHHmmss").withZone(ZoneId.systemDefault());
public TelemaxProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -94,10 +99,10 @@ public class TelemaxProtocolDecoder extends BaseProtocolDecoder {
position.setLatitude((Integer.parseInt(readValue(sentence, index, 6), 16) - 5400000) / 30000.0);
if (i == 0 | i == count - 1) {
time = new SimpleDateFormat("yyMMddHHmmss").parse(readValue(sentence, index, 12));
time = DateUtil.parse(DATE_FORMAT, readValue(sentence, index, 12));
position.set(Position.KEY_STATUS, readValue(sentence, index, 8));
} else {
time = new Date(time.getTime() + interval * 1000);
time = new Date(time.getTime() + interval * 1000L);
}
position.setTime(time);

View File

@@ -20,6 +20,7 @@ import org.traccar.BaseProtocolDecoder;
import org.traccar.session.DeviceSession;
import org.traccar.NetworkMessage;
import org.traccar.Protocol;
import org.traccar.helper.DateUtil;
import org.traccar.helper.UnitsConverter;
import org.traccar.model.Position;
@@ -27,12 +28,14 @@ import jakarta.json.Json;
import jakarta.json.JsonObject;
import java.io.StringReader;
import java.net.SocketAddress;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class TeraTrackProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneOffset.UTC);
public TeraTrackProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -53,9 +56,7 @@ public class TeraTrackProtocolDecoder extends BaseProtocolDecoder {
Position position = new Position(getProtocolName());
position.setDeviceId(deviceSession.getDeviceId());
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
position.setTime(dateFormat.parse(json.getString("DateTime")));
position.setTime(DateUtil.parse(DATE_FORMAT, json.getString("DateTime")));
position.setValid(true);
position.setLatitude(Double.parseDouble(json.getString("Latitude")));

View File

@@ -30,9 +30,8 @@ import org.traccar.model.Position;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
@@ -41,6 +40,11 @@ import java.util.regex.Pattern;
public class TramigoProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT_WITH_SECONDS = DateTimeFormatter
.ofPattern("HH:mm:ss MMM d yyyy", Locale.ENGLISH).withZone(ZoneId.systemDefault());
private static final DateTimeFormatter DATE_FORMAT_NO_SECONDS = DateTimeFormatter
.ofPattern("HH:mm MMM d yyyy", Locale.ENGLISH).withZone(ZoneId.systemDefault());
public TramigoProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -217,7 +221,7 @@ public class TramigoProtocolDecoder extends BaseProtocolDecoder {
}
private Position decode80(Channel channel, SocketAddress remoteAddress, ByteBuf buf) throws ParseException {
private Position decode80(Channel channel, SocketAddress remoteAddress, ByteBuf buf) {
buf.readUnsignedByte(); // version id
int index = buf.readUnsignedShort();
@@ -268,10 +272,9 @@ public class TramigoProtocolDecoder extends BaseProtocolDecoder {
if (!matcher.find()) {
return null;
}
DateFormat dateFormat = new SimpleDateFormat(
matcher.group(2) != null ? "HH:mm:ss MMM d yyyy" : "HH:mm MMM d yyyy", Locale.ENGLISH);
position.setTime(DateUtil.correctYear(
dateFormat.parse(matcher.group(1) + " " + Calendar.getInstance().get(Calendar.YEAR))));
DateTimeFormatter dateFormat = matcher.group(2) != null ? DATE_FORMAT_WITH_SECONDS : DATE_FORMAT_NO_SECONDS;
position.setTime(DateUtil.correctYear(DateUtil.parse(
dateFormat, matcher.group(1) + " " + Calendar.getInstance().get(Calendar.YEAR))));
if (sentence.contains("Ignition on detected")) {
position.set(Position.KEY_IGNITION, true);

View File

@@ -30,13 +30,17 @@ import org.traccar.model.Position;
import org.traccar.model.WifiAccessPoint;
import java.net.SocketAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern;
import java.util.Set;
public class TrvProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault());
private static final Set<String> IGNORE_RESPONSE = Set.of(
"AP12", "AP14", "AP33", "AP34", "AP40", "AP76", "AP77", "AP84", "AP85", "AP86", "AP87");
@@ -180,7 +184,7 @@ public class TrvProtocolDecoder extends BaseProtocolDecoder {
if (channel != null) {
String responseHeader = id + (char) (type.charAt(0) + 1) + type.substring(1);
if (type.equals("AP00") && id.equals("IW")) {
String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String time = DATE_FORMAT.format(Instant.now());
channel.writeAndFlush(new NetworkMessage(responseHeader + "," + time + ",0#", remoteAddress));
} else if (type.equals("AP14") && !id.equals("IW")) {
channel.writeAndFlush(new NetworkMessage(responseHeader + ",0.000,0.000#", remoteAddress));

View File

@@ -34,23 +34,22 @@ import org.traccar.model.Position;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class TzoneProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneOffset.UTC);
public TzoneProtocolDecoder(Protocol protocol) {
super(protocol);
}
private void sendResponse(Channel channel, SocketAddress remoteAddress, int index) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
String ack = String.format("@ACK,%d#", index);
String time = String.format("@UTC time:%s", dateFormat.format(new Date()));
String time = String.format("@UTC time:%s", DATE_FORMAT.format(Instant.now()));
ByteBuf response = Unpooled.copiedBuffer(ack + time, StandardCharsets.US_ASCII);

View File

@@ -22,6 +22,7 @@ import org.traccar.BaseProtocolDecoder;
import org.traccar.session.DeviceSession;
import org.traccar.NetworkMessage;
import org.traccar.Protocol;
import org.traccar.helper.DateUtil;
import org.traccar.helper.Parser;
import org.traccar.helper.PatternBuilder;
import org.traccar.helper.UnitsConverter;
@@ -32,15 +33,20 @@ import org.traccar.model.WifiAccessPoint;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
public class WristbandProtocolDecoder extends BaseProtocolDecoder {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyyMMddHHmm").withZone(ZoneId.systemDefault());
private static final DateTimeFormatter RESPONSE_DATE_FORMAT = DateTimeFormatter
.ofPattern("yyyy-MM-dd-HH-mm-ss").withZone(ZoneId.systemDefault());
public WristbandProtocolDecoder(Protocol protocol) {
super(protocol);
}
@@ -74,7 +80,7 @@ public class WristbandProtocolDecoder extends BaseProtocolDecoder {
.text("\r\n")
.compile();
private Position decodePosition(DeviceSession deviceSession, String sentence) throws ParseException {
private Position decodePosition(DeviceSession deviceSession, String sentence) {
Position position = new Position(getProtocolName());
position.setDeviceId(deviceSession.getDeviceId());
@@ -84,7 +90,7 @@ public class WristbandProtocolDecoder extends BaseProtocolDecoder {
position.setValid(true);
position.setLongitude(Double.parseDouble(values[0]));
position.setLatitude(Double.parseDouble(values[1]));
position.setTime(new SimpleDateFormat("yyyyMMddHHmm").parse(values[2]));
position.setTime(DateUtil.parse(DATE_FORMAT, values[2]));
position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(values[3])));
return position;
@@ -135,7 +141,7 @@ public class WristbandProtocolDecoder extends BaseProtocolDecoder {
}
private List<Position> decodeMessage(
Channel channel, SocketAddress remoteAddress, String sentence) throws ParseException {
Channel channel, SocketAddress remoteAddress, String sentence) {
Parser parser = new Parser(PATTERN, sentence);
if (!parser.matches()) {
@@ -157,7 +163,7 @@ public class WristbandProtocolDecoder extends BaseProtocolDecoder {
switch (type) {
case 90 -> sendResponse(channel, imei, version, type, getServer(channel, ','));
case 91 -> {
String time = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
String time = RESPONSE_DATE_FORMAT.format(Instant.now());
sendResponse(channel, imei, version, type, time + "|" + getServer(channel, ','));
}
case 1 -> {