JAVA-это ошибка в java.утиль.Календарь или что?
я столкнулся с той же проблемой много раз.
та же проблема была с этим вопросом и получила такое же решение, как сравнить известные часы объявления текущий час в Android?
:
когда я использую Calendar calCurr = Calendar.getInstance();
чтобы получить объект календаря текущей даты и времени, он всегда возвращает меня неправильно.
Я положил журналы и проверил его, и чтобы сделать его правильным, мне пришлось добавить годы и месяцы, а затем я получил правильный объект для текущей даты и времени.
См. Мой Пример :
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
вопрос :
- почему он дает неправильный выход?
- это ошибка там или моя концепция о классе календаря неверна?
- скажите мне, что нужно было сделать за это?
8 ответов
он работает отлично, как ожидалось, если вы измените на getDate()
выдает :
время в милях текущего-нормальный Ср 04 Апр 11:34: 34 BST 2012
время в mili текущего-после обновления Пт май 04 11:34: 34 BST 2012
чего вы ждете ? И в миллисекундах это также равно 30 дням:
время в милях тока-нормальное 1333535834557
время в mili текущего-после обновления 1336127834557
и расчет (разница, деленная на миллисекунды в день) :
1336127834557 - 1333535834557 = 2 592 000 000
2592000000 / 86400000 = 30
и сегодняшняя дата в миллисекундах после 1970 1333536754 ... что подходит, я не вижу проблемы.
редактировать
ваша проблема в том, что вы устанавливаете месяц, как 3 Для марта...там нужно установить 2..причиной месяцы нумеруются от 0 до 11.
не используйте date.getXXX()
. Не используйте сеттер или геттер, кроме Date.getTime()
. Они все устарели. Их использование приведет к неожиданным результатам.
если вы называете Calendar.getInstance()
, он уже установлен на текущую дату. Если вы хотите установить или добавить дни, месяцы, что угодно, установите их в календаре.
Е. Г. calCurr.set(Calendar.MONTH,2)
или calCurr.add(Calendar.DAY,1)
.
это не ошибка, календарь возвращает то, что он должен (по крайней мере, здесь).
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 может отличаться от того, что вы думаете.
JAVA Date Based API неправильно разработан. в будущих версиях я думаю, что некоторые проблемы API планируется решить.
Я бы рекомендовал использовать JodaTime.
Это странная реализация 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.getInstance () устанавливается переменная экземпляра "time" в объекте Calendar, и это значение будет изменено только при использовании
Календарь.функция setTimeInMillis ().
Фрагмент кода из объекта Calendar:
public long getTimeInMillis() {
if (!isTimeSet) {
updateTime();
}
return time;
}
здесь "isTimeSet" станет "true", если "календарь".getInstance () вызывается и возвращает "время" каждый раз без обновления времени.
это причина, по которой вы получаете одинаковое значение времени каждый время звонить. калькурр.getTimeInMillis();
надеюсь, что это помогает.