2016-10-04 4 views
2

Это дата, что я пытаюсь вставить в свою базу данных:Cassandra - Неправильный часовой пояс используется при вставке

'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}); 

Я установил Cassandra прямо из apache website и не устанавливал какой-либо часовой пояс или что-либо еще при установке или выполнении двоичного файла.

Кто-нибудь знает, почему настало 8 часов и как я могу это исправить?

Edit: Я пробовал разные жёстко прописанные даты, и, видимо, не все даты за 8 часов. Даты, связанные с месяцами февраля, марта и апреля, появляются в базе данных на 7 часов. Декабрь по-прежнему появляется на 8 часов.

Edit2: WOW! Поэтому я не упомянул IDE, который использовал для просмотра моих данных, потому что я не думал, что это важно, но я использую dbeaver. Я решил посмотреть мои данные, используя cqlsh в терминале (вместо того, чтобы смотреть на него в dbeaver), и значения верны! Я также попытался получить данные через node.js и распечатать значения, а также правильные значения! Это приводит меня к выводу, что есть что-то с dbeaver или драйвером cassandra, который он использует.

Это ошибка? Или есть способ правильно отобразить даты в dbeaver?

+0

Вы вставляете время через узел или штамп cassandra – Derek

+0

@derek Я вставляю время с узла (как показано в приведенном выше коде). – Kacy

+0

Каков тип базы данных для столбца date_created? try 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 в команду Target, чтобы он выглядел как . Затем я просто перетащил ярлык на рабочий стол.

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. Я добавил Edit в свой вопрос. – Kacy

+0

Btw, когда я запросил временные метки в узле, был включен часовой пояс '+ 0000'. – Kacy

Смежные вопросы