【问题标题】:Unable to get the initial date of the month using withDayOfMonth无法使用 withDayOfMonth 获取月份的初始日期
【发布时间】:2018-04-10 09:39:03
【问题描述】:

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

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

【问题讨论】:

  • 您确定您的列表中包含一个与startDate 值匹配的对象吗?对我来说 localDate.withDayOfMonth(1).atStartOfDay() 返回预期值
  • startDate的类型是什么?如果不是Timestampequals 将返回 false。

标签: java arraylist java-stream java-time


【解决方案1】:

我不知道出了什么问题。就像 Pavan 观察到的那样,您的代码在我的计算机上也按预期工作,并返回一个包含交易日期为 4 月的对象的列表。一种可能的解释是,如果您的 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 类,那就更好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多