Cassandra:CQLSH没有显示正确的时区

时间:2015-09-25 08:57:19

标签: cassandra cqlsh

我在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上,我的系统时间是正确的。

2 个答案:

答案 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库

希望这对您有用。