【问题标题】:How to map/filter data correctly with luxon (DateTimeNow) and ReactJs如何使用 luxon (DateTimeNow) 和 ReactJs 正确映射/过滤数据
【发布时间】:2022-01-13 15:24:46
【问题描述】:

我想解释一下我今天遇到的问题。

我有一个看起来像这样的数组

[{status: "closed",createdAt: "2022-01-13T15:28:25.239Z"},{status: "closed",createdAt: "2022-01-10T15:28:25.239Z"},{status: "open",createdAt: "2021-11-25T15:28:25.239Z"}]

我过滤以仅检索状态为“关闭”的数据

const countData = data?.filter(
    (item) => item.status === "closed"
);
const count = countData?.length;

这很好用,它会正确地将号码返回给我。

我想用 Luxon 添加一个新的过滤器。

我想用 luxon 获取今天的日期,结果显示与该日期对应的对象

const dateNow = DateTime.now().toISO();
console.log(dateNow) 
2022-01-13T16:23:44.873+01:00

我该如何解决这个问题?

【问题讨论】:

    标签: reactjs date filter luxon


    【解决方案1】:

    如果要检查给定的 Luxon DateTime 对象是否代表今天的同一天,可以使用 hasSame 传递 date 作为第二个参数

    返回此 DateTime 是否与另一个 DateTime 处于同一时间单位。高阶单位也必须相同,此函数才能返回 true。请注意,在比较本地日历时间的比较中,时区被忽略。如果需要,使用DateTime#setZone 转换日期之一。

    在您的情况下,您可以使用以下代码:

    const DateTime = luxon.DateTime;
    const input = [{
      status: "closed",
      createdAt: "2022-01-13T15:28:25.239Z"
    }, {
      status: "closed",
      createdAt: "2022-01-10T15:28:25.239Z"
    }, {
      status: "open",
      createdAt: "2021-11-25T15:28:25.239Z"
    }, {
      status: "closed",
      createdAt: new Date().toISOString()
    }];
    
    const todayItems = input.filter(item => {
      return DateTime.fromISO(item.createdAt).hasSame(DateTime.now(), 'day') && item.status == "closed";
    });
    console.log(todayItems)
    <script src="https://cdn.jsdelivr.net/npm/luxon@2.3.0/build/global/luxon.js"></script>

    【讨论】:

    • @Vincezoc 非常好,它也有效,你能修改它并告诉我我是否也想返回 "status": "closed", to 吗?
    • @Neff 如果您也想按状态过滤项目,您只需在过滤功能中添加条件,如更新答案所示
    • 很抱歉在这里打扰你,我不明白为什么,它给了我错误const day = "Thu Feb 10 2022 00:00:00 GMT+0200 (Eastern European Standard Time)"; const TODAY = new Date(); const test = DateTime.fromISO(day).startOf("day").equals(TODAY); console.log(test)
    • @Krisna 多个问题,首先day 不是ISO 8601 格式,所以DateTime.fromISO(day).isValidfalse,然后是equals 检查两个DateTimes 是否相等,如果它们代表与您的情况不太可能相同的毫秒。请注意,您不应该在 cmets 中提出新问题,如果需要,请按照 How do I ask a good question? 指南提出新问题,阅读文档可能会帮助您澄清疑问。
    【解决方案2】:

    Luxon 有一个函数可以让您在称为startOf 的参数的某个点获取日期。所以你可以这样做:

    const todayDate = DateTime.now().startOf("day");
    

    因此,您的 todayDate 变量将是您当前的日期,但时间为 00:00:00。

    您可以在过滤器功能期间对元素进行转换,以将它们与todayDate 进行比较,如下所示:

    //Please consider that the example for today was at 2022-01-13
    const array = [
      { 
        name: "this is for today", 
        date: "2022-01-13T15:28:25.239Z" 
      }, 
      { 
        name: "this was for yesterday", 
        date: "2022-01-12T15:28:25.239Z" 
      }];
    
    const todayDate = DateTime.now().startOf("day");
    
    const todayElements = array.filter((element) => {
      return DateTime.fromISO(element.date).startOf("day").equals(todayDate);
    });
    

    【讨论】:

    • 可以使用.hasSame(DateTime.local(), "day");
    • @MaCadiz 效果很好
    • @lazy.lizard 你是对的。这是一个更好的方法。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2021-10-26
    相关资源
    最近更新 更多