2016-03-29 3 views
0

Я извлекаю некоторые даты из базы данных Parse. Проблема в том, что одна из полученных дат из базы данных возвращает неверную дату. В этом случае, когда я получаю дату 01/10/2016, она возвращает 02/10/2016 вместо этого! Другие даты, однако, возвращают правильную дату (которая в этом случае является двумя другими датами в журнале (07/02/2016 и 21/02/2016).Java getDate возвращает неверную дату

За что странная причина отвечает за возвращение неверная дата только в одной этой дате, в то время как она возвращается на правильную дату на любой другом ?!

(список приведен список для parseObjects на моей базе данных, содержащие даты)

Date[] surveyDate = new Date[list.size()]; 
for(int i = 0; i<list.size(); i++){ 
    surveyDate[i] = list.get(i).getDate("day"); 
    System.out.println("surveyDate: " +surveyDate[i].getDate() + ", " + (surveyDate[i].getMonth()+1) + ", " + (surveyDate[i].getYear()+1900)); 
} 

Вход

I/System.out: surveyDate: date: 7, month: 2, 2016 
I/System.out: surveyDate: date: 21, month: 2, 2016 
I/System.out: surveyDate: date: 2, month: 10, 2016 

Здесь у меня есть изображение моих дат в базе данных, и вы можете видеть, что только последний (1 октября) возвращается с неправильным значением.

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

Даты на базе

enter image description here

+0

Вы не показываете, как вы получаете (или манипулируете) списком. есть ли даты в вашем изображении db, которых нет в вашем журнале, разве вам не интересно об этом? – Stultuske

+0

Извините, я не упоминал об этом. Список упорядочен и отсортирован, поэтому размер списка равен 3, содержащий 3 даты, которые регистрируются. Я отредактирую свое сообщение, чтобы сделать это более ясным –

+0

Попробовали ли вы вместо этого использовать класс 'Calendar'? Эти методы все устарели. Если вы думаете, что они должны работать, попробуйте ли вы вставить одну дату в локальное хранилище данных, а затем сразу же получите ее? Я очень сомневаюсь, что проблема заключается в функции Java getDate. –

ответ

0

Это, вероятно, связано с часовыми поясами. Проверьте часовые пояса сервера базы данных и сервера, который извлекает запись, они могут отличаться.

Хорошая практика - всегда использовать datetimeoffset, чтобы избежать путаницы.

2

Проверьте часовой пояс. Дата 1/10/2016 в БД близка к полуночи.

Возможно, вы извлекаете эти даты в GMT и устанавливаете часовой пояс JVM.

Это поможет, если вы распечатаете время и на консоли.

+0

О, конечно, я должен был подумать об этом немедленно! Ну, спасибо за отзывы, я исправил это сейчас, мое устройство восстанавливается за пару часов до базы данных ... –

+0

Perfect, призрак поймал! Я был бы признателен за ваш голос в ответе ;-) – jbernach

+0

@SteinarSeim Чтобы предотвратить подобный надзор, научитесь программисту мыслить в терминах «дата-время», «только дата» и «время-только», , Работа с датой - это сложный материал, тем более при пересечении Java, JDBC, SQL и базы данных. Быть более сознательным в отношении задействованных типов данных. –

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