在Ionic中替代java.util.Calendar的日期计算工具选型咨询
嘿,在Ionic里做这些日期时间计算根本不用找那些GUI日历组件啦!毕竟Ionic本质是基于JS/TS的跨平台框架,直接用专门的日期处理类库就能搞定,完全能替代Java里Calendar的功能,而且代码更简洁。
核心推荐的日期库
首推Day.js(轻量,体积仅2KB左右,API和Moment.js几乎一致),其次是date-fns(函数式设计,支持树摇,打包体积更小)。如果是维护老项目,可能会用到Moment.js,但它现在已进入维护模式,不推荐新项目使用。
你可以直接通过npm安装这些库,比如安装Day.js:
npm install dayjs
1. Unix时间转星期几
不管是秒级还是毫秒级的Unix时间,用Day.js都能轻松转换:
import dayjs from 'dayjs'; // 示例:秒级Unix时间 const unixTime = 1620000000; // 获取星期数字(0=周日,1=周一...6=周六) const weekdayNum = dayjs.unix(unixTime).day(); // 获取英文星期名(比如"Monday") const weekdayEn = dayjs.unix(unixTime).format('dddd'); // 获取中文星期名(比如"星期一") const weekdayZh = dayjs.unix(unixTime).format('星期d');
如果用原生Date对象也能实现,但格式化星期名需要自己写逻辑,远不如类库方便。
2. 给已知日期添加指定秒数得到新日期
用Day.js的add方法可以快速实现,支持各种时间单位:
import dayjs from 'dayjs'; // 已知日期可以是ISO字符串、Date对象或者Unix时间 const originalDate = '2024-05-20T12:00:00'; const addSeconds = 3600; // 要添加的秒数(这里是1小时) // 计算新日期 const newDate = dayjs(originalDate).add(addSeconds, 'second'); // 格式化输出(按需调整格式) console.log(newDate.format('YYYY-MM-DD HH:mm:ss'));
3. 计算两个日期之间的时间差
Day.js的diff方法可以直接获取两个日期在指定单位下的差值:
import dayjs from 'dayjs'; const date1 = dayjs('2024-01-01'); const date2 = dayjs('2024-05-20'); // 计算天数差 const diffDays = date2.diff(date1, 'day'); // 计算秒数差 const diffSeconds = date2.diff(date1, 'second'); // 还支持小时、分钟、月、年等单位 const diffMonths = date2.diff(date1, 'month');
4. 计算两个Unix时间之间的工作日天数(不含周末)
这个需求确实需要额外处理,不过用Day.js也能轻松实现:
方法一:用Day.js的isWeekday插件
先安装插件:
npm install dayjs-plugin-is-weekday
然后编写计算逻辑:
import dayjs from 'dayjs'; import isWeekday from 'dayjs-plugin-is-weekday'; // 扩展Day.js功能 dayjs.extend(isWeekday); function countWorkdays(startUnix: number, endUnix: number): number { let workdayCount = 0; let currentDay = dayjs.unix(startUnix); const endDay = dayjs.unix(endUnix); // 遍历每一天,统计工作日 while (currentDay.isBefore(endDay) || currentDay.isSame(endDay)) { if (currentDay.isWeekday()) { // 自动排除周六、周日 workdayCount++; } currentDay = currentDay.add(1, 'day'); } return workdayCount; } // 调用示例 const startUnix = 1713561600; // 2024-04-20 00:00:00 const endUnix = 1714166400; // 2024-04-27 00:00:00 console.log(countWorkdays(startUnix, endUnix)); // 输出5(周一到周五)
方法二:手动判断星期几
如果不想安装插件,也可以自己判断星期几来排除周末:
import dayjs from 'dayjs'; function countWorkdays(startUnix: number, endUnix: number): number { let workdayCount = 0; let currentDay = dayjs.unix(startUnix); const endDay = dayjs.unix(endUnix); while (currentDay.isBefore(endDay) || currentDay.isSame(endDay)) { const weekday = currentDay.day(); // 0=周日,6=周六,排除这两天 if (weekday !== 0 && weekday !== 6) { workdayCount++; } currentDay = currentDay.add(1, 'day'); } return workdayCount; }
要是还需要排除节假日,就得自己维护对应地区的节假日列表,在循环里额外判断即可,这个没有通用的库能覆盖所有场景。
内容的提问来源于stack exchange,提问作者Audrius Meškauskas
相关产品推荐
相关产品推荐

