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();

надеюсь, что это помогает.