【问题标题】:Converting java.util.Date to java.sql.Date resulting in date changes [duplicate]将 java.util.Date 转换为 java.sql.Date 导致日期更改 [重复]
【发布时间】:2020-03-03 13:53:35
【问题描述】:

我在尝试将 java.util.Date 转换为 java.sql.Date 时遇到了一些问题。我传入的日期参数原来是这样格式的字符串:2019-01-31。然后我尝试使用以下代码将其转换为 java.util.date:

    SimpleDateFormat formatter = new SimpleDateFormat("YYYY-MM-DD");
    Date date = null;
    try {
        date =  formatter.parse(this._dDate);
    } catch (ParseException e) {
        e.printStackTrace();
    }

在我的 SQL 语句中,我试图将其转换为 java.sql.Date:

buffer.append("SELECT * FROM TABLE1 WHERE LAST_LOGIN_DT < ");
buffer.append("TO_DATE('" + new java.sql.Date(date.getTime()) + "','YYYY-MM-DD') ");

但是,当我以字符串形式打印出缓冲区时,我意识到日期已更改。比如我传入的数据串是2018-01-01,但是在SQL语句中变成了2017-12-31。有什么想法吗?

谢谢!

【问题讨论】:

  • 格式的大小写很重要。
  • 你想要"yyyy-MM-dd"。但不要这样做。直接从您的String 转到您的java.sql.Date。它会为你节省很多压力。
  • @DawoodsaysreinstateMonica 抱歉,您的意思是将 SQL 更改为 "TO_DATE('" + new java.sql.Date(date) + "','yyyy-MM-dd') 并删除改为日期转换代码?
  • 我还建议使用PreparedStatement,而不是通过字符串连接来构建 SQL。出于各种原因。
  • 我建议您不要使用这两个 Date 类中的任何一个。它们设计不佳且早已过时。相反,只需使用来自java.time, the modern Java date and time APILocalDate。特别是select * from table1 where last_login_dt &lt; ?;yourPreparedStatement.setObject(LocalDate.parse("2019-01-31"));

标签: java sql date


【解决方案1】:

我们先来看下面的例子:

String date = "2018-01-01";

SimpleDateFormat sdf1 = new SimpleDateFormat("YYYY-MM-DD");
System.out.println(sdf1.parse(date));
System.out.println(sdf1.parse(date).getYear());
System.out.println(sdf1.parse(date).getMonth());
System.out.println(sdf1.parse(date).getDay());

SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf2.parse(date));
System.out.println(sdf2.parse(date).getYear());
System.out.println(sdf2.parse(date).getMonth());
System.out.println(sdf2.parse(date).getDay());

控制台输出:

2017 年 12 月 31 日星期日 00:00:00 CST
117
11
0
2018 年 1 月 1 日星期一 00:00:00 CST
118
0
1

现在我想你已经注意到了不同之处!
引用自Class SimpleDateFormat

Y 表示周年D 表示一年中的一天
y 表示d 表示月份中的一天

yyyyYYYY 都代表年份,但 yyyy 代表日历年,而 YYYY 代表年份星期。并且,dd 代表日历日,而 DD 代表月份中的第几天。因此,有两种方法可以解决您的问题:

方法一
如果您仍想将this._dDate 转换为java.util.Date 然后java.sql.Date,请将SimpleDateFormat 的格式从YYYY-MM-DD 更改为yyyy-MM-dd ,但我强烈建议您不要这样做。

方法二
更好的方法是直接使用java.sql.Date.valueOf(this._dDate)this._dDate的格式应该是yyyy-MM-dd

【讨论】:

  • 非常感谢您的明确解释!让我测试一下并回复你:)
  • @hyperfkcb 不客气!但是为什么你不接受和不赞成我的回答?它不适合你吗?
猜你喜欢
  • 2018-04-03
  • 2011-08-29
  • 2016-02-14
  • 2015-04-03
  • 2012-08-21
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多