考虑到新引入的闰秒,1岁(java)lib如何正确执行UTC时间格式化

Ale*_*ien 14 java time gps date

自UTC.1.1707 UTC以来以毫秒表示的时间戳是存储时间戳的常用方法,例如在Java中.

例如:

long timestampUtc = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)

这样的时间戳可以以人类读取时间格式形成,例如使用该代码

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
    df.setTimeZone(TimeZone.getTimeZone("UTC"));
    String humanTimeUtc = df.format(new Date(timestampUtc));
    System.out.println(humanTimeUtc);
Run Code Online (Sandbox Code Playgroud)

给出输出: 2014-02-14 14:58:05

现在想象一下,今天午夜时分,管理层引入了新的UTC闰秒.如果我在tommorow上面运行代码,我系统上的java JRE就不会知道闰秒的介绍,并且会错误地格式化时间(一秒钟).

我的推定是否正确?
如何在不能始终使用最新JRE的系统中正确格式化时间(例如,在日志文件中)?

背景信息:
这用于嵌入式设备,该设备通过GPS同步其系统时钟,具有闰秒的GPS数量到UTC.

dcs*_*ohl 5

Java和Unix"epoch"(自1970年1月1日00:00:00 UTC以来的秒数)都完全忽略了闰秒.他们都假设每天(以UTC衡量)恰好有86400秒.一个简单的代码块来验证:

    Calendar c = Calendar.getInstance();
    c.setTimeZone(TimeZone.getTimeZone("UTC"));
    c.set(2014, 0, 1, 0, 0, 0);
    c.set(Calendar.MILLISECOND, 0);
    System.out.println(c.getTimeInMillis());
Run Code Online (Sandbox Code Playgroud)

您将看到从1970年1月1日到2014年1月1日的秒数是86400的精确倍数(实际上恰好是44年*365.25天/年*86400秒/天); 它不应该是,因为在该间隔中引入了25个闰秒.

如果您需要考虑闰秒,您需要找到一个可以执行此操作的库,或者进行自己的调整.