10

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

4

4 回答 4

15

Java 8 的转换方法:

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

反之亦然:

Timestamp timestamp = Timestamp.valueOf(date.toLocalDate().atStartOfDay());
于 2016-01-26T14:59:16.347 回答
3

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

值得阅读链接的答案,因为它谈到了这种方法在时区等方面的缺点(并且该问题的其他一些答案提供了您可能更喜欢的替代方法)。

于 2013-02-12T12:16:25.653 回答
1

你有这三个选项。

首先是使用尤达时间和类DateTimeComparator.getDateOnlyInstance()

其次是使用来自 apache 和DateUtils.isSameDay()的 commons

第三次使用【日历】设置时间,只比较年、月、日。正如戴夫韦伯提议的那样。

于 2013-02-12T12:18:27.523 回答
1

另一种方法是使用纪元值的“日”部分:

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);
于 2016-01-26T15:10:51.907 回答