无法使用withDayOfMonth获取月份的初始日期

时间:2018-04-10 09:39:04

标签: java arraylist java-stream java-time

我想获得给定日期时间的月份的第一个日期时间,如下所示:对于日期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());

有人可以建议我这样做吗?

1 个答案:

答案 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课程,还是会更好。