将java.sql.Timestamp转换为java.sql.Date

时间:2013-02-12 12:06:29

标签: java jdbc

我有一个Timestamp和Date变量,我想比较它的相等性(当然只有日期部分)。令我惊讶的是,构造函数Date(long)节省了时间部分,所以这段代码不正确:

date = resultSet.getDate(1);
timestamp = resultSet.getTimestamp(2);    
//...
if (date.equals(new Date (timestamp.getTime())) ...

我用以下代码解决了这个问题:

DateFormat dateFormat = new SimpleDateFormat ("yyyyMMdd");
if (date.equals(dateFormat.parse(dateFormat.format(timestamp)))) ...

或者我可以在sql查询中将时间戳转换为日期,但我也需要时间戳表示。有没有更好的方法从Timestamp中删除时间部分。

4 个答案:

答案 0 :(得分:7)

Java 8转换方法:

Date date = Date.valueOf(timestamp.toLocalDateTime().toLocalDate());

反之亦然:

Timestamp timestamp = Timestamp.valueOf(date.toLocalDate().atStartOfDay());

答案 1 :(得分:3)

使用the method from this answer我们得到:

date = resultSet.getDate(1);
timestamp = resultSet.getTimestamp(2);    
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date);
cal2.setTimeInMillis(timestamp.getTime());
boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
                  cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);

值得阅读链接的答案,因为它讨论了这种方法在时区等方面的缺点(以及该问题的其他一些答案给出了您可能更喜欢的替代方法)。

答案 2 :(得分:0)

这个有三个选项。

首先是使用Yoda时间和班级DateTimeComparator.getDateOnlyInstance()

其次是使用来自apache的公共文件和DateUtils.isSameDay()

第三次使用[日历]并设置时间并仅比较年,月和日。正如戴夫韦伯提出的那样。

答案 3 :(得分:0)

另一种方法是使用" day"时代价值的一部分:

Date d = new Date();
Timestamp t = new Timestamp(d.getTime());

long dateEpochDays = d.getTime() % (1000*60*60*24);
long timeStampEpochDays = t.getTime() %(1000*60*60*24);

System.out.println("date: " + dateEpochDays + " timestamp: " + timeStampEpochDays);