格式化日期和时间
现代日期/时间处理:使用 Moment.js 进行格式化
Section titled “现代日期/时间处理:使用 Moment.js 进行格式化”以特定的、人类可读的格式显示日期和时间是核心需求之一。Moment.js 在这方面表现出色,提供灵活的格式化选项、相对时间表达以及多种输出类型。
尽管功能强大,但请记住 Moment.js 目前处于维护模式。对于新项目,像 Day.js、date-fns 或原生的 Intl.DateTimeFormat API 等替代方案可能更适合,它们可能提供更好的性能和 tree-shaking 能力。
核心格式化方法
Section titled “核心格式化方法”以下是格式化和显示 Moment 对象的常用方法:
| 方法 | 描述及示例语法 |
|---|---|
| Format | 最通用的方法。使用令牌(例如,‘YYYY-MM-DD’)定义输出字符串。moment().format(); // 默认的 ISO 8601 格式moment().format('MMMM Do YYYY, h:mm:ss a'); // 例如:October 26th 2023, 3:30:00 pmmoment().format('dddd'); // 例如:Thursday |
| Time from Now | 显示与当前时刻的相对时间。moment().subtract(10, 'minutes').fromNow(); // '10 minutes ago'moment().add(2, 'hours').fromNow(); // 'in 2 hours'moment().add(2, 'hours').fromNow(true); // '2 hours' (不带后缀) |
| Time from X | 显示与特定时刻的相对时间。const pastDate = moment('2023-01-01');moment().from(pastDate); // 例如:'10 months ago' |
| Time to Now | 类似于 fromNow,但逻辑相反(较少使用)。moment().add(10, 'minutes').toNow(); // 'in 10 minutes' |
| Time to X | 类似于 from,但逻辑相反。const futureDate = moment('2024-01-01');moment().to(futureDate); // 例如:'in 2 months' |
| Calendar Time | 使用本地化格式显示与参考时间(默认为当前时间)的相对时间(例如,‘Today at…’, ‘Yesterday…’, ‘Next Tuesday…’)。moment().subtract(1, 'day').calendar(); // 'Yesterday at 3:30 PM'moment().add(3, 'days').calendar(); // 'Sunday at 3:30 PM'moment().calendar(referenceTime, formats); // 自定义参考时间和格式 |
| Difference | 计算两个 Moment 对象之间以指定单位(默认:毫秒)表示的差值。const start = moment('2023-10-26T09:00:00');const end = moment('2023-10-26T10:30:00');end.diff(start); // 毫秒差值end.diff(start, 'minutes'); // 90end.diff(start, 'hours'); // 1end.diff(start, 'hours', true); // 1.5 (浮点数) |
| Unix Timestamp (milliseconds) | 获取自 Unix 时间戳(Unix Epoch)以来的毫秒数。moment().valueOf();+moment(); // 使用类型强制转换的简写 |
| Unix Timestamp (seconds) | 获取自 Unix 时间戳(Unix Epoch)以来的秒数。moment().unix(); |
| Days in Month | 获取当前 Moment 对象所在月份的天数。moment('2024-02-01').daysInMonth(); // 29 (闰年)moment('2023-02-01').daysInMonth(); // 28 |
| As JavaScript Date | 将 Moment 对象转换为原生的 JavaScript Date 对象。moment().toDate();注意:原生的 Date 对象功能较少且行为不同。 |
| As Array | 返回一个模仿传递给 new Date() 的参数的数组:[year, month, day, hour, minute, second, millisecond]。moment().toArray(); // 例如:[2023, 9, 26, 15, 30, 0, 0] (月份是 0 索引的) |
| As JSON | 返回一个适用于 JSON 序列化的 ISO 8601 字符串。moment().toJSON(); // 调用 moment().toISOString() |
| As ISO 8601 String | 以 ISO 8601 格式返回日期。moment().toISOString(); // 例如:'2023-10-26T15:30:00.000Z'moment().toISOString(true); // 如果存在时区偏移量则保留 |
| As Object | 返回一个包含日期/时间组件的对象。moment().toObject(); // { years, months, date, hours, minutes, seconds, milliseconds } |
| As String | 返回一个人类可读的字符串(使用原生的 Date.prototype.toString)。moment().toString(); // 例如:'Thu Oct 26 2023 15:30:00 GMT+0100' |
| Inspect | 返回 Node.js util.inspect() 使用的字符串表示形式。主要用于调试。moment().inspect(); |
常用格式令牌
Section titled “常用格式令牌”moment().format(String) 的一些常用令牌:
YYYY:4 位数年份(例如,2023)YY:2 位数年份(例如,23)MMMM:完整月份名称(例如,October)MMM:缩写月份名称(例如,Oct)MM:月份数字(01-12)M:月份数字(1-12)DD:月份中的日期(01-31)D:月份中的日期(1-31)dddd:完整星期名称(例如,Thursday)ddd:缩写星期名称(例如,Thu)d:星期几(0=Sunday,6=Saturday)HH:小时(00-23)H:小时(0-23)hh:小时(01-12)h:小时(1-12)mm:分钟(00-59)m:分钟(0-59)ss:秒(00-59)s:秒(0-59)A:上午/下午a:上午/下午Z:时区偏移量(例如,+01:00)ZZ:时区偏移量(例如,+0100)Do:带有序数词的月份中的日期(例如,1st, 2nd)X:Unix 时间戳(秒)x:Unix 时间戳(毫秒)
有关完整的格式令牌列表,请参阅 Moment.js 官方文档:https://momentjs.com/docs/#/displaying/format/