我有一张桌子" Foo"通过Web应用程序(jsf + spring dao + hibernate)以编程方式查询。该表有许多列,其中一列是日期列,其数据类型为CLOB,但数据在字符串中注册为MM / dd / yyyy格式。 id列是表的主键。
有一次,日期值是2018年2月16日。
---------------------
| id | date |
---------------------
| 1000 | 02/16/2018 |
---------------------
今天我通过以下代码通过网络应用程序将其设置为2018年3月16日。
Foo foo = tableFooRepository.findById(..); // returns a row in where date is 02/16/2018
SimplDateFormat sdf = new SimpelDateFormat("MM/dd/yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // <-- added originally missed statement
Date lastDate = sdf.parse(foo.getDate());
Date today = <using Calendar.getInstance I have today's date as Fri Mar 16 00:00:00 EDT 2018>
if (lastDate.before(today)) {
foo.setDate(sdf.format(today));
} else {
// do something else
}
非常简单的过程。第一次执行代码时,日期已正确设置为&#34; 03/16/2018&#34;对于表中的id 1000。
我遇到的问题是,如果我再次运行相同的代码,则应该命中语句,但它会继续命中if语句。当我打印出值lastDate时,出乎意料的是,LastDate出现在&#34; Thu Mar 15 20:00:00 EDT 2018&#34;。
Logger.info("lastDate :: " + lastDate); // Thu Mar 15 20:00:00 EDT 2018
但是,如果我通过SimpleDateFormat对象将日期转换为字符串,则输出为&#34; 03/16/2018&#34;。
Logger.info("lastDate :: " + sdf.format(lastDate));
我不确定为什么lastDate有两个不同的值。
更新
找到答案。 Plz参考我的上一条评论。我最初将缺失的声明添加到原始水下版本的代码中以澄清问题。如果添加了这个声明,那么其他人就可以清楚地了解出了什么问题。
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
我当地的jvm设置为&#34; America / New York&#34;但是当我通过格式化程序将字符串MM / dd / yyyy转换为日期对象时,时区&#34; UTC&#34;使用,以便输出不同。今天正在使用东部夏令时区,但是LastDate正在使用&#34; UTC&#34;。在引擎盖下,日期值本身是一致的,但是格式化程序在它之上添加了不同的构图,使它看起来不同。