当前位置: 首页 > 面试题库 >

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

潘兴朝
2023-03-14
问题内容

自1970年1月1日以来,以毫秒表示的时间戳是存储时间戳的常用方法,例如在Java中。

例如:

long timestampUtc = System.currentTimeMillis();

这样的时间戳可以以人类可读的时间格式进行格式化,例如使用此代码

    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);

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

现在想象一下,今天午夜时分,政府引入了新的UTC leap秒。如果我在tommorow上面运行代码,则系统上的Java
JRE无法知道该leap秒的介绍,并且会错误地格式化时间(一秒)。

我的假设正确吗?
在不能总是使用最新的JRE的系统中,如何正确格式化时间(例如,在日志文件中)?

背景信息:
这在嵌入式设备中使用,该设备通过GPS同步其系统时钟,而GPS的leap秒数偏移到UTC。


问题答案:

Java和Unix的“ epoch”(自1970年1月1日00:00:00
UTC以来的秒数)都完全忽略了leap秒。他们俩都假设每天(以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());

您将看到从1970年1月1日到2014年1月1日的秒数是86400的精确倍数(实际上是44年 365.25天/年
86400秒/天);不应这样,因为在此间隔中引入了25个leap秒。

如果需要考虑leap秒,则需要找到一个可以做到这一点的库,或者自己调整一下。



 类似资料:
  • 问题内容: java函数System。 currentTimeMillis ()显然返回自1970年1月1日以来的秒数。但是,根据Wikipedia.org/wiki/Leap_second的说法,自1972年以来已经有25个leap秒。这意味着自1970年1月1日以来的实际秒数比单纯的计算所建议的秒数多25。是否系统。 currentTimeMillis ()会天真的计算而忽略the秒吗? 问题

  • 问题内容: 我正在解析一些具有the秒时间戳记datetime的数据。我使用以下代码来解析该字符串并将其转换为datetime对象: Python文档声称这不应该成为接受的问题。但是,我在上面的时间戳中收到此错误 谢谢 问题答案: 做这个: 输出为:

  • 这个程序的输出与预期的一样,它给出2014-12-01 17:30:15。 但是当我在iFormat中将hh替换为hh(与outputformat相同)时,它给出的输出为12Out格式2014-12-01 05:30:15 如果我将两者都转换为小写,也会发生同样的情况。为什么会出现这种类型的不一致?

  • 我怎样才能使它出现而不必按回车键?!

  • 我不熟悉使用Java的内置时间API。我正在尝试获取UTC的当前时间,我希望能够将其转换为运行程序的任何人的时区。现在我有以下代码: 但是,这打印出来: 它似乎正在获取正确的时区,但没有将其应用于输出。所以如果我打印 他们都打印出“15”正确的方法是什么,让它给出应用时区偏移的时间?UTC时间是15,但我的当地时间是10。我希望能够将UTC转换为时区时间。 原因是我正在设置保存文件,所以我想记录文

  • 我有一个简单的问题: 输出:(我的时区是ICT) 问题是:日历在 DST 日返回此时区的错误时间。时区“美国/圣地亚哥”现在应该是UTC-3(参考:http://www.timeanddate.com/worldclock/chile/santiago)。它需要显示: