Day.js

2024-06-21 20:59:14 92
Day.js 是一个快速、简洁且现代的日期库,提供了类似 Moment.js 的 API,但体积更小(大约 2KB)。它支持多种日期格式解析、日期运算和格式化等功能,同时具有良好的性能表现。

Day.js 的特点

  • 轻量级:Day.js 仅有约 2KB,非常适合需要高性能和小体积的应用。
  • 性能优化:Day.js 的性能表现优秀,因为它采用了不可变对象和更高效的实现方式。
  • API 兼容:Day.js 的 API 设计与 Moment.js 非常相似,使得从 Moment.js 迁移到 Day.js 非常简单。
  • 插件机制:Day.js 提供了丰富的插件,可以按需加载扩展功能。
  • 国际化:支持多种语言和时区设置,便于处理国际化需求。
  • 不变性:所有的 Day.js 对象都是不可变的,确保日期操作的安全性和一致性。

Day.js 的安装与使用

安装

Day.js 可以通过 npm 或 yarn 安装:

npm install dayjs

yarn add dayjs

引入与使用

Day.js 可以通过 CommonJS 或 ES6 模块的方式引入:

// CommonJS
const dayjs = require('dayjs');

// ES6
import dayjs from 'dayjs';

Day.js 的基本用法

创建日期对象

当前日期时间

const now = dayjs();
console.log(now.toString());

指定日期时间

const date = dayjs('2024-06-15');
console.log(date.toString());

格式化日期

默认格式化

const now = dayjs();
console.log(now.format());
// => 2024-06-15T12:34:56+00:00 (示例)

自定义格式化

const now = dayjs();
console.log(now.format('YYYY-MM-DD'));
// => 2024-06-15 (示例)

日期解析

解析字符串日期

const date = dayjs('2024-06-15');
console.log(date.toString());
  • 解析带时间的字符串日期
const dateTime = dayjs('2024-06-15T12:34:56');
console.log(dateTime.toString());

日期运算

添加时间

const date = dayjs('2024-06-15');
const newDate = date.add(1, 'day');
console.log(newDate.format('YYYY-MM-DD'));
// => 2024-06-16

减去时间

const date = dayjs('2024-06-15');
const newDate = date.subtract(1, 'month');
console.log(newDate.format('YYYY-MM-DD'));
// 2024-05-15

开始和结束时间

const date = dayjs('2024-06-15');
console.log(date.startOf('month').format('YYYY-MM-DD'));
// => 2024-06-01

console.log(date.endOf('month').format('YYYY-MM-DD'));
// => 2024-06-30

日期比较

是否相同

const date1 = dayjs('2024-06-15');
const date2 = dayjs('2024-06-15');
console.log(date1.isSame(date2));
// true

是否在之前或之后

const date1 = dayjs('2024-06-15');
const date2 = dayjs('2024-06-16');
console.log(date1.isBefore(date2));
// true
console.log(date1.isAfter(date2));
// false

Day.js 的高级功能

插件机制

Day.js 通过插件机制扩展功能,以下是一些常用插件及其用法:

相对时间

import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(relativeTime);

console.log(dayjs().from(dayjs('2024-06-14'))); // '1 day ago'
console.log(dayjs().fromNow()); // 'a few seconds ago'

自定义解析格式

import customParseFormat from 'dayjs/plugin/customParseFormat';
dayjs.extend(customParseFormat);

const date = dayjs('12-25-1995', 'MM-DD-YYYY');
console.log(date.format('YYYY-MM-DD')); // '1995-12-25'

时区支持

import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);

const date = dayjs().tz('America/New_York');
console.log(date.format()); //在纽约时区的当前日期时间

高级格式化

import advancedFormat from 'dayjs/plugin/advancedFormat';
dayjs.extend(advancedFormat);

console.log(dayjs().format('Q Do k kk X x'));
//'2nd 15th 1 01 1623792000 1623792000000'

国际化

Day.js 支持多种语言,可以轻松切换语言设置:

import 'dayjs/locale/zh-cn';
dayjs.locale('zh-cn');

console.log(dayjs().format('dddd')); // '星期六'(示例)

Day.js 文档与资源

通过 Day.js,开发人员可以高效地处理日期和时间,简化代码,提升性能。Day.js 是一个非常优秀的日期处理库,适合各种 JavaScript 开发需求。

与 Moment.js 的对比

体积与性能

Day.js: 体积:Day.js 非常轻量级,压缩后仅约 2KB。 性能:Day.js 的性能表现优秀,因为它采用了不可变对象和更高效的实现方式。

Moment.js: 体积:Moment.js 比较庞大,压缩后约 67KB。 性能:由于 Moment.js 是一个功能齐全的库,包含了大量功能,性能相对较差。

API 设计

Day.js: API 兼容:Day.js 的 API 设计与 Moment.js 非常相似,使得从 Moment.js 迁移到 Day.js 非常简单。 不可变性:Day.js 的对象是不可变的,每次操作都会返回一个新的 Day.js 对象,避免了意外修改原对象的问题。

Moment.js: API 设计:Moment.js 的 API 功能强大且丰富,但其对象是可变的,容易导致副作用。

插件机制

Day.js: 插件化:Day.js 提供了一个灵活的插件机制,可以按需加载插件扩展功能。 模块化:只需加载必要的插件,可以保持库的轻量和高效。

Moment.js: 内置功能:Moment.js 内置了大量功能,但不如 Day.js 的插件机制灵活。 插件:Moment.js 也有一些插件,但整体灵活性和按需加载的支持不如 Day.js。

时区和国际化

Day.js: 时区支持:通过插件扩展支持时区处理(dayjs/plugin/timezone)。 国际化:Day.js 支持多语言,通过加载相应的语言包进行设置。

Moment.js: 时区支持:Moment.js 提供了单独的 Moment Timezone 库来处理时区问题。 国际化:Moment.js 内置了大量的语言支持,设置语言非常方便。

常见功能对比

创建日期

Day.js:

import dayjs from 'dayjs';

const now = dayjs();
const specificDate = dayjs('2024-06-15');

Moment.js:

import moment from 'moment';

const now = moment();
const specificDate = moment('2024-06-15');

格式化日期

Day.js:

const now = dayjs();
console.log(now.format('YYYY-MM-DD'));

Moment.js:

const now = moment();
console.log(now.format('YYYY-MM-DD'));

日期运算

Day.js:

const date = dayjs('2024-06-15');
const newDate = date.add(1, 'day');
console.log(newDate.format('YYYY-MM-DD'));

Moment.js:

const date = moment('2024-06-15');
const newDate = date.add(1, 'day');
console.log(newDate.format('YYYY-MM-DD'));

比较日期

Day.js:

const date1 = dayjs('2024-06-15');
const date2 = dayjs('2024-06-16');
console.log(date1.isBefore(date2)); # => true

Moment.js:

const date1 = moment('2024-06-15');
const date2 = moment('2024-06-16');
console.log(date1.isBefore(date2)); # => true