日期/日历的奇怪行为

时间:2013-09-17 11:57:36

标签: java date calendar

我只想创建一个方法,将日期设置为同一天的时间“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 Sep 17 23:59:59 BRT 2013
Tue Sep 17 23:59:59 BRT 2013

但输出是
Tue Sep 17 23:59:59 BRT 2013
9月18日星期三11:59:59 BRT 2013

为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:5)

Calendar.HOUR用于12小时制,使用Calendar.HOUR_OF_DAY代替或为12小时制正确值:c.set(Calendar.HOUR, 11);

答案 1 :(得分:0)

使用JodaTime而不是Java Calendar。这是更方便用户的方式。

  
      
  • 所有Joda Time日期/时间对象都建立在长时间戳之上,因此从长时间创建这些对象的成本很低。

  •   
  • 在Joda Time ver 2.1中,从日期/时间组件(年,月,日,小时,分钟,秒)创建日期/时间对象比约3.5倍慢   与JDK GregorianCalendar相同的操作。   日期组件的加法/减法在Joda Time中比在GregorianCalendar中慢3.5倍。相反,时间   组件操作大约相同的3.5倍   GregorianCalendar实施。

  •   
  • 日期/时间解析的速度与JDK SimpleDateFormat的速度大致相同。 Joda解析的优点是创建了一个   解析器 - DateTimeFormatter对象非常便宜,不像   昂贵的SimpleDateFormat,因此您不必缓存解析器   了。

  •   

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