Следующий код для now()
выполняется дважды для объекта. Однажды обозначить его создание и другое время для обозначения, когда оно было записано в базу данных.DateFormat или Calender.getInstance иногда возвращает случайные значения
В контролируемом тесте мне удалось достоверно воспроизвести ошибку, где даты сильно различаются между собой. Некоторые даты, похоже, имеют правильную дату, но находятся в 00:00:00
или почти 00:00:00
.
Другие, по-видимому, относительно неактивны на несколько часов, варьируя от 1 часа до 16 или даже недель. У меня также были времена в будущем. Calendar.getInstance.getTime()
должен быть эквивалентен System.getCurrentTimeMillis()
, при этом последний возвращает время в будущем некоторое время.
Я ничего не нашел и буду дальше изучать этот вопрос и сообщать о своих выводах здесь.
private static DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
public static String calendarToDb(Calendar cal) {
if (cal == null) {
return null;
}
return simpleDateFormat.format(cal.getTime());
}
public static String now() {
return calendarToDb(Calendar.getInstance());
}
Ниже приведена соответствующая часть журнала с андроид-монитора. Это настоящее устройство, а не эмулятор. M для MessageManager и Р для ContentProvider
08-30 18:07:17.267 M: main starttime = 2016-01-01T00:07:00+0100\
08-30 18:07:17.306 P: AsyncQueryWorker CreateTime = 2016-08-30T18:07:17+0200\
08-30 18:07:18.326 M: main starttime = 2016-01-01T00:00:00+0200\
08-30 18:07:18.371 P: AsyncQueryWorker CreateTime = 2016-08-30T18:07:18+0200\
08-30 18:07:19.898 M: main starttime = 2016-08-30T18:07:19+0200\
08-30 18:07:19.920 P: AsyncQueryWorker CreateTime = 2016-08-30T00:00:00+0100\
Я получил больше данных в моей базе данных, которая выглядит даже страннее и не должно произойти вообще.
странно ... Предполагаю, что вы используете несколько потоков. Рассматривали ли вы использование новой даты api java8 или с помощью 'JodaTime'? – abbath
Да, я использую разные потоки (основной и AsyncQueryWorkerThread). Я не думаю, что java8 доступен для более ранних афинов уровня api? – HopefullyHelpful
Дело в том, что большую часть времени он работает, он просто имеет смысл иногда возвращать случайное значение или сбросить даты/время – HopefullyHelpful