• 根据当年节假日和非工作时间计算请假时间-获取每个月的节假日,计算每个月的工作日时间进度,节假日每年更新


    根据需求请假时间要排除法定节假日和非工作时间

    1.获取当年的节假日

    节假日是每年更新的,没有固定接口,需要手动录入

    个人根据官方的节假日整理了当年的所有节假日,可以根据个人需求进行修改

    1. // 获取每个月的节假日,如果当月没有节假日就默认星期六星期天
    2. holidays: [
    3. [],// 1月
    4. [3, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25],// 2月
    5. [],// 3月
    6. [4, 5, 6, 13, 14, 20, 21, 27],// 4月
    7. [1, 2, 3, 4, 5, 12, 18, 19, 25, 26],// 5月
    8. [1, 2, 8, 9, 10, 15, 16, 22, 23, 29, 30],// 6月
    9. [],// 7月
    10. [],// 8月
    11. [7, 8, 15, 16, 17, 21, 22, 28],// 9月
    12. [1, 2, 3, 4, 5, 6, 7, 13, 19, 20, 26, 27],// 10月
    13. [],// 11月
    14. [],// 12月
    15. ]

    2.使用当年的节假日进行判断

    这里是封装的计算方法,传入开始时间和结束时间 时间格式为:年-月-日 时:分

    里面定义了上班开始结束时间和中午休息时间,可以自定义

    1. // 计算工作时间调休小时数
    2. calculateLeaveTime(startTime, endTime) {
    3. // console.log(startTime);
    4. // console.log(endTime);
    5. // 工作开始结束时间
    6. const workStart = 9;
    7. const workEnd = 18;
    8. // 休息开始结束时间
    9. const restStart = 12;
    10. const restEnd = 13;
    11. // 请假天数
    12. let day = 0;
    13. // 总计小时数
    14. let total_hour = 0;
    15. // 循环每天
    16. for (let date = new Date(startTime); date <= new Date(endTime); date.setDate(date.getDate() + 1)) {
    17. day++
    18. // 每天多少小时
    19. let dayLeaveTime = 0;
    20. let m = date.getMonth()
    21. // 获取当月是否有节假日 我存储到vuex里面的,通过下标获取当月的节假日
    22. let holiday_arr = this.$store.state.holidays[m]
    23. console.log(holiday_arr);
    24. // 获取今天是星期几
    25. let x = date.getDay();
    26. // 今天是几号
    27. let i = date.getDate();
    28. // console.log(i + "号");
    29. // console.log("星期" + x);
    30. // 有时候要补节假日获取手动录入的节假日进行计算
    31. if (holiday_arr.length != 0 && holiday_arr.includes(i)) {
    32. // console.log(i + "号");
    33. continue;
    34. }
    35. // 除开中午休息时间和星期六星期天
    36. if ([0, 6].includes(x) && holiday_arr.length == 0) {
    37. // console.log("星期" + x);
    38. continue;
    39. }
    40. // 上面判断是否计算当前
    41. // 第一天要获取开始时间和结束时间
    42. if (day == 1) {
    43. // 小时
    44. let h = 0
    45. let h1 = startTime.split(" ")[1].split(":")[0] * 1
    46. let h2 = endTime.split(" ")[1].split(":")[0] * 1
    47. // 分
    48. let m1 = startTime.split(" ")[1].split(":")[1] * 1
    49. let m2 = endTime.split(" ")[1].split(":")[1] * 1
    50. // 判断结束时间是否大于开始时间
    51. if (h2 >= h1) {
    52. // 判断上午还是下午还是跨了中午
    53. if (h1 < restEnd && h2 >= restStart) {
    54. // 跨了中午 是否在休息时间内
    55. if (h1 >= restStart) {
    56. h1 = restStart
    57. m1 = 0
    58. }
    59. if (h2 < restEnd) {
    60. h2 = restEnd
    61. m2 = 0
    62. }
    63. // console.log("跨了中午", restStart - h1 + h2 - restEnd);
    64. h = restStart - h1 + h2 - restEnd
    65. } else if (h1 <= restStart && h2 <= restStart) {
    66. // 上午
    67. // console.log("上午", h2 - h1);
    68. h = h2 - h1
    69. } else if (h1 >= restEnd && h2 >= restEnd) {
    70. // 下午
    71. // console.log("下午", h2 - h1);
    72. h = h2 - h1
    73. }
    74. } else {
    75. // 判断上午还是下午还是跨了中午
    76. if (h1 >= restEnd && h2 < restEnd) {
    77. // 跨了中午
    78. if (h2 >= restStart) {
    79. h2 = restStart
    80. m2 = 0
    81. }
    82. // console.log("跨了中午", workEnd - h1 + h2 - workStart);
    83. h = workEnd - h1 + h2 - workStart
    84. } else if (h1 <= restStart && h2 <= restStart) {
    85. // 上午
    86. // console.log("上午", workEnd - h1 + h2 - workStart);
    87. h = workEnd - h1 + h2 - workStart - (restEnd - restStart)
    88. } else if (h1 >= restEnd && h2 >= restEnd) {
    89. // 下午
    90. // console.log("下午", restStart - workStart + (workEnd - h1) + (h2 - restEnd));
    91. h = restStart - workStart + (workEnd - h1) + (h2 - restEnd)
    92. }
    93. }
    94. // 计算分钟
    95. // console.log("第一天的小时", h);
    96. // console.log("第一天的分钟", (m2 - m1) / 60);
    97. dayLeaveTime = h + ((m2 - m1) / 60)
    98. if (h < 0 || (h <= 0 && ((m2 - m1) / 60) <= 0)) {
    99. // "结束时间必须大于开始时间"
    100. this.tips = true;
    101. dayLeaveTime = 0;
    102. } else {
    103. this.tips = false;
    104. }
    105. } else {
    106. // 第二天开始 循环每天的工作时间范围的小时数
    107. for (let hour = workStart; hour < workEnd; hour++) {
    108. if (hour <= restStart || hour > restEnd) {
    109. dayLeaveTime += 1
    110. }
    111. }
    112. }
    113. // console.log(date.getDate() + "号的小时数", dayLeaveTime);
    114. total_hour += dayLeaveTime
    115. }
    116. // console.log(day + "天");
    117. // console.log(total_hour + "小时");
    118. return total_hour + "小时";
    119. },

     

    这里按每天八小时计算,排除了2024年法定节假日 劳动节的调休 一共使用了工作时间的32小时

    3.计算当月工作日时间进度

    1. // 计算工作日时间进度
    2. // 获取当前时间
    3. const now = new Date();
    4. // 获取当前年份和月份
    5. const currentYear = now.getFullYear();
    6. const currentMonth = now.getMonth();
    7. // 获取vuex里面存储的节假日
    8. let holidays = this.$store.state.holidays[currentMonth]
    9. // console.log("当月节假日", holidays);
    10. // 计算当月天数
    11. const daysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate();
    12. // 当月几号
    13. const dayOfMonth = now.getDate();
    14. // console.log("当月天数:", daysInMonth);
    15. // console.log("当月的第", dayOfMonth, "天");
    16. // 工作日天数
    17. let workday = 0;
    18. // 当前工作日天数
    19. let Month = 0;
    20. // 当前时间进度
    21. let num = "0%";
    22. // 判断是否设置节假日
    23. if (holidays.length) {
    24. // 自定义节假日
    25. workday = daysInMonth - holidays.length;
    26. // console.log("自定义工作日", workday);
    27. // 默认已工作日
    28. for (let i = 1; i < dayOfMonth + 1; i++) {
    29. if (!holidays.includes(i)) {
    30. Month++;
    31. }
    32. }
    33. num = Month / workday;
    34. } else {
    35. // 循环默认天数
    36. for (let i = 1; i < daysInMonth + 1; i++) {
    37. let date = new Date(
    38. new Date().getFullYear(),
    39. new Date().getMonth(),
    40. i
    41. );
    42. // 遍历每天获取星期几
    43. let x = date.getDay();
    44. // 不是节假日工作日就加一
    45. if (![0, 6].includes(x)) {
    46. workday++;
    47. }
    48. }
    49. // console.log("默认工作日", workday);
    50. // 默认已工作日
    51. for (let i = 1; i < dayOfMonth + 1; i++) {
    52. let date = new Date(
    53. new Date().getFullYear(),
    54. new Date().getMonth(),
    55. i
    56. );
    57. // 遍历每天获取星期几
    58. let x = date.getDay();
    59. // 不是节假日工作日就加一
    60. if (![0, 6].includes(x)) {
    61. Month++;
    62. }
    63. }
    64. num = Month / workday;
    65. }
    66. // console.log("已工作", Month, "天");
    67. // console.log("时间进度" + (num * 100).toFixed(1) + "%");
    68. // 赋值时间进度
    69. this.less_day = (num * 100).toFixed(1).replace(/\.0$/, "") + "%";

  • 相关阅读:
    java.lang.UnsatisfiedLinkError: dlopen failed: library “libsqlite.so“ not found
    电脑数据丢失如何恢复呢?
    JVM:(十六)垃圾回收器
    网络的下一次迭代:AVS 将为 Web2 带去 Web3 的信任机制
    在 SQL Server 中,可以使用内置函数 NEWID() 来生成一个随机的 GUID(全局唯一标识符)。可以将此 GUID 作为字符串拼接到查询结果中。
    搭建MyBatis
    vue实现页面上传文件夹压缩后传给服务器
    深度学习(二)之猫狗分类
    c++中的流输入与输出
    robocode 相关的总结
  • 原文地址:https://blog.csdn.net/weixin_70563937/article/details/138168424