如何将double值格式化为时间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将double值格式化为时间相关的知识,希望对你有一定的参考价值。
我正在研究一个读取gps数据的程序。 NMEA字符串返回如下所示的时间:34658.00。
我的解析器将其视为双精度数
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位小数之间的任何内容。 - hack:使用带有正则表达式的
String.replaceFirst
删除小数部分,然后将其从格式模式字符串中删除。
它还需要小数点前至少5位数,所以在一天的第一个小时内的时间需要有前导零,例如00:01:45的00145.00
。
由于时间总是以UTC为单位,您可能需要使用atOffset
将LocalTime
转换为OffsetTime
与ZoneOffset.UTC
。如果您也知道日期,那么OffsetDateTime
或Instant
是合适的,但我没有深入研究文档以确定您是否知道日期。
链接
- Oracle tutorial: Date Time解释如何使用
java.time
。 - NMEA data
另一答案
int hours = (int) Math.floor(satTime / 10000);
int minutes = (int) Math.floor((satTime - hours * 10000) / 100);
double seconds = satTime % 100;
然后使用零填充并在其间添加':'。如果你愿意的话,你也可以截断或舍入到整秒,但是要注意秒数最多可以达到60,在这种情况下你必须将秒数归零,在分钟数上加1,然后如果得到则可以完成60分钟,小时数。
以上是关于如何将double值格式化为时间的主要内容,如果未能解决你的问题,请参考以下文章