代码之家  ›  专栏  ›  技术社区  ›  S73417H

处理Y2.036K和Y2.038K错误

  •  4
  • S73417H  · 技术社区  · 17 年前

    我目前正在做一个项目,要求我们的软件必须至少在2050年前运行。最近,我们在处理NTP协议中的Y2.036K“bug”和Y2.038K bug时遇到了问题。基本上,我们的软件必须在这些日期之后继续运行,并使用正确的时间戳记录所有数据。考虑到目前还没有解决这两个bug的方法,必须采用解决方法。

    我们的软件在这两个事件之后保持运行并正确记录日期是至关重要的。操作系统时间是否正确并不重要。考虑到我们使用Java,我们应该能够在滚动结束后处理相对于1900的黄金时期的日期。但是,如果JavaJVM在1970之前在UNIX EPOCH中设置,那么系统甚至不会运行!它只是崩溃了。

    为了向火灾中添加燃料,NTP服务器由另一个供应商提供,我们无法控制它。因此,使用另一个协议或修改服务器来处理其中的任何一个都是不可能的。

    需要创造性的解决方案。不用说,一定会发生一些深层的巫术。我们考虑了以下事项:

    1. 修改ntpd客户机软件,以某种方式与ntp服务器合作,并将本地时间从1970年而不是1900年的unix epoch日期偏移。因此,允许JVM在初始化时不崩溃地运行。所有的时间戳将处理相对于我们选择的滚动日期。(因此,基本上,请确保滚动到一个比Unix时代更大的日期)。

    2. 允许NTP修正时间滚动到1900 epoch,并找到一个修正,以便JVM不会崩溃。

    还有人处理过这个问题吗?还有,是否还有其他我没有预见到的问题,使得这些解决方案中的一个或两个根本不可行?

    1 回复  |  直到 12 年前
        1
  •  3
  •   p.campbell    16 年前

    在64位Linux和64位JVM上安装软件。 time_t 朋友们在这里是64位的,调整一下2038年过去的时间,看看东西是否还能用。如果你很好,扔掉NTP,找一个GPS或其他可以用作精确时钟的源,并保证它们没有32位的问题,连接你的软件读取/同步时间。

    推荐文章