2013-09-17 2 views
3

Я просто хочу создать метод, который устанавливает дату до времени «23: 59: 59.999» того же дня. Так что я сделал это:Странное поведение даты/календаря

public static Date date235959(Date date) { 
    Calendar c = Calendar.getInstance(); 
    c.setTime(date); 
    c.set(Calendar.HOUR, 23); 
    c.set(Calendar.MINUTE, 59); 
    c.set(Calendar.SECOND, 59); 
    c.set(Calendar.MILLISECOND, 999); 
    //c.set(Calendar.AM_PM, Calendar.PM); 

    return c.getTime(); 
} 

Когда я бегу:

Date d = new Date(); 
d=date235959(d); 
System.out.println(d.toString()); 
d=date235959(d); 
System.out.println(d.toString()); 

Я ожидал
Tue 17 сентября 23:59:59 BRT 2013
Вт Сен 17 23:59:59 BRT 2013

Но выход был
вт 17 сентября 23:59:59 BRT 2013
ср 18 сентября 11:59:59 BRT 2013

Почему это произошло и как я могу это исправить?

ответ

5

The Calendar.HOUR используется для 12-часовой, используйте Calendar.HOUR_OF_DAY вместо или поставить правильное значение для 12-часовой: c.set(Calendar.HOUR, 11);

0

Используйте JodaTime вместо Java Calendar. Это удобнее для пользователя.

  • Все Joda Время объекты даты/время построены на вершине длинных меток времени, так дешево, чтобы создать эти объекты долго.

  • В Joda Time версии 2.1 создание даты/времени объект из компонентов даты/времени (год, месяц, день, час, мин, сек) ~ 3,5 раз медленнее, чем та же операция для JDK GregorianCalendar. Компонент добавления/вычитания компонентов в 3.5 раза медленнее в времени Джоды, а не в GregorianCalendar. Наоборот, время операций с компонентами примерно одинаково в 3,5 раза быстрее, чем Реализация GregorianCalendar.

  • Анализ синтаксиса даты и времени работает примерно на той же скорости, что и в JDK SimpleDateFormat. Преимущество разбора Joda заключается в том, что создание парсера - объекта DateTimeFormatter чрезвычайно дешево, в отличие от дорогостоящего SimpleDateFormat , поэтому вам больше не нужно кэшировать парсеры .

http://java-performance.info/joda-time-performance/

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