Java 如何将双精度值格式化为时间

Java 如何将双精度值格式化为时间,java,time,format,nmea,Java,Time,Format,Nmea,我正在开发一个读取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")) {

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

int hours = (int) Math.floor(satTime / 10000);
int minutes = (int) Math.floor((satTime - hours * 10000) / 100);
double seconds = satTime % 100;
然后零填充,中间加上“:”。如果您愿意,您也可以将秒数截断或四舍五入到整秒数,但要小心将秒数四舍五入到60,在这种情况下,您必须将秒数归零,将分钟数加1,然后如果您得到60分钟并将小时数四舍五入,则可以重新计算

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

    由于时间始终以UTC为单位,您可能希望使用
    atOffset
    LocalTime
    转换为
    OffsetTime
    ,使用
    ZoneOffset.UTC
    。如果您也知道日期,则使用
    OffsetDateTime
    Instant
    是合适的,但我还没有深入研究文档,以了解您是否知道日期

    链接
    • 解释如何使用
      java.time
    LocalTime.of(satTime.intValue()/10000,satTime.intValue()%10000/100,satTime.intValue()%100)。toString()