我正在开发一个读取 GPS 数据的程序。 NMEA 字符串返回如下时间:34658.00。
我的解析器将其视为 double
InputLine = "\\$GPGGA,34658.00,5106.9792434234,N,11402.3003,W,2,09,1.0,1048.47,M,-16.27,M,08,AAAA*60";
//NMEA string
//inputLine=input.readLine();
if(inputLine.contains("$GPGGA")) {
String gpsgga = inputLine.replace("\\", "");
String[] gga = gpsgga.split(",");
String utc_time = gga[1];
if (!gga[1].isEmpty()) {
Double satTime = Double.parseDouble(utc_time);
gpsData.setgpsTime(satTime);
}
如何将 34658.00 格式化为 03:46:58?
最佳答案
DateTimeFormatter nmeaTimeFormatter = DateTimeFormatter.ofPattern("Hmmss.SS");
String utcTime = "34658.00";
System.out.println(LocalTime.parse(utcTime, nmeaTimeFormatter));
这会打印
03:46:58
首先解析为 double
是一种绕道,它只会给你带来比必要的更复杂的代码,所以要避免这种情况。只需像解析任何其他格式的时间一样解析时间即可。上述方法是否也适用于上午 10 点之后的时间(小时数为两位数)?确实如此。输入:
String utcTime = "123519.00";
输出:
12:35:19
不过,它确实需要两位小数(如果它们非零,则会将它们渲染回来)。如果小数位数可能不同,至少有两种选择
- 使用
DateTimeFormatterBuilder
指定小数部分(甚至是可选的小数部分),其中小数部分为 0 到 9 位小数。 - 技巧:使用
String.replaceFirst
和正则表达式来删除小数部分,然后将其从格式模式字符串中删除。
它还要求小数点前至少有 5 位数字,因此一天中第一个小时的时间需要有前导零,例如 00145.00
表示 00:01:45。
由于时间始终采用 UTC 格式,因此您可能需要使用 atOffset
将 LocalTime
转换为带有 ZoneOffset 的
。如果您也知道日期,则 OffsetTime
.UTCOffsetDateTime
或 Instant
会比较合适,但我还没有深入研究文档来确定您是否知道日期。
链接
- Oracle tutorial: Date Time解释如何使用
java.time
。 - NMEA data
关于java - 如何将 double 值格式化为时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49092348/