2016-10-04 127 views
2

時使用這就是我想插入我的數據庫日期:卡桑德拉 - 錯誤的時區將

'1970-01-18T00:00:00+00:00' 

但是,當我看到在數據庫中的條目是8小時背後:

1970-01-17 16:00:00 

我的Ubuntu系統上使用的時區是UTC。我檢查由其中輸出端子輸入date

Tue Oct 4 00:00:53 UTC 2016 

我使用的node.js,這基本上是正在使用的代碼中插入:

const Cassandra = require('cassandra-driver'); 
const Promise = require('bluebird'); 
const db = Promise.promisifyAll(new Cassandra.Client({ contactPoints: ['127.0.0.1'], keyspace: 'project' })); 

let date_created = '1970-01-18T00:00:00+00:00'; 
db.executeAsync("INSERT INTO posts (id, date_created) VALUES (?, ?);", [someID, date_created], {prepare: true}); 

我安裝卡桑德拉直接從apache website,並且在安裝或執行二進制文件時沒有指定任何時區或任何東西。

有誰知道爲什麼時間是8個小時了,我該如何解決?

編輯: 我嘗試了不同的硬編碼的日期,顯然不是所有的日期是8小時落後。與2月,3月和4月的月份相關的日期在數據庫中顯示7個小時。 12月仍然會出現8小時後。

EDIT2: WOW!所以我沒有提到我用來查看數據的IDE,因爲我認爲這並不重要,但我正在使用dbeaver。我決定在終端中使用cqlsh查看我的數據(而不是在dbeaver中查看它),並且的值是正確的!我也嘗試通過node.js檢索數據並打印出值,並且值也是正確的!這導致我得出結論,有dbeaver或它使用的cassandra驅動程序。

這是一個錯誤?或者有沒有辦法讓日期在dbeaver中正確顯示?

+0

您是通過節點插入時間還是由cassandra加蓋 – Derek

+0

@derek我從節點插入時間(如上面的代碼所示)。 – Kacy

+0

date_created列的數據庫類型是什麼?嘗試1970-01-18T00:00:00 + 0000而不是1970-01-18T00:00:00 + 00:00 – Veeram

回答

0

問題在於dbeaver使用jvm,它依賴於jvm使用的任何時區來顯示日期,這對我來說是自從我住在加州以來的太平洋時區。這解釋了7/8小時的時差(取決於夏令時)。數據本身是正確的,但(dbeaver只是爲了顯示而改變它)。

要更改哪個時區用於在dbeaver中顯示日期,您只需添加幾個命令行參數即可。如果從終端dbeaver運行,該命令是:

path/to/dbeaver.exe -vmargs -Duser.timezone=UTC 

爲了使這個簡單的,所以你不必鍵入中,我建議創建一個桌面快捷方式每次。我在Windows機器上,所以我右鍵單擊可執行文件,單擊新建>快捷方式,右鍵單擊快捷方式,單擊properties,並將-vmargs -Duser.timezone=UTC附加到目標命令,以使其看起來像path/to/dbeaver.exe -vmargs -Duser.timezone=UTC。然後,我只是將快捷方式拖到桌面上。

0

Cassandra timestamp代表一個時刻,並且不存儲時區信息,JavaScript中的正確表示是Date

當轉換爲字符串時,Date實例根據系統(運行Node.js的系統)的時區顯示日期和時間。

你的情況:

const d1 = new Date('1970-01-18T00:00:00+00:00'); 
// Numeric value as the number of milliseconds since UNIX epoch. 
const time = d1.getTime(); 
db.executeAsync(insertQuery, [ id, d1 ], { prepare: true }); 
// ... 
db.executeAsync(selectQuery, [ id ], { prepare: true }) 
    .then((result) => { 
    console.log('Are equal?', time, result.first()['date_created'].getTime()) 
    }) 

的2個值應該是平等的。

+0

我使用了一個Date對象,就像你一樣,不幸的是它沒有改變數據庫中的結果。我決定將日期更改爲不同的硬編碼值,以防萬一我錯過了某些明顯的東西,並且出現了一些奇怪的行爲,其中有些月份會出現7小時而不是8次。我在我的問題中添加了編輯。 – Kacy

+0

順便說一句,當我查詢節點中的時間戳時,包括了時區「+ 0000」。 – Kacy