我想获得给定日期时间的月份的第一个日期时间,如下所示:对于日期19-04-2018 19:00:00
(dd-MM-yyyy HH:mm:ss),它应为01-04-2018 00:00:00
我尝试了以下代码,但它给出了空列表。
startDate
可能包含01-04-2018 00:00:00
。
List<scPosR> scPosRListPerStoreAndTimeStamp = spst.stream().filter(
scPosR -> Timestamp.valueOf(scPosR.getTransactionDate()
.toLocalDateTime()
.toLocalDate()
.withDayOfMonth(1)
.atStartOfDay())
.equals(startDate))
.collect(Collectors.toList());
有人可以建议我这样做吗?
答案 0 :(得分:1)
我不知道出了什么问题。就像Pavan观察到的那样,您的代码也可以在我的计算机上按预期工作,并返回一个包含四月份交易日期的对象的列表。一种可能的解释是,您的startDate
变量不包含Timestamp
,而是某些其他(运行时)类型。另一个可能的解释是时区问题:如果您的startDate
时间戳是在不同的时区创建的,则它将不等于您在流过滤器中创建的时间戳。
无论如何,这是一个更简单的代码版本,希望它也更容易调试。
YearMonth month = YearMonth.of(2018, Month.APRIL);
List<ScPosR> scPosRListPerStoreAndTimeStamp = spst.stream()
.filter(scPosR -> YearMonth.from(scPosR.getTransactionDate().toLocalDateTime())
.equals(month))
.collect(Collectors.toList());
当然,如果你能完全摆脱过时的Timestamp
课程,还是会更好。