当前位置: 首页 > news >正文

如何处理和格式化日期差异:JavaScript 日期差异计算实例

在现代开发中,日期和时间的处理是常见且重要的任务之一。无论是在计算项目期限、产品保质期,还是在日志中跟踪事件发生时间,我们都可能需要计算和格式化日期差异。

本文将通过一个JavaScript实例,介绍如何计算两个日期之间的差异,并将结果格式化为“年、月、日”的形式。同时,我们也会探讨日期处理中的一些常见问题,如日期的有效性检查、如何处理日期的不同单位(如年、月、天),以及如何在用户输入数据时执行必要的验证。

1. 代码实现:日期差异计算函数

首先,我们来分析一下一个常见的日期差异计算函数。该函数的目的是计算两个日期之间的天数差,并将其转换为“年、月、日”的格式。我们从基础的代码实现开始:

function calculateDateDifference(startDate, endDate) {
  // 将日期字符串转换为 Date 对象
  const start = new Date(startDate);
  const end = new Date(endDate);

  // 检查开始日期是否晚于结束日期
  if (start > end) {
    showAlerts(".ErrorModal", "5%", "日期不能为负");
    $("#dates").val(``);
    return; // 停止执行函数并不返回任何值
  }

  // 计算两个日期之间的天数差
  const totalDays = Math.floor((end - start) / (1000 * 60 * 60 * 24));

  // 若天数少于20天,停止并不返回任何值
  if (totalDays < 20) {
    showAlerts(".ErrorModal", "5%", "保质期不能小于20天");
    $("#dates").val(``);
    return; // 停止执行函数并不返回任何值
  }

  // 每年按360天计算,每月按30天计算
  const years = Math.floor(totalDays / 360);
  const remainingDaysAfterYears = totalDays % 360;
  const months = Math.floor(remainingDaysAfterYears / 30);
  const days = remainingDaysAfterYears % 30;

  // 根据条件返回格式化的结果
  if (years === 0 && months === 0) {
    return `${days}天`;
  } else if (years === 0) {
    return `${months}月${days.toString().padStart(2, "0")}天`;
  } else if (months === 0) {
    return `${years}年${days.toString().padStart(2, "0")}天`;
  } else {
    return `${years}年${months}月${days.toString().padStart(2, "0")}天`;
  }
}

代码详解

  1. 日期转换

    • 首先,函数将输入的日期字符串通过 new Date() 方法转换成 JavaScript 的 Date 对象。Date 对象是处理时间和日期的标准方式。
      const start = new Date(startDate);
      const end = new Date(endDate);

      2.有效性检查:然后,通过比较 start 和 end 日期对象,判断开始日期是否晚于结束日期。如果是,则弹出提示框提示用户并停止后续操作。

    • if (start > end) {
        showAlerts(".ErrorModal", "5%", "日期不能为负");
        $("#dates").val(``);
        return;
      }

      3.日期差的计算:计算两个日期之间的差异,单位为天数。通过 end - start 得到毫秒差,再转换成天数

4.

  • 对于某些业务场景,如计算保质期,可能会要求日期差异不能小于某个值。此处我们检查日期差异是否小于 20 天,如果小于 20 天,则弹出警告并停止后续计算。
    if (totalDays < 20) {
      showAlerts(".ErrorModal", "5%", "保质期不能小于20天");
      $("#dates").val(``);
      return;
    }

    转换为年、月、日格式

  • 接下来,我们按照每年 360 天、每月 30 天的标准来转换天数。使用 Math.floor 对天数进行逐级拆分,得到年、月、日。
    const years = Math.floor(totalDays / 360);
    const remainingDaysAfterYears = totalDays % 360;
    const months = Math.floor(remainingDaysAfterYears / 30);
    const days = remainingDaysAfterYears % 30;

    结果格式化

  • 最后,根据计算的年、月、日进行格式化输出。如果只有天数,直接返回天数;如果有月和天,按“月-天”格式返回;如果有年和天,则按“年-天”格式返回。
    if (years === 0 && months === 0) {
      return `${days}天`;
    } else if (years === 0) {
      return `${months}月${days.toString().padStart(2, "0")}天`;
    } else if (months === 0) {
      return `${years}年${days.toString().padStart(2, "0")}天`;
    } else {
      return `${years}年${months}月${days.toString().padStart(2, "0")}天`;
    }

     

 

相关文章:

  • 高项第十二章——项目质量管理
  • 关于foobar2000插件的一点理解
  • ollama 可以通过127.0.0.1访问,但是无法通过本机ip访问
  • 人工智能领域大模型、大模型使用、AI工作流 学习路径
  • Oracle ASM 磁盘组冗余策略
  • 向量数据库:AI时代的“新基建”
  • 护网面试题
  • 第18章-综合以上功能 基于stm32的智能小车(远程控制、避障、循迹) 基于stm32f103c8t6_HAL库_CubeMX_超详细,包含代码讲解和原理图
  • 【Docker入门】构建推送第一个Docker映像
  • HCIA-PPP实验
  • 将字符串中的小写字母转换成大写字母(信息学奥赛一本通-1138)
  • unity中 添加dll 报错 DllNotFoundException
  • 【Linux编程】IPC之消息队列从踩坑到实战:核心原理、实战案例与C++封装详解(含完整代码)
  • Tomcat、Open Liberty 和 WebSphere Application Server (WAS) 的配置、调试和跟踪
  • 嵌入式开发之STM32学习笔记day07
  • PCIe(Peripheral Component Interconnect Express)详解
  • docker 命令里 --restart=unless-stopped 参数的作用
  • Android 13 Launcher3最近任务列表“全部清除“按钮位置优化实战
  • Spring(7)——MyBatis入门(1)
  • 7、vue3做了什么
  • 5月LPR下调:1年期、5年期以上品种均下调10个基点
  • A股午后回暖,三大股指涨跌互现:港口板块重新走强,两市成交近1.1万亿元
  • 交响4K修复版《神女》昨晚上演,观众听到了阮玲玉的声音
  • 宫崎骏的折返点
  • 水果预包装带来的环境成本谁来分担?
  • 罗马教皇利奥十四世正式任职