Java 中 Date 的不确定行为

Uncertain behaviour of Date in Java

我大约 2 年前部署了一个项目,但我在 Java 中遇到了一个奇怪的问题。

以下是我的代码行,适用于除 2015 年 12 月 29 日以外的所有日期 在控制器中

@RequestMapping(value = "/user/viewTimeSheet")
public ModelAndView viewtimesheet(ModelMap model,@RequestParam(value = "msg", required = false) String msg,@RequestParam(value = "error", required = false) String error) {
    if(SessionManagement.isSessionAlive()!=true)
    {
        return new ModelAndView("redirect:../pleaseLogin");
    }
    if (error != null) {
        model.put("error", error);
    }

    if (msg != null) {
        model.put("msg", msg);
    }
    System.out.println(new SimpleDateFormat("YYYY-MMM-dd").format(new Date()));
    model.put("total", timeSheetTempDAO.getCurrentDayHours(SessionManagement.getCurrentUserId(),new SimpleDateFormat("YYYY-MMM-dd").format(new Date())));
    model.put("timeSheetTempList",timeSheetTempDAO.getDailyTimeSheets(SessionManagement.getCurrentUserId()));
    return new ModelAndView("viewTimeSheetTempTile");
}

在 DAO 中

@Override
@SuppressWarnings("unchecked")
public List<TimeSheetTemp> getDailyTimeSheets(int userId) {
    List<TimeSheetTemp> list = new ArrayList<TimeSheetTemp>();
    Session session= HibernateUtil.getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();
    Query q = session.createQuery("FROM TimeSheetTemp t where userId="+userId +" and date='"+new SimpleDateFormat("YYYY-MMM-dd").format(new Date())+"' order by id");
    list = (List<TimeSheetTemp>) q.list();
    tx.commit();
    session.close();
    for(TimeSheetTemp t : list){
        if(t.getStatus().getId()!=1){
            if(t.getReviewedBy()!=null && t.getReviewedBy()!=0){
                t.setReviewedByName(getFullName(t.getReviewedBy()));
            }
        }
    }
    return list;
}

您可以在控制台看到我的日期是 2016 年,而我的系统日期是 2015 年!!!

还在我的数据库中添加了 2015 年。有人可以解释一下为什么会这样吗?

格式中的 Y 适用于 week-year,而非 day-year。

改用y

你的情况:

new SimpleDateFormat("yyyy-MMM-dd")

SimpleDateFormat错了!

使用

System.out.println(new SimpleDateFormat("yyyy-MMM-dd").format(new Date()));

而不是

 System.out.println(new SimpleDateFormat("YYYY-MMM-dd").format(new Date()));

"YYYY" 是 week-based 日历年。

"yyyy"为平历年