javascript - Moment.js - 营业/营业/轮班时间内的持续时间?
问题描述
在此先感谢您的帮助。我正在尝试使用 moment.js 计算两个日期之间的持续时间,但我无法弄清楚如何仅计算在我们的营业/营业时间内的时间(在我们的情况下为分钟)。
鉴于这些营业时间:
- MF 从上午 8:00 到下午 6:00
- Sa-Su 上午 10:00 至下午 2:00
简单的持续时间示例
如果作业从周四下午 4:00 开始,周五上午 9:30 结束,则持续时间为 210 分钟(下午 4 点到 6 点 = 120 分钟,上午 8 点到 9:30 = 90 分钟)。
不太简单的持续时间示例
如果作业从周四下午 4:00 开始,周六上午 9:30 结束,则持续时间为 720 分钟(下午 4 点至下午 6 点 = 120 分钟,下午 8 点至下午 6 点 = 600 分钟,周五下午 6 点至周六上午 10 点之间的时间不加到期间)
解决方案
正如 Cruril 指出的那样,有一个名为moment-business-time的库来处理这个问题,它是Moment.js的一个插件。
问题是你不能在浏览器中运行插件,因为它是一个 Node 包。我冒昧地提取了脚本以避免所有讨厌的逻辑。有一个使用browserify构建客户端脚本的开放票。
我在这里记录了构建客户端脚本的步骤,但编译后的脚本仍然找不到该workingDiff
函数。所以我包括了一个简化的;下面脚本中的工作时间的工作版本。
moment.updateLocale('en', {
workinghours: {
0: null, // Sun : CLOSED
1: [ '12:00:00', '20:00:00' ], // Mon : 8am - 4pm (local EDT)
2: [ '12:00:00', '18:00:00' ], // Tue : 8am - 2pm (local EDT)
3: [ '12:00:00', '20:00:00' ], // Wed : 8am - 4pm (local EDT)
4: [ '12:00:00', '18:00:00' ], // Thu : 8am - 2pm (local EDT)
5: [ '12:00:00', '16:00:00' ], // Fri : 8am - 12pm (local EDT)
6: null // Sat : CLOSED
},
holidays : []
});
moment.locale('en');
moment.tz.setDefault("America/New_York"); // Timezone plugin
var dateFormat = 'MM/DD/YYYY hh:mm:ss a';
// 0 + 8 + 6 + 8 + 6 + (4 - 1.5) + 0 = 30.5
var fromDate = moment('04/01/2018 00:00:00 am', dateFormat); // 2018-04-01T04:00:00.000Z
var toDate = moment('04/06/2018 02:30:00 pm', dateFormat); // 2018-04-06T18:30:00.000Z
console.log(fromDate.workingDiff(toDate, 'hours')); // 30 hours
console.log(fromDate.workingDiff(toDate, 'hours', true)); // 30.5 hours
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.16/moment-timezone.min.js"></script>
<script src="https://rawgit.com/rmkane/32084550b349eaebe7e78e46903084ce/raw/434cf510165a65c234a8cb1cb99641bc7ab15c16/moment-business-time.js"></script>
<!--
https://github.com/lennym/moment-business-time
https://www.npmjs.com/package/moment-business-days#how-to-use
-->
推荐阅读
- c# - 如何在 Xamarin android 中放置循环加载动画
- shapes - Harfbuzz - 文本到字形到文本
- arrays - 节点快速查找数组的方法
- azure - 获取与 Azure Web App 相关的容器的正确名称
- android - 使用改造将图像上传到服务器
- carriage-return - 使用 control-m 字符意外结束文件
- android - 优胜者卡动画问题
- sql - Sql项目,编辑按钮无法正常工作
- django-admin - Django admin inline 不像文档中描述的那样工作
- php - “SQLSTATE [HY000] [1045] 用户 'homestead'@'localhost' 的访问被拒绝(使用密码:YES)”