为什么我看到java.util.Date的两个不同的值?

时间:2018-03-16 18:28:27

标签: java.util.date

我有一张桌子" 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;。在引擎盖下,日期值本身是一致的,但是格式化程序在它之上添加了不同的构图,使它看起来不同。

0 个答案:

没有答案