在 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也参与其中)。
我在从 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也参与其中)。