Hale_Fan 2019-11-28 16:40 采纳率: 0%
浏览 470

js计算两个日期相差的天数达到30天转换成自然周达到1年转换自然月

a选择时间在30天内,按照天的维度展示,b超出30天,按照周维度展示,自然周即可,展示具体的时间区间,例:第一周(7月1~7日),第二周(7月8~14日)第三周(7月15~22日)第四周(7月23日~30日)第五周选择三天,则展示(8月1~3日),c、超出一年的,按照月维度展示即可

  • 写回答

1条回答 默认 最新

  • 愤怒的熊猫x 2023-04-05 10:34
    关注
    
    // 假设输入的时间戳为timestamp
    
    const ONE_DAY = 24 * 60 * 60 * 1000; // 一天的毫秒数
    
    const now = new Date();
    const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime(); // 当天零点的时间戳
    
    if (today - timestamp <= 30 * ONE_DAY) {
      // 选择时间在30天内,按照天的维度展示
      
      const dates = [];
      let date = new Date(timestamp);
      
      while (date.getTime() <= today) {
        dates.push(date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate());
        date = new Date(date.getTime() + ONE_DAY);
      }
      
      console.log(dates); // 输出每天的日期,如 ['2022-01-01', '2022-01-02', ...]
      
    } else if (today - timestamp <= 365 * ONE_DAY) {
      // 超出30天且不超过一年,按照周的维度展示
      
      const weekStartEnd = [];
      let date = new Date(timestamp);
      
      while (date.getTime() < today) {
        const weekStart = new Date(date.getFullYear(), date.getMonth(), date.getDate() - date.getDay()); // 当周的第一天
        const weekEnd = new Date(date.getFullYear(), date.getMonth(), date.getDate() + (6 - date.getDay())); // 当周的最后一天
        
        weekStartEnd.push(weekStart.getFullYear() + '年第' + getWeekNumber(weekStart) + '周(' + formatDate(weekStart) + '~' + formatDate(weekEnd) + ')');
        
        date = new Date(weekEnd.getTime() + ONE_DAY);
      }
      
      console.log(weekStartEnd); // 输出每一周的时间段,如 ['2022年第1周(1月3日~1月9日)', '2022年第2周(1月10日~1月16日)', ...]
      
    } else {
      // 超出一年,按照月的维度展示
      
      const monthStartEnd = [];
      let date = new Date(timestamp);
      
      while (date.getTime() < today) {
        const monthStart = new Date(date.getFullYear(), date.getMonth(), 1); // 当月的第一天
        const nextMonthStart = new Date(monthStart.getFullYear(), monthStart.getMonth() + 1, 1); // 下个月的第一天
        
        monthStartEnd.push(monthStart.getFullYear() + '年' + (monthStart.getMonth() + 1) + '月(' + formatDate(monthStart) + '~' + formatDate(new Date(nextMonthStart.getTime() - ONE_DAY)) + ')');
        
        date = new Date(nextMonthStart.getTime() - ONE_DAY);
      }
      
      console.log(monthStartEnd); // 输出每个月的时间段,如 ['2022年1月(1月1日~1月31日)', '2022年2月(2月1日~2月28日)', ...]
    }
    
    function getWeekNumber(date) {
      const firstDayOfYear = new Date(date.getFullYear(), 0, 1);
      const daysSinceFirstDayOfYear = Math.floor((date.getTime() - firstDayOfYear.getTime()) / ONE_DAY);
      return Math.floor(daysSinceFirstDayOfYear / 7) + 1;
    }
    
    function formatDate(date) {
      return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
    }
    
    
    
    
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器