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
"为平历年
我大约 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
"为平历年