java - 如何将 double 值格式化为时间

标签 java time format nmea

我正在开发一个读取 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

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

  1. 使用 DateTimeFormatterBuilder 指定小数部分(甚至是可选的小数部分),其中小数部分为 0 到 9 位小数。
  2. 技巧:使用 String.replaceFirst 和正则表达式来删除小数部分,然后将其从格式模式字符串中删除。

它还要求小数点前至少有 5 位数字,因此一天中第一个小时的时间需要有前导零,例如 00145.00 表示 00:01:45。

由于时间始终采用 UTC 格式,因此您可能需要使用 atOffsetLocalTime 转换为带有 ZoneOffset 的 OffsetTime .UTC。如果您也知道日期,则 OffsetDateTimeInstant 会比较合适,但我还没有深入研究文档来确定您是否知道日期。

链接

关于java - 如何将 double 值格式化为时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49092348/

相关文章:

scala - 在 Scala println 中格式化 Long 和 Double

java - 如何使用斯坦福解析器将文本拆分为句子?

Java Stream API - 按对象内部列表的项目进行分组

Python - 动态 Time.sleep()

scala - 用于格式化 Scala 代码的在线工具

c# - 具有复杂格式字符串的 MVVM 交叉绑定(bind)

java - 查找数组中消失的所有数字的大 O 时间复杂度

java - Bst树delete()方法不起作用

c++ - 为什么 ctime() 返回的字符串包含换行符?

python - 为什么python纽约时区显示4 :56 instead 4:00?