在 Apache Phoenix 中显示正确的 HBase 日期类型时出现问题

Problem showing correct HBase date type in Apache Phoenix

我在从 apache phoenix 读取通过 hbase api(使用 'put' 命令)创建的日期格式数据时遇到问题。

这是我期望的日期格式: 日期:2018-12-17T21:21:45+07:00 入 'yyyy-MM-dd' => '2018-12-17'

table 是使用以下 DDL 从 phoenix 客户端创建的:

CREATE TABLE "TEST"
(
 ID VARCHAR,
 "col1".TRX_DATES UNSIGNED_DATE 
 CONSTRAINT PKD PRIMARY KEY (ID)
)

但是,当我尝试查询数据时,它显示的日期格式不正确:

292269006-11-18

我尝试了一些研究和实验,使用各种数据类型将日期插入 hbase,包括使用日期的长值(毫秒)。但是,它仍然无法在 phoenix ('yyyy-MM-dd')

中显示正确的日期值

对这个案例有什么建议吗?

也许这应该是一条评论,因为我无法解释出现问题的所有细节,也无法解释您如何修复它。但我可以看到你的问题来自于自纪元以来毫秒的符号位的反转。我试过这个:

    long milli = OffsetDateTime.parse("2018-12-17T21:21:45+07:00").toInstant().toEpochMilli();
    milli += Long.MIN_VALUE; // Flip the sign bit
    Date wrongDateAsOldfashiondDate = new Date(milli);
    System.out.println(wrongDateAsOldfashiondDate);
    System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(wrongDateAsOldfashiondDate));

我电脑上的输出(在 Europe/Copenhagen 时区)是:

Fri Nov 18 08:08:49 CET 292269006
292269006-11-18

通常不应该使用旧的和设计不佳的 Date class,但这是我得到与你的完全相同的结果的方法。与现代日期和时间 API 的不同之处在于 Date 使用儒略历,因此显然这也被软件使用,给出了您意想不到的结果(可能是 Date class也参与其中)。