2015-09-25 42 views
1

我有卡桑德拉表macrecord如下:卡桑德拉:CQLSH显示不正确的时区

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

+0

你正在运行哪个版本的Cassandra? 2.2.1偶然? – Aaron

+0

嗨亚伦。是的,我正在运行2.2.1。我也试过版本2.1.9,我也可以在版本2.1.9上重现这个问题。这是一个错误? – srai

+0

我这么认为。 Python格式化库从上一个发行版发生了变化(考虑到Windows时间格式),并且TZ偏移量现在在Bash中为零。我会在飞回家的时候看看它,为它创建一个JIRA,并且(希望)会有一个补丁。 – Aaron

回答

1

好的,这是对这个问题的看法。 CASSANDRA-10000解决了Windows中日期格式设置的一些问题。但是,由于每个平台都有自己的方式来跟踪时区偏移量,因此很难让cqlsh在Windows中工作,而不包括用于时区显示的其他依赖项。因此选择了阻力最小的路径,现在所有平台都以UTC显示查询的时间戳。

我打算创建一个JIRA票据来解决这个问题,并为两个环境获得适当的时区显示(希望)。

使用此修补AT您自行承担

如果你觉得舒服尝试它,这里是我是如何解决这个我自己:

$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的strftime方法定义替换它们= < =(2.2.0 || 2.1.8)。如果你没有的话,这里是代码:

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。

+0

我试过了解决方案,但它给出了一个错误:回溯(最近一次调用最后一次): 文件“bin/cqlsh”,行125,在 from cqlshlib.formatting import(format_by_type,format_value_utype, File“/ usr/local/hadoop/cassandra211 /bin/../pylib/cqlshlib/formatting.py“,第200行 if local.tm_isdst!= ^ SyntaxError:无效的语法 – Naresh

+0

if条件中”if local.tm_isdst!=“你没有比较它值。我已经纠正它,并采取了以前的cassandra版本的代码,但仍然无法正常工作。 – Naresh

+0

@Naresh你说得对,该行应该是'if local.tm_isdst!= 0'。我不知道如何错过了。很抱歉,这个修复方法对你不起作用(即使使用'!= 0:')。我能够在2.1.8上工作,但我发现它不在2.2.x中。我的猜测是该版本必须更进一步,以及一些额外的变化。让我看看我能否实现它的工作。 – Aaron