Skip to content

MomentJS - Getter/Setter 方法

现代日期/时间:Moment.js 中的获取器与设置器

Section titled “现代日期/时间:Moment.js 中的获取器与设置器”

Moment.js 提供了方便的方法来获取(get)和修改(set)Moment 对象中特定的时间单位(如年、月、小时等)。

可变性警告: Moment.js 设置器一个重要的特性是它们会**修改(mutate)**原始的 Moment 对象。如果处理不当,这可能会导致意外的副作用。如果需要保留原始的 moment 对象,请始终考虑在修改之前进行克隆(.clone())。

大多数时间单位都有对应的获取器和设置器方法,通常有单数和复数别名:

单位获取器语法设置器语法
毫秒moment().millisecond() 或 .milliseconds()moment().millisecond(Number) 或 .milliseconds(Number) (0-999)
秒moment().second() 或 .seconds()moment().second(Number) 或 .seconds(Number) (0-59)
分钟moment().minute() 或 .minutes()moment().minute(Number) 或 .minutes(Number) (0-59)
小时moment().hour() 或 .hours()moment().hour(Number) 或 .hours(Number) (0-23)
月份中的日期moment().date() 或 .dates()moment().date(Number) 或 .dates(Number) (1-31)
星期几moment().day() 或 .days() (与区域设置相关,0=周日,6=周六)moment().day(Number|String) 或 .days(Number|String) (0-6 或区域设置下的星期名称)
ISO 标准星期几moment().isoWeekday() (1=周一,7=周日)moment().isoWeekday(Number) (1-7)
一年中的第几天moment().dayOfYear()moment().dayOfYear(Number) (1-366)
一年中的第几周moment().week() 或 .weeks() (与区域设置相关)moment().week(Number) 或 .weeks(Number)
ISO 标准一年中的第几周moment().isoWeek() 或 .isoWeeks()moment().isoWeek(Number) 或 .isoWeeks(Number)
月份moment().month() (0-11,0=一月)moment().month(Number|String) (0-11 或区域设置下的月份名称)
季度moment().quarter() 或 .quarters() (1-4)moment().quarter(Number) 或 .quarters(Number) (1-4)
年moment().year() 或 .years()moment().year(Number) 或 .years(Number)
周年moment().weekYear() (与区域设置相关)moment().weekYear(Number)
ISO 标准周年moment().isoWeekYear()moment().isoWeekYear(Number)
一年中的总周数moment().weeksInYear() (与区域设置相关)不适用
ISO 标准一年中的总周数moment().isoWeeksInYear()不适用

Moment.js 还提供了通用的 get 和 set 方法:

  • moment().get(String):使用字符串键获取单位值(例如,moment().get('year'),moment().get('month'))。注意:“month”是基于 0 的索引。
  • moment().set(String, Int):使用字符串键设置单个单位(例如,moment().set('hour', 13))。
  • moment().set(Object):使用对象一次设置多个单位(例如,moment().set({ year: 2024, month: 0, date: 1 }))。请记住这里的 month 也是基于 0 的索引!

示例:使用获取器和设置器(配合克隆)

Section titled “示例:使用获取器和设置器(配合克隆)”
const now = moment();
console.log('Original:', now.format('YYYY-MM-DD HH:mm:ss'));
// Get the current hour
const currentHour = now.hour();
console.log('Current Hour:', currentHour);
// --- Mutating Example (Use with care!) ---
// const modifiedDirectly = now.year(2025);
// console.log('Original (MUTATED!):', now.format('YYYY-MM-DD HH:mm:ss'));
// console.log('Modified Directly:', modifiedDirectly.format('YYYY-MM-DD HH:mm:ss'));
// --- Safer Example using clone() ---
const safeModified = now.clone().year(2025).month(0); // Set year to 2025, month to January
console.log('Original (Safe):', now.format('YYYY-MM-DD HH:mm:ss')); // Unchanged
console.log('Safely Modified:', safeModified.format('YYYY-MM-DD HH:mm:ss'));
// Using generic set
const startOfDay = moment().clone().set({ hour: 0, minute: 0, second: 0, millisecond: 0 });
console.log('Start of Today:', startOfDay.format('YYYY-MM-DD HH:mm:ss.SSS'));

Moment.js 可以轻松地从列表中找到最早或最晚的 moment 对象:

  • moment.max(Moment[, Moment...]) 或 moment.max(Moment[]):返回提供的参数或数组中最晚的 Moment 对象。
  • moment.min(Moment[, Moment...]) 或 moment.min(Moment[]):返回提供的参数或数组中最早的 Moment 对象。
const date1 = moment('2023-10-26');
const date2 = moment('2023-11-15');
const date3 = moment('2023-10-01');
const latestDate = moment.max(date1, date2, date3);
const earliestDate = moment.min([date1, date2, date3]);
console.log('Latest:', latestDate.format('YYYY-MM-DD')); // 输出: Latest: 2023-11-15
console.log('Earliest:', earliestDate.format('YYYY-MM-DD')); // 输出: Earliest: 2023-10-01

获取器和设置器是与 Moment 对象交互的基础,但使用设置器时务必注意其可变性。

更多详情请参阅文档:https://momentjs.com/docs/#/get-set/