【问题标题】:arrange array of dates in weeks以周为单位排列日期数组
【发布时间】:2022-01-29 03:14:14
【问题描述】:

我有一个包含 startTime 日期及其总花费时间的数组,我想将数组排列成周输出应该是

//output = [{weekOf : "1/14/2022 - 1/21/2022"  ,  totalTime : "0:0:12"}]

日期的样本数据数组是

const dates = [ 
    { startTime: "Fri Jan 14 2022 10:36:34 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:12" }, 
    { startTime: "Fri Jan 14 2022 10:39:08 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:6" }, 
    { startTime: "Mon Jan 17 2022 13:32:42 GMT-0500 (Eastern Standard Time)",  totalTime: "0:1:17" }, 
    { startTime: "Mon Jan 17 2022 13:34:57 GMT-0500 (Eastern Standard Time)",  totalTime: "0:37:35" }, 
    { startTime: "Mon Jan 17 2022 13:58:30 GMT-0500 (Eastern Standard Time)",  totalTime: "0:14:2" }, 
    { startTime: "Mon Jan 17 2022 14:48:15 GMT-0500 (Eastern Standard Time)",  totalTime: "0:2:27" }, 
    { startTime: "Tue Jan 18 2022 11:47:47 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:0" }, 
    { startTime: "Tue Jan 18 2022 11:47:47 GMT-0500 (Eastern Standard Time)",  totalTime: "0:8:17" }, 
    { startTime: "Tue Jan 18 2022 11:56:06 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:27" }, 
    { startTime: "Tue Jan 18 2022 11:56:34 GMT-0500 (Eastern Standard Time)", totalTime: "0:9:40" }, 
    { startTime: "Tue Jan 18 2022 12:06:15 GMT-0500 (Eastern Standard Time)",  totalTime: "0:1:2" }, 
    { startTime: "Tue Jan 18 2022 12:07:18 GMT-0500 (Eastern Standard Time)", totalTime: "0:13:11" }, 
    { startTime: "Tue Jan 18 2022 12:20:30 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:52" }, 
    { startTime: "Tue Jan 18 2022 12:21:23 GMT-0500 (Eastern Standard Time)", totalTime: "0:55:41" },
    { startTime: "Wed Jan 19 2022 13:19:15 GMT-0500 (Eastern Standard Time)", totalTime: "0:0:0" }, 
    { startTime: "Wed Jan 19 2022 13:19:15 GMT-0500 (Eastern Standard Time)",  totalTime: "0:1:26" }, 
    { startTime: "Wed Jan 19 2022 14:15:26 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:0" }, 
    { startTime: "Tue Jan 25 2022 11:22:06 GMT-0500 (Eastern Standard Time)", totalTime: "0:4:11" }, 
    { startTime: "Tue Jan 25 2022 11:19:46 GMT-0500 (Eastern Standard Time)", totalTime: "0:6:35" }, 
    { startTime: "Tue Jan 25 2022 12:50:47 GMT-0500 (Eastern Standard Time)", totalTime: "0:9:51" },
    { startTime: "Tue Jan 25 2022 13:00:39 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:25" }
 ]

【问题讨论】:

  • 您尝试了尚未发布的内容...我们必须等待您的修改。
  • 我也发布解决方案

标签: javascript node.js reactjs time


【解决方案1】:

你应该使用momentjs

import moment from "moment";

const dates = [ 
    { startTime: "Fri Jan 14 2022 10:36:34 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:12" }, 
    { startTime: "Fri Jan 14 2022 10:39:08 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:6" }, 
    { startTime: "Mon Jan 17 2022 13:32:42 GMT-0500 (Eastern Standard Time)",  totalTime: "0:1:17" }, 
    { startTime: "Mon Jan 17 2022 13:34:57 GMT-0500 (Eastern Standard Time)",  totalTime: "0:37:35" }, 
    { startTime: "Mon Jan 17 2022 13:58:30 GMT-0500 (Eastern Standard Time)",  totalTime: "0:14:2" }, 
    { startTime: "Mon Jan 17 2022 14:48:15 GMT-0500 (Eastern Standard Time)",  totalTime: "0:2:27" }, 
    { startTime: "Tue Jan 18 2022 11:47:47 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:0" }, 
    { startTime: "Tue Jan 18 2022 11:47:47 GMT-0500 (Eastern Standard Time)",  totalTime: "0:8:17" }, 
    { startTime: "Tue Jan 18 2022 11:56:06 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:27" }, 
    { startTime: "Tue Jan 18 2022 11:56:34 GMT-0500 (Eastern Standard Time)", totalTime: "0:9:40" }, 
    { startTime: "Tue Jan 18 2022 12:06:15 GMT-0500 (Eastern Standard Time)",  totalTime: "0:1:2" }, 
    { startTime: "Tue Jan 18 2022 12:07:18 GMT-0500 (Eastern Standard Time)", totalTime: "0:13:11" }, 
    { startTime: "Tue Jan 18 2022 12:20:30 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:52" }, 
    { startTime: "Tue Jan 18 2022 12:21:23 GMT-0500 (Eastern Standard Time)", totalTime: "0:55:41" },
    { startTime: "Wed Jan 19 2022 13:19:15 GMT-0500 (Eastern Standard Time)", totalTime: "0:0:0" }, 
    { startTime: "Wed Jan 19 2022 13:19:15 GMT-0500 (Eastern Standard Time)",  totalTime: "0:1:26" }, 
    { startTime: "Wed Jan 19 2022 14:15:26 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:0" }, 
    { startTime: "Tue Jan 25 2022 11:22:06 GMT-0500 (Eastern Standard Time)", totalTime: "0:4:11" }, 
    { startTime: "Tue Jan 25 2022 11:19:46 GMT-0500 (Eastern Standard Time)", totalTime: "0:6:35" }, 
    { startTime: "Tue Jan 25 2022 12:50:47 GMT-0500 (Eastern Standard Time)", totalTime: "0:9:51" },
    { startTime: "Tue Jan 25 2022 13:00:39 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:25" }
 ]


const output = {};
const convertToNumber = (number) => {
    try {
        const clearedNumber = String(number).replace(/0+/, ""); // Clear leading 0
        return Number(clearedNumber);
    } catch (error) { // In case of number converting error return 0
        return 0;
    }
};

dates.forEach(({startTime, totalTime}) => {
  const startDate = moment(startTime).startOf("week").format("DD/MM/YYYY");  
  const endDate = moment(startTime).endOf("week").format("DD/MM/YYYY");

  const [hours, mins, secs] = totalTime.split(":").map(number => convertToNumber(number));
  const totalTimeInSeconds =  hours*60*60 + mins*60 + secs;

  output[`${startDate} - ${endDate}`] = (output[`${startDate} - ${endDate}`] || 0) + totalTimeInSeconds;
});

const preparedOutput = [];
for (const key in output) {
    preparedOutput.push({weekOf: key, totalTime: moment(output[key]*1000).utc().format("HH:mm:ss")})
}

最后准备好的输出应该是想要的格式

【讨论】:

  • endDate 未定义
  • 对不起,我写错了,是endTime,应该是startTime我更正了代码
  • 是的,完美,但它以 [ { weekOf: '09/01/2022 - 09/01/2022', totalTime: '00:00:18' }, { weekOf: '16/01 /2022 - 16/01/2022', totalTime: '02:25:21' }, { weekOf: '23/01/2022 - 23/01/2022', totalTime: '00:21:02' } ] 它从 2022 年 9 月 1 日开始,我的数据从 2022 年 1 月 16 日开始
  • 对不起,我没有运行代码,所以可能会出现微小的错误,我现在意识到 endDate 应该用endOf 计算,而不是startOf。我计算包含数据的一周的开始和结束。但我猜 momentjs 显示 startOf 星期是星期天,您可能想在使用 moment(startTime).add(1, "day").startOf(... 计算星期的开始结束时添加一天
  • 我确实在不使用库的情况下评论了下面的代码,并且它工作正常,感谢您的反馈
【解决方案2】:

const dates = [ 
        { startTime: "Fri Jan 14 2022 10:36:34 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:12" }, 
        { startTime: "Fri Jan 14 2022 10:39:08 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:6" }, 
        { startTime: "Mon Jan 17 2022 13:32:42 GMT-0500 (Eastern Standard Time)",  totalTime: "0:1:17" }, 
        { startTime: "Mon Jan 17 2022 13:34:57 GMT-0500 (Eastern Standard Time)",  totalTime: "0:37:35" }, 
        { startTime: "Mon Jan 17 2022 13:58:30 GMT-0500 (Eastern Standard Time)",  totalTime: "0:14:2" }, 
        { startTime: "Mon Jan 17 2022 14:48:15 GMT-0500 (Eastern Standard Time)",  totalTime: "0:2:27" }, 
        { startTime: "Tue Jan 18 2022 11:47:47 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:0" }, 
        { startTime: "Tue Jan 18 2022 11:47:47 GMT-0500 (Eastern Standard Time)",  totalTime: "0:8:17" }, 
        { startTime: "Tue Jan 18 2022 11:56:06 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:27" }, 
        { startTime: "Tue Jan 18 2022 11:56:34 GMT-0500 (Eastern Standard Time)", totalTime: "0:9:40" }, 
        { startTime: "Tue Jan 18 2022 12:06:15 GMT-0500 (Eastern Standard Time)",  totalTime: "0:1:2" }, 
        { startTime: "Tue Jan 18 2022 12:07:18 GMT-0500 (Eastern Standard Time)", totalTime: "0:13:11" }, 
        { startTime: "Tue Jan 18 2022 12:20:30 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:52" }, 
        { startTime: "Tue Jan 18 2022 12:21:23 GMT-0500 (Eastern Standard Time)", totalTime: "0:55:41" },
        { startTime: "Wed Jan 19 2022 13:19:15 GMT-0500 (Eastern Standard Time)", totalTime: "0:0:0" }, 
        { startTime: "Wed Jan 19 2022 13:19:15 GMT-0500 (Eastern Standard Time)",  totalTime: "0:1:26" }, 
        { startTime: "Wed Jan 19 2022 14:15:26 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:0" }, 
        { startTime: "Tue Jan 25 2022 11:22:06 GMT-0500 (Eastern Standard Time)", totalTime: "0:4:11" }, 
        { startTime: "Tue Jan 25 2022 11:19:46 GMT-0500 (Eastern Standard Time)", totalTime: "0:6:35" }, 
        { startTime: "Tue Jan 25 2022 12:50:47 GMT-0500 (Eastern Standard Time)", totalTime: "0:9:51" },
        { startTime: "Tue Jan 25 2022 13:00:39 GMT-0500 (Eastern Standard Time)",  totalTime: "0:0:25" }
     ]
     
const output = {};
const convertToNumber = (number) => {
    try {
        const clearedNumber = String(number).replace(/0+/, ""); // Clear leading 0
        return Number(clearedNumber);
    } catch (error) { // In case of number converting error return 0
        return 0;
    }
};

dates.forEach(({startTime, totalTime}) => {
  const startWeek = new Date(startTime).getDate() + `/${new Date(startTime).getMonth()}/${new Date(startTime).getFullYear()}`;
  const endWeek = new Date(startTime).getDate() + 7 + `/${new Date(startTime).getMonth()}/${new Date(startTime).getFullYear()}`;
  const [hours, minutes, seconds] = totalTime.split(":").map(number => convertToNumber(number));
  const totalTimeInSeconds =  hours*60*60 + minutes*60 + seconds;
  output[`${startWeek}-${endWeek}`] = (output[`${startWeek}-${endWeek}`] || 0) + totalTimeInSeconds;
});

const preparedOutput = [];
for (const key in output) {
    preparedOutput.push({weekOf: key, totalTime: new Date(output[key] * 1000).toISOString().substr(11, 8)});
}
console.log(preparedOutput);

【讨论】:

    【解决方案3】:

    我会预先加载一份包含您的数据涵盖的周数的列表。在源数据中查找最小和最大日期;找到您的最低限度之前的第一个星期一日期;然后循环数周,直到您的最大值包含在周列表中。当然,将每周的“totalTime”值初始化为 0:00:00。

    之后,您将需要一个重叠测试功能。给定开始和结束日期(或者只是开始日期并假设结束日期是 7 天后)以及您正在测试的日期,日期是否属于该日期范围?

    现在,您可以遍历源数据并在每个星期内执行嵌套循环。使用您的重叠方法检查源日期是否在一周内,如果是:将时间添加到总时间,然后从内部循环中断(停止检查更多周)。

    当您完成循环累加总时间后,您可以输出您制作的包含周数和总时间的列表。

    编辑:因为我对完成所有这些工作并看看我是否可以让它工作感到很开心,所以我用页面源代码中的 JavaScript 编写了一个 HTML 页面...... https://highdex.net/StackOverflow/DateListToWeeks.html

    【讨论】:

    • 是的,完美,你帮我提供一个示例代码
    • 只需在我在回复中链接的页面上查看源代码即可。 JavaScript 都在里面。您可能需要对其进行一些修改以满足您的特定需求。但是代码使用源数据构建了一个包含每周总时间的周列表。
    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多