我有一个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中删除时间部分。
答案 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);