Cassandra:CQLSH 未显示正确的时区
Cassandra : CQLSH not displaying correct timezone
我在 cassandra 中有一个 table macrecord 如下:
macadd | position | record | rssi1 | timestamp
-------------------+----------+--------+-------+---------------------
D8:C7:C8:45:52:20 | 21 | 25 | 0 | 2015-09-25 08:41:00+0000
我正在使用 dateof(now()) 插入时间戳值,但问题是 CQLSH 只是显示默认的 UTC 时间,而没有添加时区偏移 +0800
在我的例子中。我怎样才能显示正确的时区。我在 ubuntu 14.04,我的系统时间是正确的。
好的,这就是问题所在。 CASSANDRA-10000 修复了 Windows 中日期格式的一些问题。但是由于每个平台都有自己的跟踪时区偏移量的方式,因此很难使 cqlsh 在 Windows 上工作而不包含一些额外的时区显示依赖项。因此选择了阻力最小的路径,现在所有平台都以 UTC 显示查询时间戳。
我将创建一个 JIRA 票证来解决这个问题,并为两种环境恢复正确的时区显示(希望如此)。
使用此修复程序需您自担风险
如果您觉得尝试它很舒服,以下是我自己解决此问题的方法:
在$CASSANDRA_HOME/pylib/cqlshlib/formatting.py
中查找strftime
方法定义。新的(从 2.2.1 开始)只包含两行:
def strftime(time_format, seconds):
tzless_dt = datetime_from_timestamp(seconds)
return tzless_dt.replace(tzinfo=UTC()).strftime(time_format)
您可以清楚地看到强制使用 UTC 时区的位置。本质上,只需注释掉(或删除)这些行,并将它们替换为 Cassandra <= (2.2.0 || 2.1.8) 中的 strftime
方法定义。如果您没有,这里是代码:
def strftime(time_format, seconds):
local = time.localtime(seconds)
formatted = time.strftime(time_format, local)
if local.tm_isdst != 0:
offset = -time.altzone
else:
offset = -time.timezone
if formatted[-4:] != '0000' or time_format[-2:] != '%z' or offset == 0:
return formatted
# deal with %z on platforms where it isn't supported. see CASSANDRA-4746.
if offset < 0:
sign = '-'
else:
sign = '+'
hours, minutes = divmod(abs(offset) / 60, 60)
return formatted[:-5] + sign + '{0:0=2}{1:0=2}'.format(hours, minutes)
我已经针对上述情况测试了这段代码,但肯定没有达到详尽的程度。就像我说的,使用风险自负。但这应该会阻止您,直到编写补丁来恢复此功能。
编辑 20161021
此问题已在 CASSANDRA-10397 版本 2.2.6、3.0.4 和 3.4 中修复。
CQLSH 默认使用 UTC 时区,因此您需要检查并修改 cassandra/conf/cqlshrc.sample 文件以更新时区,如下所示。
;;显示时区
;时区= Etc/UTC
如果没有,那么您需要安装 'pytz' python 库
希望这对你有用。
我在 cassandra 中有一个 table macrecord 如下:
macadd | position | record | rssi1 | timestamp
-------------------+----------+--------+-------+---------------------
D8:C7:C8:45:52:20 | 21 | 25 | 0 | 2015-09-25 08:41:00+0000
我正在使用 dateof(now()) 插入时间戳值,但问题是 CQLSH 只是显示默认的 UTC 时间,而没有添加时区偏移 +0800
在我的例子中。我怎样才能显示正确的时区。我在 ubuntu 14.04,我的系统时间是正确的。
好的,这就是问题所在。 CASSANDRA-10000 修复了 Windows 中日期格式的一些问题。但是由于每个平台都有自己的跟踪时区偏移量的方式,因此很难使 cqlsh 在 Windows 上工作而不包含一些额外的时区显示依赖项。因此选择了阻力最小的路径,现在所有平台都以 UTC 显示查询时间戳。
我将创建一个 JIRA 票证来解决这个问题,并为两种环境恢复正确的时区显示(希望如此)。
使用此修复程序需您自担风险
如果您觉得尝试它很舒服,以下是我自己解决此问题的方法:
在$CASSANDRA_HOME/pylib/cqlshlib/formatting.py
中查找strftime
方法定义。新的(从 2.2.1 开始)只包含两行:
def strftime(time_format, seconds):
tzless_dt = datetime_from_timestamp(seconds)
return tzless_dt.replace(tzinfo=UTC()).strftime(time_format)
您可以清楚地看到强制使用 UTC 时区的位置。本质上,只需注释掉(或删除)这些行,并将它们替换为 Cassandra <= (2.2.0 || 2.1.8) 中的 strftime
方法定义。如果您没有,这里是代码:
def strftime(time_format, seconds):
local = time.localtime(seconds)
formatted = time.strftime(time_format, local)
if local.tm_isdst != 0:
offset = -time.altzone
else:
offset = -time.timezone
if formatted[-4:] != '0000' or time_format[-2:] != '%z' or offset == 0:
return formatted
# deal with %z on platforms where it isn't supported. see CASSANDRA-4746.
if offset < 0:
sign = '-'
else:
sign = '+'
hours, minutes = divmod(abs(offset) / 60, 60)
return formatted[:-5] + sign + '{0:0=2}{1:0=2}'.format(hours, minutes)
我已经针对上述情况测试了这段代码,但肯定没有达到详尽的程度。就像我说的,使用风险自负。但这应该会阻止您,直到编写补丁来恢复此功能。
编辑 20161021
此问题已在 CASSANDRA-10397 版本 2.2.6、3.0.4 和 3.4 中修复。
CQLSH 默认使用 UTC 时区,因此您需要检查并修改 cassandra/conf/cqlshrc.sample 文件以更新时区,如下所示。 ;;显示时区 ;时区= Etc/UTC
如果没有,那么您需要安装 'pytz' python 库
希望这对你有用。