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

<Project-11 Calculator> 计算器 0.2 工时计算器 WorkHours Calculator HTTP + JS

灵感

给工人发工资是按小时计算的,每次都要上网,我比较喜欢用 Hours Calculator ,也喜欢它的其它的功能, 做个类似的。

我以为是 Python,结果在学 javascript 看 HTML,页面的基础还停留在 Frontpage 2000 因为 MS-Office 2000 里有的。

忽略我的美学... 已排版尽力

这是一个长期的项目当遇到生活计算时,就会添加进来,也许会吧
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/davenian/article/details/143054998   <- 开篇文章

工时计算器 Work Hours Calculator

这是一个工作时长计算器,用于根据用户输入的开始时间、结束时间以及休息时间来计算总工时。它支持12小时制和24小时制,并能够处理跨越午夜的情况。

目录结构

/11. Calculator
    /static
        - styles.css
        /workhours
            - workhourscal.js
        /time
            - timercal.js
    /templates
        - index.html
        /converters
            - time.html
            - workhours.html
    - app.py
 

服务端

同 https://blog.csdn.net/davenian/article/details/143054998 里面的内容

workhourscal.html

<!DOCTYPE html>
<!--workhours.html-->
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>工作小时数计算器</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
</head>
<body>
<div>
    <!-- 顶部导航按钮 -->
    <div class="nav-buttons">
        <!-- 返回上一页 -->
        <button onclick="history.back()">返回上一页</button>
        <!-- 返回主页 -->
        <a href="{{ url_for('index') }}">返回主页</a>
    </div>

    <!-- 内容区 -->
    <div class="content">
    <!-- 左侧的计算器容器 -->
        <div class="calculator-container  boxed-container">
            <div>
                <h2 class="rendered"> 工作时长计算器</h2>
            </div>
            <div>
                <div class="alignCenter note small" style="margin-bottom: 10px;">
                    输入不带冒号的时间:815, 1225 等          
                </div>
                <div class="clock-container">
                    <!-- 12 小时时钟 -->
                    <div class="clock clock"> 
                        <input name="clock" type="radio" id="clock_0" value="12" onchange="toggleAmPm();" checked="">
                        <label for="clock_0">12 hour clock</label>&nbsp;&nbsp;&nbsp;
                    </div>
                    <!-- 24 小时时钟 -->
                    <div class="cell clock">
                        <input name="clock" type="radio" id="clock_1" value="24" onchange="toggleAmPm();">
                        <label for="clock_1">24 hour clock</label>        
                    </div>
                </div>
                <!-- AM/PM 选择框 -->
                <div class="clock-container">
                    <div class="cell">
                        <label for="startTime">开始时间:</label>
                        <input type="text" id="startTime" placeholder="hhmm" required maxlength="4" pattern="^([12]?[0-9][0-6][0-9])?$" inputmode="numeric" title="请输入有效的时间格式!">
                         <!-- AM/PM 选择框 -->
                        <div id="startAmPmContainer">
                            <select id="startAmPm">
                                <option value="AM" selected>AM</option>
                                <option value="PM">PM</option>
                        </select>
                        </div> 
                    </div>
                </div>
                <div class="clock-container">
                    <div class="cell">   
                        <label for="endTime">结束时间:</label>
                        <input type="text" id="endTime" placeholder="hhmm" required maxlength="4" pattern="^([12]?[0-9][0-6][0-9])?$" inputmode="numeric" title="请输入有效的时间格式!">
                        <!-- AM/PM 选择框 -->
                        <div id="endAmPmContainer">
                            <select id="endAmPm">
                                <option value="AM">AM</option>
                                <option value="PM" selected>PM</option>
                            </select>
                        </div> 
                    </div>
                </div>
                <div class="clock-container">
                    <div class="row">
                        <div class="cell alignLeft">
                            <label for="break_minutes">休息时间:</label>
                            <input type="text" id="break_minutes"  placeholder="0" inputmode="numeric" value="0" size="4" maxlength="3" onfocus="this.select()"> 分钟
                        </div>
                    </div>
                </div>
            </div>
            <div class="button-group">
                <div class="floatLeft">   
                    <button class="clear-btn" onclick="clearFields()">清除</button>
                </div>
                
                <div class="floatRight">
                    <button id="calculateHours" class="calculator-btn">工时计算</button>
                
                </div>
            </div>
            <div>
                <p></p>
                <div class="celleft">
                    <h3 style="display: inline;">结果: </h3>
                    <span id="answer"></span>
                </div>
                
                <!-- 使用标准的表格结构替换 div 模拟的表格 -->
                <table class="prettytable centered">
                    <tr>
                        <th>时间合计(hh:mm)</th>
                        <td id="totalTime">00:00</td>
                    </tr>
                    <tr>
                        <th>十进制显示</th>
                        <td id="decimalHours">0.00 hours</td>
                    </tr>
                    <tr>
                        <th>分钟统计</th>
                        <td id="totalMinutes">0 minutes</td>
                    </tr>
                </table>
            </div>
        </div>
    <!-- 右侧的说明文字 -->
        <div class="description">
        <h3>使用这个计算器来累加时间表或工时卡的工时。</h3>
        <p>只输入整数,如 1215 代表 12:15,或 137 代表 1:37。对于完整的工时卡,请使用工时卡计算器。</p>
        <p>输入开始时间和结束时间时,不要使用 "." 或 ":"。</p>
        <p>如果输入的数字为 1 到 12 之间的单个整数,系统将假定时间为 1:00 到 12:00。</p>
        <p>系统假定“12 pm”为中午,“12 am”为午夜。</p>
        <h3>将数字时间转换为十进制小时</h3>
        <p>假设您计算的总时间为 7:15(7 小时 15 分钟),其等效的十进制时间为 7.25 小时。您需要使用十进制小时来计算工资。</p>
        <h3>将分钟转换为十进制小时</h3>
        <p>7:15 表示 7.0 小时外加 15 分钟。您需要将分钟部分转换为小时。</p>
        <p>15 分钟乘以 1 小时除以 60 分钟,以小时为单位:</p>
        <p>15 分 × (1 小时 / 60 分钟) = (15/60) 小时 = 0.25 小时</p>
        <p>将 0.25 加到 7.0,我们的总时间就是 7.0 + 0.25 = 7.25 小时。</p>
        <h3>反向操作:将十进制小时转换为分钟</h3>
        <p>0.25 小时乘以每小时 60 分钟:</p>
        <p>0.25 小时 × (60 分钟 / 1 小时) = (0.25 × 60) 分钟 = 15 分钟。</p>
        </div>
    <script src="{{ url_for('static', filename='workhours/workhourscal.js') }}"></script>
    </div>
</body>
</html>

说明:

CSS 分开, <div></div> 写代码时,一定要格式对齐,至少这个必须的。display:flexed 慎用 尤其是行间距缩进时。

workhourscal.js

// workhourscal.js
document.addEventListener('DOMContentLoaded', function() { //必须在 function 之前
    // 绑定计算按钮的事件监听器
    document.getElementById('calculateHours').addEventListener('click', calculateHours);
    
    // 绑定清除按钮的事件监听器
    // document.getElementById('clearFields').addEventListener('click', clearFields);
});

function toggleAmPm() {
    // 获取选择的时钟模式
    var is24HourClock = document.getElementById('clock_1').checked;
    
    // 获取 AM/PM 选择框容器
    var startAmPmContainer = document.getElementById('startAmPmContainer');
    var endAmPmContainer = document.getElementById('endAmPmContainer');
    
    // 如果选择了24小时制,隐藏AM/PM选择框;否则显示
    if (is24HourClock) {
        startAmPmContainer.style.display = 'none';
        endAmPmContainer.style.display = 'none';
    } else {
        startAmPmContainer.style.display = 'block';
        endAmPmContainer.style.display = 'block';
    }
}

function calculateHours() {
    const startTime = document.getElementById('startTime').value;
    const endTime = document.getElementById('endTime').value;
    const is24HourClock = document.getElementById('clock_1').checked; // 检查是否是24小时制
    let startAmPm = '';
    let endAmPm = '';

    if (!is24HourClock) {
        startAmPm = document.getElementById('startAmPm').value;
        endAmPm = document.getElementById('endAmPm').value;
    }

    const breakMinutes = parseInt(document.getElementById('break_minutes').value) || 0;

    // 重置提示和变量
    document.getElementById('answer').textContent = '';  // 清空之前的提示
    let midnightCrossed = false;  // 初始化标记变量
    let answerText = '';  // 初始化提示内容

    // 验证输入的时间格式是否正确
    if (!isValidTime(startTime) || !isValidTime(endTime)) {
        document.getElementById('answer').textContent = '请输入有效的时间格式 (hhmm)';
        return;
    }

    // 将时间转换为分钟(如果是24小时制,则忽略AM/PM)
    const startMinutes = timeToMinutes(startTime, startAmPm, is24HourClock);
    const endMinutes = timeToMinutes(endTime, endAmPm, is24HourClock);

    let totalMinutes = endMinutes - startMinutes - breakMinutes;
    
    // 处理跨越午夜的情况:如果结束时间早于开始时间,自动处理为跨越午夜的情况
    if (totalMinutes < 0) {
        totalMinutes += 1440; // 加上一天的分钟数
        answerText = ' 注意:时间跨越了午夜!'; // 设置提醒文本
        midnightCrossed = true; // 标记为跨越了午夜
    }

    // 计算小时和分钟
    const hours = Math.floor(totalMinutes / 60);
    const minutes = totalMinutes % 60;

    // 计算十进制小时
    const decimalHours = (totalMinutes / 60).toFixed(2);

    // 输出调试
    console.log(`Hours: ${hours}, Minutes: ${minutes}, Decimal: ${decimalHours}, Total Minutes: ${totalMinutes}`);

    // 将结果更新到表格的相应单元格中
    document.getElementById('totalTime').textContent = `${hours}:${minutes.toString().padStart(2, '0')}`;  // 总时间 (hh:mm)
    document.getElementById('decimalHours').textContent = `${decimalHours} hours`;  // 十进制小时
    document.getElementById('totalMinutes').textContent = `${totalMinutes} minutes`;  // 总分钟数

    // 如果跨越了午夜,显示提示信息
    if (midnightCrossed) {
        document.getElementById('answer').textContent = answerText;  // 显示跨越午夜的提醒
    }
}

function timeToMinutes(time, amPm, is24HourClock) {
    let hours = parseInt(time.slice(0, time.length - 2), 10);
    let minutes = parseInt(time.slice(-2), 10);

    // 如果是24小时制,忽略 AM/PM 处理
    if (!is24HourClock) {
        if (amPm === 'PM' && hours !== 12) {
            hours += 12;
        } else if (amPm === 'AM' && hours === 12) {
            hours = 0;
        }
    }

    return hours * 60 + minutes;
}

function isValidTime(time) {
    return /^([01]?[0-9]|2[0-3])[0-5][0-9]$/.test(time);  // 验证24小时制时间格式
}


function clearFields() {
    document.getElementById('startTime').value = '';
    document.getElementById('endTime').value = '';
    document.getElementById('break_minutes').value = '0';
    document.getElementById('answer').textContent = '';
    document.getElementById('totalTime').textContent = `00:00`;
    document.getElementById('decimalHours').textContent = `0.00 hours`;
    document.getElementById('totalMinutes').textContent = `0 minutes`;
    document.getElementById('answerText').textContent = ``;
    //document.getElementById('midnightCrossed').textContent = ``;
}

说明:

一定要放在第一行!!!

document.addEventListener('DOMContentLoaded', function() { //必须在 function 之前
    // 绑定计算按钮的事件监听器
    document.getElementById('calculateHours').addEventListener('click', calculateHours);
    
    // 绑定清除按钮的事件监听器
    // document.getElementById('clearFields').addEventListener('click', clearFields);
});

当网页的 DOM 加载完成时,这段代码会运行。它会给 id="calculateHours()" 的按钮绑定一个点击事件,当按钮被点击时会触发 calculateHours() 函数,进行工时计算。

function toggleAmPm()

用来切换12小时和24小时制。当用户选择24小时制时,它会隐藏 AM/PM 选择框。

计算工时的主函数 function calculateHours():

负责计算开始时间和结束时间之间的总工时。它根据输入的时间,判断是否是24小时制,计算时间差(总工时),并且在跨越午夜时进行处理,提示用户输入的时间"跨越了午夜"。

时间转换函数 function timeToMinutes()

将输入的时间(格式为 hhmm)转换为总分钟数。如果是12小时制,还会根据 AM/PM 来调整小时数。例如, 2:00 会被转换为 14:00(即 840 分钟)

时间格式验证函数 function isValidTime()

用于输入的时间格式是否正确(格式应该是 hhmm )。例如,909 是合法的时间,而 9090 则不是。

清除输入字段函数 function clearFields()

  • 这个函数会清空所有输入字段和结果显示区域,恢复页面到初始状态。

        代码流程总结:

  •     输入时间:输入开始时间、结束时间以及休息时间。
  •     选择12/24小时制:根据选择,显示或隐藏 AM/PM 选择框。
  •     计算工时:点击 "计算" 按钮后,程序根据输入的时间计算工时,并处理跨越午夜的情况。
  •     显示结果:计算完成后,工时结果会显示在页面的对应位置。如果输入的时间跨越了午夜,会有相应提示。


http://www.kler.cn/news/362227.html

相关文章:

  • 【火山引擎】语音合成 | HTTP接口 | 一次性合成 | python
  • RHCE的学习(6)
  • 司法鉴定中,医疗过错的认定原则及路径
  • react18中在列表项中如何使用useRef来获取每项的dom对象
  • FileLink内外网文件交换——致力企业高效安全文件共享
  • Active Directory(活动目录)密码审核工具
  • scrapy案例——豆瓣电影Top250的爬取
  • 高校危化试剂仓储系统|基于SprinBoot+vue的高校危化试剂仓储系统设计与实现(源码+数据库+文档)
  • 上拉电阻和下拉电阻在电路中的作用(一)
  • HTTP安全么?如何更好的保护您的网站
  • 软件程序系统架构中MVC和三层架构分别是什么,有什么区别?
  • Jmeter接口测试企业级项目实战day2
  • 从不一样的角度体会MATLAB
  • 张雪峰:如果你现在是计算机专业,一定要优先报网络安全,它是未来国家发展的大方向
  • 测网速小程序,纯前端
  • 基于深度学习的生物启发的学习系统
  • 【问题解决】——当出现0xc000007b和缺少mfc140.dll时,该怎么做才能让软件可以打开
  • MySQL中的最左前缀匹配原则
  • docker加速镜像
  • 论文阅读(二十四):SA-Net: Shuffle Attention for Deep Convolutional Neural Networks
  • linux系统下载安装nvidia显卡驱动
  • Qml的使用
  • Unity加载界面制作
  • Docker:安装 Syslog-ng 的技术指南
  • Build an Android project and get a `.apk` file on a Debian 11 command line
  • Java项目-基于Springboot的车辆充电桩项目(源码+说明).zip