如何将double值格式化为时间

问题描述 投票:0回答:2

我正在研究一个读取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?

java time format nmea
2个回答
1
投票
    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

但它确实需要两个小数(如果它们非零,则会将它们渲染回来)。如果小数位数可能不同,则至少有两个选项

  1. 使用DateTimeFormatterBuilder指定小数部分(甚至是可选的小数部分),其中包含0到9位小数之间的任何内容。
  2. hack:使用带有正则表达式的String.replaceFirst删除小数部分,然后将其从格式模式字符串中删除。

它还需要小数点前至少5位数,所以在一天的第一个小时内的时间需要有前导零,例如00:01:45的00145.00

由于时间总是以UTC为单位,您可能需要使用atOffsetLocalTime转换为OffsetTimeZoneOffset.UTC。如果您也知道日期,那么OffsetDateTimeInstant是合适的,但我没有深入研究文档以确定您是否知道日期。

链接


0
投票
int hours = (int) Math.floor(satTime / 10000);
int minutes = (int) Math.floor((satTime - hours * 10000) / 100);
double seconds = satTime % 100;

然后使用零填充并在其间添加':'。如果你愿意的话,你也可以截断或舍入到整秒,但是要注意秒数最多可以达到60,在这种情况下你必须将秒数归零,在分钟数上加1,然后如果得到则可以完成60分钟,小时数。

© www.soinside.com 2019 - 2024. All rights reserved.