2013-11-15 3 views
1

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

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

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

Любые идеи?

UPDATE

Задача 1.)

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

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

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

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

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

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

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

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

Update 2

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

+0

Вы можете оставить целое значение образца SQLLite и дату вы ожидаете? java.util.Date ожидает миллисекунд с 1/1/70, а не дней. – kielni

ответ

1

Целочисленное число 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

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

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

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

+0

Отличная благодарность за комментарии, за исключением последней строки. Вы пробовали это? Потому что, когда я это сделал, я получил исключение во время компиляции, заявив, что он не может отдать двойное надолго. я использовал 1000L вместо 1000. – Jackie

+0

Также я просмотрел ранее опубликованную страницу SQLLite, но я не вижу, где она перечисляет размеры для типов данных. – Jackie

+1

Да, это сработало для меня: 'long ts = 1384621644000000L; Дата dt = новая дата (ts/1000); 'Информация о целочисленном размере находится в разделе Классы хранения и типы данных: INTEGER. Значение представляет собой целое число со знаком, сохраненное в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения. – kielni

0

Существовали несколько проблем здесь ...

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

    rs.getLong ("date");

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

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

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

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

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

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