我在cassandra中有一个表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时间而不是在我的情况下添加时区offet +0800
。如何显示正确的时区。我在ubuntu 14.04上,我的系统时间是正确的。
答案 0 :(得分:1)
好的,这就是这个问题。 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
对于版本2.2.6,3.0.4和3.4,CASSANDRA-10397修复了此问题。
答案 1 :(得分:0)
CQLSH默认使用UTC时区,因此您需要检查和修改cassandra / conf / cqlshrc.sample文件以更新时区,如下所示。 ;;显示时区 ; timezone = Etc / UTC
如果没有,那么您需要安装“ pytz” python库
希望这对您有用。