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

11

我有一个时间戳和日期变量,我想比较它们是否相等(当然只比较日期部分)。令我惊讶的是,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查询中将时间戳转换为日期,但我还需要一个时间戳表示。有没有更好的方法从时间戳中去除时间部分。

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

4个回答

18

Java 8 的转换方法:

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

反之亦然:

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

3

通过该答案中的方法,我们得到:

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);

这篇关于时区等缺陷的答案也值得一读(该问题的其他答案提供了一些可能更适合您的替代方案)。请参考链接。


1
另一种方法是使用时代值的“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);

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接