操作日期和时间
现代日期/时间:使用 Moment.js 进行操作
Section titled “现代日期/时间:使用 Moment.js 进行操作”Moment.js 提供了直观的方法来修改日期和时间值,例如增加或减少时间单位,或移动到特定时间段的开始或结束。
重要提醒:可变性(Mutability)! Moment.js 中的大多数操作方法都会**变动(mutate)**原始的 Moment 对象。如果你需要保留原始日期,在操作之前务必 clone()(克隆)该 Moment 对象。 不这样做是常见的 bug 源头。
// 变动示例const originalMoment = moment('2023-10-26');const addedMoment = originalMoment.add(1, 'day');
console.log(originalMoment.format('YYYY-MM-DD')); // 输出: 2023-10-27 (已变动!)console.log(addedMoment.format('YYYY-MM-DD')); // 输出: 2023-10-27
// 使用 clone() 的正确方式const safeOriginal = moment('2023-10-26');const safeAdded = safeOriginal.clone().add(1, 'day');
console.log(safeOriginal.format('YYYY-MM-DD')); // 输出: 2023-10-26 (已保留)console.log(safeAdded.format('YYYY-MM-DD')); // 输出: 2023-10-27常用操作方法
Section titled “常用操作方法”以下是日期/时间操作的关键方法:
| 方法 | 描述与语法 |
|---|---|
| Add | 增加指定的时间量。moment().add(Number, String) (例如,add(7, 'days'))moment().add(Duration) (例如,add(moment.duration(2, 'hours')))moment().add(Object) (例如,add({ days: 7, hours: 2 })) |
| Subtract | 减少指定的时间量。moment().subtract(Number, String) (例如,subtract(3, 'months'))moment().subtract(Duration)moment().subtract(Object) (例如,subtract({ weeks: 1, minutes: 30 })) |
| Start of Time | 将 Moment 对象设置为指定时间单位的开始。moment().startOf(String) (例如,startOf('day')、startOf('month')、startOf('year')、startOf('hour'))moment('2023-10-26T15:30:45').startOf('day'); // 变为 2023-10-26T00:00:00moment('2023-10-26T15:30:45').startOf('month'); // 变为 2023-10-01T00:00:00 |
| End of Time | 将 Moment 对象设置为指定时间单位的结束。moment().endOf(String) (例如,endOf('day')、endOf('month')、endOf('week'))moment('2023-10-26T15:30:45').endOf('day'); // 变为 2023-10-26T23:59:59.999moment('2023-10-26T15:30:45').endOf('month'); // 变为 2023-10-31T23:59:59.999 |
| Local Mode | 将 Moment 对象设置为使用本地时间模式(这通常是默认设置)。moment().local();用于将 UTC Moment 对象转换回本地时间。 |
| UTC Mode | 将 Moment 对象设置为使用 UTC 模式。moment().utc();此后的操作会将日期/时间解释为 UTC。 |
| UTC Offset | 设置或获取 UTC 偏移量(分钟)。moment().utcOffset(); // 获取当前偏移量moment().utcOffset(Number|String); // 设置偏移量 (例如,utcOffset(120) 或 utcOffset('+02:00'))moment().utcOffset(Number, keepLocalTime); // boolean 值:如果为 true,保留本地时间并改变偏移量 |
支持的操作单位
Section titled “支持的操作单位”add、subtract、startOf、endOf 方法接受的字符串单位包括(不区分大小写,支持单数或复数):
'year'、'y'(年)'quarter'、'Q'(季度)'month'、'M'(月)'week'、'w'(周)'isoWeek'(ISO 周)'day'、'd'(日)'date'(‘day’ 的别名)'hour'、'h'(小时)'minute'、'm'(分钟)'second'、's'(秒)'millisecond'、'ms'(毫秒)
示例:计算截止日期
Section titled “示例:计算截止日期”const orderDate = moment('2023-10-26T11:00:00');const processingTime = { days: 2 }; // 2 个工作日(简化实现)const shippingTime = moment.duration(3, 'days'); // 3 个日历日
// 操作前先克隆let estimatedShipDate = orderDate.clone().add(processingTime);
// 示例:跳过周末(简单实现)while (estimatedShipDate.day() === 0 || estimatedShipDate.day() === 6) { // 星期日=0,星期六=6 estimatedShipDate.add(1, 'day');}
const estimatedDeliveryDate = estimatedShipDate.clone().add(shippingTime);
console.log('Order Date:', orderDate.format('LLLL'));console.log('Estimated Ship Date:', estimatedShipDate.format('LLLL'));console.log('Estimated Delivery Date:', estimatedDeliveryDate.format('LLLL'));
// 获取送达周的开始日期const deliveryWeekStart = estimatedDeliveryDate.clone().startOf('week');console.log('Delivery Week Starts On:', deliveryWeekStart.format('LL'));
/* 示例输出(假设 2023 年 10 月 26 日是星期四):Order Date: Thursday, October 26, 2023 11:00 AMEstimated Ship Date: Monday, October 30, 2023 11:00 AMEstimated Delivery Date: Thursday, November 2, 2023 11:00 AMDelivery Week Starts On: 10/29/2023*/此示例演示了如何将 add 方法与不同输入(对象、Duration)以及 startOf 方法结合使用,并且始终使用 clone 方法来确保操作不会破坏原始对象。
掌握操作方法需要理解其可变性。查阅文档:https://momentjs.com/docs/#/manipulating/