首页 > 解决方案 > jconsole 时间格式是什么?

问题描述

我最近使用 jconsole 监控了我的 java 程序。我将 CPU 使用率数据保存为 csv 文件。这就是我所拥有的:

Time,CPU Usage
43690.008014,1,8
43690.008060,0,1
43690.008106,0,1
43690.008153,0,1
43690.008199,0,1
43690.008245,0,1

CPU Usage专栏很清楚,但我不能对专栏说同样的话Time。是什么43690.008014?我怎样才能把它解析成Date?我这辈子没见过这样的事。

标签: javatimedurationjconsole

解决方案


CSV 文件中记录的持续时间是从1899-12-311开始的天数。为了获取当前日期,您可以将此持续时间添加到LocalDate.of(1899, 12, 30).atStartOfDay().atOffset(ZoneOffset.UTC). 我建议您使用java.time.Duration它以ISO-8601 标准为模型,并作为JSR-310 实现的一部分与Java-8一起引入。该函数为您提供表示指定的纳秒数。尽管已经有一个函数,但我建议您使用此函数的原因是这些函数将一个值作为参数,如果您将日志文件(例如)中的持续时间转换为,其小数部分将给你一个不正确的结果。Duration#ofNanosDurationDuration#ofDayslong43690.008014long

因此,将这些天数转换为纳秒,Duration从生成的纳秒中获取并将其添加LocalDate.of(1899, 12, 30).atStartOfDay().atOffset(ZoneOffset.UTC)UTC.

演示:

import java.time.Duration;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        OffsetDateTime startDateTime = LocalDate.of(1899, 12, 30).atStartOfDay().atOffset(ZoneOffset.UTC);
        OffsetDateTime current = startDateTime
                .plus(Duration.ofNanos((long) (43690.008014 * 24 * 60 * 60 * 1000_000_000)));
        System.out.println(current);
    }
}

输出:

2019-08-13T00:11:32.409600512Z

从Trail: Date Time了解现代日期时间 API 。


1为什么 Access / SQL Server 中的零日期是 1899-12-30 而不是 12/31?


推荐阅读