Intereting Posts
Как я могу полностью скрыть идентификатор группы ExpandableListView? SoapFault – ошибка: «ns1: непредвиденная ошибка» android SOAP call О WebView в RecyclerView? Android-сообщения – разработка и распространение Предупреждение NullPointerException для getView () внутри метода onActivityCreated / onStart / onViewCreated Использование датчика ориентации для указания на конкретное местоположение Плитка вытягиваемая иногда растягивается Как программно кэшировать / загружать карту google map v2? Анализ недействительных амперсандов с помощью XmlPullParsers от Android Как создать экземпляр класса фрагмента с использованием имени класса вместо индекса Как программно сделать снимок экрана в Android? Подключение к внешней базе данных – приложение для Android TextInputLayout не показывает подсказку EditText, прежде чем пользователь будет фокусироваться на ней Изменение образа ImageView программным способом NoClassDefFoundError с Android Studio на Android 4

JAVA – Это ошибка в классе java.util.Calendar или что?

Я сталкивался с той же проблемой много раз.

Эта же проблема была связана с этим вопросом и получила решение как то же самое, как сравнить известные часы текущего часа в андроиде?

Проблема:

Когда я использую Calendar calCurr = Calendar.getInstance(); Чтобы получить объект Calendar текущей даты и времени, он всегда возвращает меня неправильно.

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

См. Мой пример:

  Calendar calCurr = Calendar.getInstance(); Log.i("Time in mili of Current - Normal", ""+calCurr.getTimeInMillis()); // see what it gives? dont know why? Date date = new Date(); calCurr.set(date.getYear()+1900, date.getMonth()+1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()); // so added one month to it Log.i("Time in mili of Current - after update", ""+calCurr.getTimeInMillis()); // now get correct 

Вопрос:

  • Почему это дает неправильный результат?
  • Это ошибка там, или моя концепция о классе «Календарь» неверна?
  • Скажите мне, что должно было быть сделано для этого?

Solutions Collecting From Web of "JAVA – Это ошибка в классе java.util.Calendar или что?"

Он отлично работает, как и ожидалось, если вы getDate() на getDate() он выводит:

Время в mili of Current – Normal Wed Apr 04 11:34:34 BST 2012

Время в mili Current – после обновления Пт Май 04 11:34:34 BST 2012

Что вы ожидаете ? И в миллисекундах это также равно 30 дням:

Время в mili of Current – Normal 1333535834557

Время в mili Current – после обновления 1336127834557

И вычисление (разность, деленная на миллисекунды в день):

 1336127834557 - 1333535834557 = 2 592 000 000 2592000000 / 86400000 = 30 

И сегодняшняя дата в миллисекундах после 1970 года – 1333536754 … которая подходит, я не вижу проблемы.

РЕДАКТИРОВАТЬ

Ваша проблема в том, что вы устанавливаете месяц как 3 для марша … там вам нужно установить 2..cause месяца индексируются от 0 до 11.

Не используйте date.getXXX() . Не используйте сеттер или геттер, кроме Date.getTime() . Все они устарели. Использование их приведет к неожиданным результатам.

Если вы вызываете Calendar.getInstance() , он уже установлен на текущую дату. Если вы хотите установить или добавить дни, месяцы, что угодно, установите их в календаре.

Например, calCurr.set(Calendar.MONTH,2) или calCurr.add(Calendar.DAY,1) .

Java Date Based API разработан неправильно. В будущих версиях я думаю, что некоторые проблемы API будут рассмотрены.

Я бы рекомендовал использовать JodaTime .

Это НЕ ошибка, Календарь возвращает то, что нужно (по крайней мере, здесь).

 Calendar calCurr = Calendar.getInstance(); Log.i("Time in mili of Current - Normal", ""+calCurr.getTimeInMillis()); // see what it gives? dont know why? 

Я получил 1333546375707 миллисекунд, что является правильным значением (также рассчитывается вручную).
Какую ценность вы ожидаете здесь? Как вы знаете, что это неправильно?


 Date date = new Date(); calCurr.set(date.getYear()+1900, date.getMonth()+1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()); // so added one month to it 

Зачем добавлять ОДИН в месяц? Месяц даты и календаря не зависит от нуля – не нужно добавлять 1.


РЕДАКТИРОВАТЬ
Вычисление вручную (аппроксимируется):

 2012 - 42 years * 365.24 days/year * 86400 seconds/day April - (31 + 29 + 31) days * 86400 4th - 3 days * 86400 13:30 - 13.5 hours * 3600 seconds/hour ==================== 1333553112 seconds 

Календарные месяцы индексируются с нулевой отметкой. Поэтому, когда вы хотите установить для марта его 2 не 3

Кроме того, Не устанавливайте год, месяц и дату из объекта Date. Если вы должны инициализировать календарь до даты, сделайте это следующим образом:

  Calendar cal = Calendar.getInstance(); cal.setTime(date); 

Имейте в виду, что ваш объект Date может отличаться от того, что вы думаете.

Это странная реализация Calendar . По некоторым причинам январь – месяц 0, а годы также не очень логичны.

Я рекомендую библиотеку времени Joda.

Мы используем нижеследующие строки кода для нахождения текущей даты и времени. Он отлично работает на нашей стороне.

  java.util.Calendar calc = java.util.Calendar.getInstance(); int day = calc.get(java.util.Calendar.DATE); int month = calc.get(java.util.Calendar.MONTH)+1; int year = calc.get(java.util.Calendar.YEAR); String dayStr,monthStr; if(day<10){ dayStr = "0"+day; }else{ dayStr = ""+day; } if(month<10){ monthStr = "0"+month; }else{ monthStr = ""+month; } /*String currentdate = monthStr+"/"+dayStr+"/"+year+" ";*/ String currentdate = dayStr+"/"+monthStr+"/"+year+" "; /*String currenttime = currentdate + String.valueOf(calc.get(java.util.Calendar.HOUR_OF_DAY))+ ":"+ String.valueOf(calc.get(java.util.Calendar.MINUTE))+":"+String.valueOf(calc.get(java.util.Calendar.SECOND));*/ return currentdate; 

Когда объект Calendar создается с помощью Calendar.getInstance (), задается переменная экземпляра «время» в объекте «Календарь», и это значение будет изменено, только если вы используете функцию Calendar.setTimeInMillis ().
Фрагмент кода из объекта Calendar:

 public long getTimeInMillis() { if (!isTimeSet) { updateTime(); } return time; } 

Здесь «isTimeSet» станет «истинным», когда вызывается Calendar.getInstance (), и он возвращает «время» каждый раз, не обновляя время.

Именно по этой причине вы получаете одинаковое значение времени каждый раз, когда вы вызываете calCurr.getTimeInMillis ();

Надеюсь это поможет.