将历元以来的毫秒数转换为1582年之前的日历日期时出现问题

时间:2019-05-20 10:32:52

标签: java elasticsearch

我需要从Elasticsearch中获取日期,该日期存储为1581年5月14日在Java中。我有来自Elasticsearch的日期(以毫秒为单位)(-12264134400000)。在Java中转换为日期时,日期计算错误。我知道这与格鲁吉亚和朱利安历法有关,但是找不到解决方案。我正在使用的代码很简单:

Date dt = new Date(-12264134400000L);

上面给出的是1581年5月4日,而不是1581年5月14日。

要提供更多详细信息,我在Oracle数据库中输入了许多此类日期,这些日期已移至Elasticsearch。我从Elasticsearch获取日期的方式以毫秒为单位(这是从Lucene索引中读取数据的方式。将其视为约束)。因此,我想将毫秒转换回原始日期,以便可以将其与另一个日期进行比较。因此,如果elasticsearch将1581年5月14日转换为-12264134400000,我希望1581年5月14日返回。

2 个答案:

答案 0 :(得分:1)

您应使用Java 8中引入的java.time软件包:

LocalDate date = 
    Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();

这给出了预期的结果

答案 1 :(得分:1)

  

我从Elasticsearch获取日期的方式以毫秒为单位(这是从Lucene索引中读取数据的方式。将其视为约束)。

我会重新评估您提到的约束的必要性。谁在强加那个,为什么?

在{大约3950年}以后的某个时间点,可以接受自Unix epoch以来的毫秒数,但是您要通过将16世纪的历史日期转换为毫秒来设置一系列问题;包括但不限于弄清楚要使用哪个时区,以及如何确保将日期转换为毫秒的一面以及将其转换回日期的一面都使用相同的时区。 ElasticSearch如何将您的日期转换为毫秒时间戳?

还有一个非常现实的风险,就是您从未使用过的软件堆栈经过类似时间戳的字段中的历史日期进行测试,这些字段用于最近和当前时间。

如果您需要中间格式来传输这些日期,请使用YYYY-MM-DD字符串表示形式的YYYYMMDD中的ISO 8601个日历日期。这至少意味着对它们进行排序是开箱即用的。

要使用Java处理历史日期,请从Java 8中引入的java.time package开始(如@ sharon-ben-asher所述)。