【问题标题】:Cassandra : CQLSH not displaying correct timezoneCassandra:CQLSH 未显示正确的时区
【发布时间】:2015-12-23 01:33:36
【问题描述】:

我在 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 时间,而不是在我的情况下添加时区偏移 +0800。我怎样才能显示正确的时区。我在 ubuntu 14.04,我的系统时间是正确的。

【问题讨论】:

  • 您运行的是哪个版本的 Cassandra? 2.2.1 偶然?
  • 嗨亚伦。是的,我正在运行 2.2.1。我也尝试过 2.1.9 版,我也可以在 2.1.9 版上重现该问题。这是一个错误吗?
  • 我想是的。 Python 格式化库已从上一个版本更改(以考虑 Windows 时间格式化),并且 TZ 偏移量现在在 Bash 中为零。我会在飞回家时查看它,为它创建一个 JIRA,并(希望)一个补丁。
  • 确保在您的环境中设置了正确的 TZ:stackoverflow.com/questions/28361233/…

标签: cassandra cqlsh


【解决方案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 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 版本。

【讨论】:

  • 我尝试了您的解决方案,但它给出了一个错误: Traceback (last recent call last): File "bin/cqlsh", line 125, in from cqlshlib.formatting import (format_by_type, format_value_utype,文件“/usr/local/hadoop/cassandra211/bin/../pylib/cqlshlib/formatting.py”,第 200 行 if local.tm_isdst != ^ SyntaxError: invalid syntax
  • 在 if 条件“if local.tm_isdst !=”中,您没有比较任何值。我已经更正了它并从以前的 cassandra 版本中获取了代码,但它仍然不起作用。
  • @Naresh 你是对的,那行应该是if local.tm_isdst != 0。我不知道那是怎么错过的。很抱歉,此修复对您不起作用(即使使用 != 0:)。我能够让它在 2.1.8 上工作,但我发现它在 2.2.x 中没有。我的猜测是该版本必须更远以及一些其他更改。让我看看我能不能让它工作。
  • JIRA 错误 ID 是什么,何时可以修复(暂定)?
  • 嗨,我正在为 node.js 使用 cassandra 驱动程序,它也是 selecting 没有偏移量的时间戳列(它将它设置为 UTC)。 cqlsh 也在这样做([cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]),我不知道如何insert 时间戳才能正确存储/查询/显示,请帮助。谢谢
【解决方案2】:

CQLSH 默认使用 UTC 时区,因此您需要检查和修改 cassandra/conf/cqlshrc.sample 文件以更新时区,如下所示。 ;;显示时区 ;时区=等/UTC

如果没有,那么你需要安装'pytz' python 库

希望这对你有用。

【讨论】:

    猜你喜欢
    • 2018-04-07
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多