使用 Java 转换 18 位十进制 Julian 时间戳

Convert 18 decimal Julian Timestamp with Java

我需要将我认为的 Julian 时间戳转换为具有 Java 的常规时间戳。

生成此时间戳的应用程序是专有支付系统(ACI 的 Base24-EPS)。我需要能够使用 Java 应用程序从数据库中提取和解析值。

十进制的示例时间戳值是 18 位数字:

137955731472778910

使用 DALCI(Base24-EPS 提供的内部工具),我可以看到这相当于:

3: convert 137955731472778910 to datetime(yyyy/mm/dd hh:mm:ss);
2019/12/14 12:39:07

我找到了一个似乎相关的答案 here。但是 137955731472778910 小于 210866803200000000,这是 1970 年 1 月 1 日的 Julian 时间戳(unix 时间的纪元)。

我看到的所有其他 Julian 时间戳在线转换器,例如 http://www.onlineconversion.com/julian_date.htm,都将 Julian 日期格式设置为双 2458806.52903

18位好像太长了

你知道我如何用 Java 解析这种时间戳格式吗?

非常感谢。

假设你在 UTC 时区(你可能不是,但你没有告诉我你在哪个时区),我有一个公式:

long timestampFromAci = ...;
long timestampJava = (timestamp - 122192460002790000L) / 10000;

Instant.ofEpochMilli(timestampJava);
new Date(timestampJava); // Old, deprecated - use java.time classes

这假设转换是线性的。

您的产品时间戳每毫秒有 10000 个单位,因为 2019/11/19 16:48:15 和 2019/12/14 12:39:07 之间有 2145052000 毫秒,您的产品时间戳的差异是21450514084700。

如果将这两者相除,几乎正好是 10000 - 不同之处在于您的工具不显示小数秒。

据此推断,我可以得出您的产品时间戳对于 Unix 纪元操作 1/1/1970 - 122192460002790000 的值。

但是,正如我所说,我假设您处于 UTC 时区。对于您的时区偏离 UTC 的每一小时,您需要将该数字调整 3600 秒乘以每秒 10,000,000 个产品时间戳单位。