Skip to content

格式化日期和时间

现代日期/时间处理:使用 Moment.js 进行格式化

Section titled “现代日期/时间处理:使用 Moment.js 进行格式化”

以特定的、人类可读的格式显示日期和时间是核心需求之一。Moment.js 在这方面表现出色,提供灵活的格式化选项、相对时间表达以及多种输出类型。

尽管功能强大,但请记住 Moment.js 目前处于维护模式。对于新项目,像 Day.js、date-fns 或原生的 Intl.DateTimeFormat API 等替代方案可能更适合,它们可能提供更好的性能和 tree-shaking 能力。

以下是格式化和显示 Moment 对象的常用方法:

方法描述及示例语法
Format最通用的方法。使用令牌(例如,‘YYYY-MM-DD’)定义输出字符串。
moment().format(); // 默认的 ISO 8601 格式
moment().format('MMMM Do YYYY, h:mm:ss a'); // 例如:October 26th 2023, 3:30:00 pm
moment().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'); // 90
end.diff(start, 'hours'); // 1
end.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();

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/