【问题标题】:Strange behavior of Date/Calendar日期/日历的奇怪行为
【发布时间】:2013-09-17 11:57:36
【问题描述】:

我只想创建一个方法,将日期设置为同一天的时间“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());

我期待
2013 年 9 月 17 日星期二 23:59:59 BRT
2013 年 9 月 17 日星期二 23:59:59 BRT

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

为什么会这样,我该如何解决?

【问题讨论】:

    标签: java date calendar


    【解决方案1】:

    Calendar.HOUR 用于 12 小时制,请改用 Calendar.HOUR_OF_DAY 或为 12 小时制输入正确的值:c.set(Calendar.HOUR, 11);

    【讨论】:

      【解决方案2】:

      使用 JodaTime 代替 Java 日历。这是一种更加用户友好的方式。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-15
        • 2020-05-02
        • 2014-03-18
        • 2014-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-23
        相关资源
        最近更新 更多