【问题标题】:How to format a double value as time如何将双精度值格式化为时间
【发布时间】:2018-03-04 05:35:56
【问题描述】:

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

【问题讨论】:

  • LocalTime.of(satTime.intValue() / 10000, satTime.intValue() % 10000 / 100, satTime.intValue() % 100).toString()

标签: java time format nmea


【解决方案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 位数字,因此一天中第一个小时的时间需要有前导零,例如 00145.00 表示 00:01:45。

由于时间始终采用 UTC,您可能希望使用 atOffsetLocalTime 转换为带有 ZoneOffset.UTCOffsetTime。如果您也知道日期,OffsetDateTimeInstant 将是合适的,但我没有深入研究文档以确定您是否知道日期。

链接

【讨论】:

    【解决方案2】:
    int hours = (int) Math.floor(satTime / 10000);
    int minutes = (int) Math.floor((satTime - hours * 10000) / 100);
    double seconds = satTime % 100;
    

    然后补零并在其间添加':'。如果您愿意,您也可以截断或舍入到整秒,但是要小心将秒数舍入到 60,在这种情况下,您必须将秒数归零,将分钟数加 1,然后如果得到60 分钟,四舍五入。

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 2012-11-08
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多