Преобразование целого числа даты SQLLite в дату Java

Я работаю с кодом SQLLite, который хранит дату как целое число (я предполагаю, что так много дней с момента создания стиля). Я хотел бы преобразовать это в дату, но это...

public int getDate(){
...
Date d = new Date(m.getDate());

Кажется, дает мне неправильное значение.

Любые идеи?

ОБНОВЛЕНИЕ

Проблема 1.)

Если у кого-то такая же проблема, проблема в том, что SQLLite Integer не совсем целое число. Если я позвоню...

item.setDate(rs.getInt("date"));

Я получаю отрицательное число, по-видимому, это потому, что значение в БД больше, чем максимальное значение для java int. Как только я перехожу на...

item.setDate(rs.getLong("date"));

Значение соответствует ожидаемому. И это несмотря на то, что значения таблицы созданы как INTEGER.

Теперь я получаю значение "1383769720540277", которое соответствует БД, однако...

Date d = new Date(m.getDate()*1000L);

Дает мне дату 886-10-29, что тоже выглядит неправильно.

Обновление 2

В соответствии с этот инструмент должен быть в миллисекундах * 1000. Я работаю над способ справиться с этим, поскольку .001 является двойным и не может использоваться для создания длинного числа без округления.


person Jackie    schedule 15.11.2013    source источник
comment
Можете ли вы опубликовать образец целочисленного значения SQLLite и ожидаемую дату? java.util.Date ожидает миллисекунды с 01.01.70, а не дни.   -  person kielni    schedule 15.11.2013


Ответы (2)


Целое число SQLLite может иметь размер до 8 байт (от -2^63 до 2^63-1); см. http://www.sqlite.org/datatype3.html.

Целое число Java составляет всего 4 байта (от -2 ^ 31 до 2 ^ 31-1); длинный 8 байт; см. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Сейчас с эпохи UNIX прошло 1 384 621 644 секунды; это 1 384 621 644 000 миллисекунд или 1 384 621 644 000 000 микросекунд. Вам определенно нужен Java long, чтобы хранить их, так как они больше 4 байтов (4 294 967 295)

Похоже, ваша метка времени указана в микросекундах. Конструктор java.util.Date занимает миллисекунды с начала эпохи. Вы можете рассчитать миллисекунды из микросекунд, разделив их на 1000; не нужно преобразовывать в строку и обратно:

item.setDate(rs.getLong("date")/1000);

person kielni    schedule 16.11.2013
comment
Отличный комментарий, спасибо, кроме последней строки. Вы пробовали это? Потому что, когда я это сделал, я получил исключение времени компиляции, в котором говорилось, что он не может преобразовать двойное значение в длинное. при условии, что я использовал 1000 л вместо 1000. - person Jackie; 17.11.2013
comment
Также я просмотрел страницу SQLLite, которую вы разместили ранее, но я не вижу, где она перечисляет размеры для типов данных. - person Jackie; 17.11.2013
comment
Да, это сработало для меня: long ts = 1384621644000000L; Date dt = new Date(ts/1000); Информация о целочисленном размере находится в разделе «Классы хранения и типы данных»: INTEGER. Значение представляет собой целое число со знаком, хранящееся в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения. - person kielni; 18.11.2013

Тут возникла пара проблем...

  1. Тип Integer в SQLLite явно длиннее, чем тип Integer в Java. Это означает, что только потому, что он говорит, что Integer не означает, что вы должны использовать целое число. В моем случае мне нужно было использовать long, чтобы получить правильное значение.

    rs.getLong ("дата");

  2. Приложение, которое добавляло дату как целое число, хранило ее слишком подробно. Чтобы заставить его работать, мне пришлось убрать последние 3 символа.

    Строка s = String.valueOf(rs.getLong("дата"));

    s = s.substring(0, s.length()-3);

    item.setDate(Long.parseLong(s));

Как только оба из них были завершены, казалось, что они обрабатываются правильно. Если у кого-то есть более подробные/лучшие ссылки на то, что происходит, не стесняйтесь уточнить для проверки.

person Jackie    schedule 15.11.2013