2015-09-25 44 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