<
>
ETHIOCODE
SOFTSELECT
แˆถแแ‰ตแ‹Œแˆญ แˆแˆญแŒซ แˆˆแŠขแ‰ตแ‹ฎแŒตแ‹ซ
P3 ยท L06 ยท DAY.JS ยท DATE & TIME ยท LOADING...
PHASE 3 ยท LESSON 06

Day.js โ€”
Date แŠฅแŠ“ TimeแŠ• แˆˆแˆ›แˆตแ‰ฐแ‹ณแ‹ฐแˆญ แ‰€แˆ‹แˆ‰ แˆ˜แŠ•แŒˆแ‹ต! ๐Ÿ“…

แˆ˜แŒ แŠ‘ 2KB แ‰ฅแ‰ป แ‹จแˆ†แА! แ‰ณแ‹‹แ‰‚แ‹แŠ• Moment.jsแŠ• แ‹จแ‰ฐแŠซ โ€” แ‰€แˆ‹แˆ แŠฅแŠ“ แŠฅแŒ…แŒ แˆแŒฃแŠ•!
Parse แˆ›แ‹ตแˆจแŒ ยท Format แˆ˜แ‰€แ‹จแˆญ ยท Manipulate แˆ›แ‹ตแˆจแŒ ยท Relative Time ยท Timezone โ€” แˆแˆ‰แŠ•แˆ แ‹ซแŠซแ‰ฐแ‰ฐ! โฐ
2kB immutable date library alternative to Moment.js with the same modern API.

แ‹ซแ‹˜แŒ‹แŒ€แ‹: @AppMinds_ET
01Day.js แˆแŠ•แ‹ตแŠ• แАแ‹? โ€” แˆˆแˆแŠ• Moment.js แŠ แŠ•แŒ แ‰€แˆแˆ?

Day.js โ€” JavaScript แˆ‹แ‹ญ Date แŠฅแŠ“ TimeแŠ• (แ‰€แŠ• แŠฅแŠ“ แˆฐแ‹“แ‰ตแŠ•) แˆˆแˆ›แˆตแ‰ฐแ‹ณแ‹ฐแˆญ แ‹จแˆšแ‹ซแŒˆแˆˆแŒแˆ แ‰€แˆˆแˆ แ‹ซแˆˆ (2KB!) library แАแ‹! Moment.js 200KB+ แˆฒแˆ†แŠ• Day.js แŒแŠ• แ‰ฐแˆ˜แˆณแˆณแ‹ญ API แ‹ญแ‹ž 2KB แ‰ฅแ‰ป แАแ‹! Immutable แˆตแˆˆแˆ†แА โ€” แ‹‹แŠ“แ‹ date object แŠ แ‹ญแ‰€แ‹จแˆญแˆแฃ แŠ แ‹ฒแˆต object แАแ‹ แ‹จแˆšแˆ˜แˆแˆฐแ‹แข
Parse any string/timestamp โ†’ format โ†’ manipulate โ†’ compare โ†’ timezone!

๐Ÿ“ฆ

npm install dayjs
import dayjs from 'dayjs' โ€” default 2KB ยท plugins แˆฒแŒจแˆ˜แˆฉ แ‰€แˆต แ‰ แ‰€แˆต แˆ˜แŒ แŠ‘ แ‹ญแŒจแˆแˆซแˆ

โŒ Moment.js โ€” 230KB (Deprecated!)
import moment from 'moment';
// โŒ 230KB แ‹จ bundle แˆ˜แŒ แŠ•!
// โŒ Mutable แАแ‹ โ€” แ‹‹แŠ“แ‹แŠ• แ‹ณแ‰ณ แ‹ญแ‰€แ‹ญแˆจแ‹‹แˆ (side effects แŠ แˆˆแ‹)!
// โŒ Tree-shaking แ‹จแˆˆแ‹แˆ!
// โŒ แŠจ 2020 แŒ€แˆแˆฎ Deprecated แˆ†แŠ—แˆ!

moment().format('YYYY-MM-DD');
moment().add(7, 'days');
moment().fromNow();
โœ… Day.js โ€” 2KB ยท แ‰ฐแˆ˜แˆณแˆณแ‹ญ API!
import dayjs from 'dayjs';
// โœ… 2KB แ‰ฅแ‰ป แАแ‹!
// โœ… Immutable แАแ‹ โ€” pure functions แ‹ญแŒ แ‰€แˆ›แˆ!
// โœ… แ‹จ Plugin แŠ แˆฐแˆซแˆญ แŠ แˆˆแ‹!
// โœ… แŠ แˆแŠ•แˆ Active development แˆ‹แ‹ญ แАแ‹!

dayjs().format('YYYY-MM-DD');
dayjs().add(7, 'day');
dayjs().fromNow();
02โฐ แ‹จแ‰€แŒฅแ‰ณ แˆฐแ‹“แ‰ต โ€” dayjs() Live Demo
--:--:--
Loading...
โ€” Day.js โฐ โ€”
Unix: ...
Yearโ€”
Monthโ€”
Dayโ€”
DOWโ€”
DOYโ€”
Quarterโ€”
dayjs() API โ€” แˆฐแ‹“แ‰ฑแŠ• แŠจ JS แˆ›แ‹แŒฃแ‰ต
clock.ts
const now = dayjs();

now.year()     // โ†’ 2026 (แ‹“แˆ˜แ‰ฑแŠ• แ‹ซแ‹ˆแŒฃแˆ)
now.month()    // โ†’ 0-11 (0=Jan) (แ‹ˆแˆฉแŠ• แ‹ซแ‹ˆแŒฃแˆ)
now.date()     // โ†’ 1-31 (แ‰€แŠ‘แŠ• แ‹ซแ‹ˆแŒฃแˆ)
now.day()      // โ†’ 0-6 (0=Sun) (แ‹จแˆณแˆแŠ•แ‰ฑแŠ• แ‰€แŠ• แ‹ซแ‹ˆแŒฃแˆ)
now.hour()     // โ†’ 0-23 (แˆฐแ‹“แ‰ฑแŠ• แ‹ซแ‹ˆแŒฃแˆ)
now.minute()   // โ†’ 0-59 (แ‹ฐแ‰‚แ‰ƒแ‹แŠ• แ‹ซแ‹ˆแŒฃแˆ)
now.second()   // โ†’ 0-59 (แˆฐแŠจแŠ•แ‹ฑแŠ• แ‹ซแ‹ˆแŒฃแˆ)
now.unix()     // โ†’ timestamp (แ‰ แˆฐแŠจแŠ•แ‹ต)
now.valueOf()  // โ†’ ms timestamp (แ‰ แˆšแˆŠแˆฐแŠจแŠ•แ‹ต)
now.toDate()   // โ†’ JS Date object แ‹ญแˆ˜แˆแˆณแˆ
now.toISOString() // โ†’ ISO 8601 แŽแˆญแˆ›แ‰ต แ‹ญแˆ˜แˆแˆณแˆ
03๐Ÿ“ Parse ยท Format ยท Manipulate โ€” แ‹‹แŠ“แ‹Žแ‰น แ‹จ Day.js APIแ‹Žแ‰ฝ
dayjs-core.ts
CORE API
๐Ÿ” Parse (แˆ›แŠ•แ‰ แ‰ฅ)
๐Ÿ“‹ Format (แ‰…แˆญแ… แˆ˜แ‰€แ‹จแˆญ)
โš™๏ธ Manipulate (แˆ›แˆตแ‰ฐแŠซแŠจแˆ)
โš–๏ธ Compare (แˆ›แ‹ˆแ‹ณแ‹ฐแˆญ)
โฑ Diff (แˆแ‹ฉแАแ‰ต)

dayjs() โ€” แˆ›แŠ•แŠ›แ‹แŠ•แˆ แ‹“แ‹ญแАแ‰ต Date แ‹ˆแ‹ฐ Day.js object แˆ˜แ‰€แ‹จแˆญ (Parse แˆ›แ‹ตแˆจแŒ)! String แฃ Timestamp แฃ JS Date แฃ แˆแˆ‰แˆ แ‹ญแˆฐแˆซแˆ‰!

parse.ts
// ๐Ÿ“… แ‹›แˆฌแŠ• แˆˆแˆ›แŒแŠ˜แ‰ต
dayjs()                         // โ†’ แŠ แˆแŠ• แ‹ซแˆˆแ‹แŠ• แˆฐแ‹“แ‰ต แ‹ญแˆ˜แˆแˆณแˆ
new Date()                      // แŠจ JS Date แŒ‹แˆญ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แАแ‹

// ๐Ÿ“ String parse แˆˆแˆ›แ‹ตแˆจแŒ
dayjs('2026-05-16')            // ISO date
dayjs('2026-05-16T10:30:00')  // ISO datetime
dayjs('2026-01-01')            // แŠ แ‹ฒแˆต แ‹“แˆ˜แ‰ต

// ๐Ÿ”ข Unix Timestamp แˆˆแˆ›แŠ•แ‰ แ‰ฅ
dayjs(1715817600000)           // แ‰ แˆšแˆŠแˆฐแŠจแŠ•แ‹ต (milliseconds)
dayjs.unix(1715817600)         // แ‰ แˆฐแŠจแŠ•แ‹ต (seconds)

// ๐Ÿ“ฆ JS Date objectแŠ• แ‹ˆแ‹ฐ Day.js แˆˆแˆ˜แ‰€แ‹จแˆญ
dayjs(new Date(2026, 4, 16))  // แ‹ˆแˆญ แŠจ 0 แˆตแˆˆแˆšแŒ€แˆแˆญ 4 แˆ›แˆˆแ‰ต May แАแ‹

// ๐ŸŽฏ Object parse แˆˆแˆ›แ‹ตแˆจแŒ (Plugin แˆŠแ‹ซแˆตแˆแˆแŒˆแ‹ แ‹ญแ‰ฝแˆ‹แˆ)
dayjs({ year:2026, month:4, day:16,
        hour:10, minute:30 })

// โœ… แ‰ตแŠญแŠญแˆˆแŠ› Date แˆ˜แˆ†แŠ‘แŠ• แˆˆแˆ›แˆจแŒ‹แŒˆแŒฅ (Is Valid?)
dayjs('2026-bad').isValid()   // โ†’ false
dayjs('2026-05-16').isValid() // โ†’ true

format() โ€” DateแŠ• แ‹ˆแ‹ฐ แˆแˆˆแŒ‹แ‰ฝแˆแ‰ต string แŽแˆญแˆ›แ‰ต แˆ˜แ‰€แ‹จแˆญ! Format tokens แ‰ แˆ˜แŒ แ‰€แˆ แ‰ แ‰€แˆ‹แˆ‰ แˆ›แˆตแ‰ฐแŠซแŠจแˆ แ‹ญแ‰ปแˆ‹แˆ!

format.ts
const d = dayjs('2026-05-16T10:30:45');

d.format('YYYY-MM-DD')       // '2026-05-16'
d.format('DD/MM/YYYY')       // '16/05/2026'
d.format('MMMM D, YYYY')    // 'May 16, 2026'
d.format('ddd, MMM D')       // 'Sat, May 16'
d.format('HH:mm:ss')         // '10:30:45'
d.format('h:mm A')            // '10:30 AM'
d.format('x')                 // Unix ms timestamp
d.format('Q')                 // '2' (Quarter/แˆฉแ‰ฅ แ‹“แˆ˜แ‰ต)
d.toISOString()               // ISO 8601 string
TokenแˆแˆณแˆŒแ‰ตแˆญแŒ‰แˆ
YYYY20264-digit year (แ‹“แˆ˜แ‰ฐ แˆแˆ…แˆจแ‰ต)
MM052-digit month (01-12) (แ‹ˆแˆญ)
MMMMMayFull month name (แ‹จแ‹ˆแˆฉ แˆ™แˆ‰ แˆตแˆ)
DD162-digit day (01-31) (แ‰€แŠ•)
dddSatShort weekday (แ‹จแˆณแˆแŠ•แ‰ฑ แ‰€แŠ• แ‰ แŠ แŒญแˆฉ)
ddddSaturdayFull weekday (แ‹จแˆณแˆแŠ•แ‰ฑ แ‰€แŠ• แ‰ แˆ™แˆ‰)
HH1024-hour (00-23) (แ‰ 24 แˆฐแ‹“แ‰ต แŽแˆญแˆ›แ‰ต)
hh1012-hour (01-12) (แ‰ 12 แˆฐแ‹“แ‰ต แŽแˆญแˆ›แ‰ต)
mm30Minutes (00-59) (แ‹ฐแ‰‚แ‰ƒ)
ss45Seconds (00-59) (แˆฐแŠจแŠ•แ‹ต)
AAM/PMMeridiem upper (แŒ แ‹‹แ‰ต/แŠจแˆฐแ‹“แ‰ต)
x1747388400000Unix ms (แ‰ แˆšแˆŠแˆฐแŠจแŠ•แ‹ต)

Immutable โ€” add/subtract/set แˆแˆ‰แˆ แŠ แ‹ฒแˆต Day.js object แАแ‹ แ‹จแˆšแˆ˜แˆแˆฑแ‰ต! Original แ‹ณแ‰ณแ‹ แŠ แ‹ญแ‰€แ‹จแˆญแˆ! Like strings in JS โ€” always returns new value.

manipulate.ts
const today = dayjs(); // immutable แАแ‹!

// โž• add() (แˆˆแˆ˜แŒจแˆ˜แˆญ)
today.add(1, 'day')          // แАแŒˆ
today.add(1, 'week')         // แŠจ 1 แˆณแˆแŠ•แ‰ต แ‰ แŠ‹แˆ‹
today.add(3, 'month')        // แŠจ 3 แ‹ˆแˆญ แ‰ แŠ‹แˆ‹
today.add(1, 'year')         // แŠจ 1 แ‹“แˆ˜แ‰ต แ‰ แŠ‹แˆ‹
today.add(90, 'minute')      // แŠจ 90 แ‹ฐแ‰‚แ‰ƒ แ‰ แŠ‹แˆ‹

// โž– subtract() (แˆˆแˆ˜แ‰€แАแˆต)
today.subtract(7, 'day')     // แŠจ 7 แ‰€แŠ• แ‰ แŠแ‰ต
today.subtract(6, 'month')   // แŠจ 6 แ‹ˆแˆญ แ‰ แŠแ‰ต

// ๐Ÿ“ startOf ยท endOf (แˆ˜แŒ€แˆ˜แˆชแ‹ซ แŠฅแŠ“ แˆ˜แŒจแˆจแˆป แˆˆแˆ›แŒแŠ˜แ‰ต)
today.startOf('month')       // โ†’ แ‹จแ‹ˆแˆฉ แˆ˜แŒ€แˆ˜แˆชแ‹ซ (May 1)
today.endOf('month')         // โ†’ แ‹จแ‹ˆแˆฉ แˆ˜แŒจแˆจแˆป (May 31)
today.startOf('week')        // โ†’ แ‹จแˆณแˆแŠ•แ‰ฑ แˆ˜แŒ€แˆ˜แˆชแ‹ซ (Sunday)
today.startOf('year')        // โ†’ แ‹จแ‹“แˆ˜แ‰ฑ แˆ˜แŒ€แˆ˜แˆชแ‹ซ (Jan 1)

// โœ๏ธ set() (แ‹จแ‰ฐแ‹ˆแˆฐแАแ‹แŠ• แŠญแแˆ แ‰ฅแ‰ป แˆˆแˆ˜แ‰€แ‹จแˆญ)
today.set('hour', 9)          // โ†’ แˆฐแ‹“แ‰ฑแŠ• แ‹ˆแ‹ฐ 09:00 แ‹ญแ‰€แ‹ญแˆซแˆ
today.set('date', 1)          // โ†’ แ‰€แŠ‘แŠ• แ‹ˆแ‹ฐ 1 แ‹ญแ‰€แ‹ญแˆซแˆ

// โ›“๏ธ Chain แˆ›แ‹ตแˆจแŒ (แˆ›แ‹ซแ‹ซแ‹) แ‹ญแ‰ปแˆ‹แˆ!
dayjs().add(1,'month').startOf('month').format('YYYY-MM-DD')

isBefore ยท isAfter ยท isSame โ€” DatesแŠ• แˆ›แ‹ˆแ‹ณแ‹ฐแˆชแ‹ซ! Deadline แฃ Age check แฃ Date range โ€” แˆˆแˆแˆ‰แˆ แ‹ซแŒˆแˆˆแŒแˆ‹แˆ!

compare.ts
const a = dayjs('2026-01-01');
const b = dayjs('2026-12-31');

// โš–๏ธ Comparison (แˆ›แ‹ˆแ‹ณแ‹ฐแˆญ)
a.isBefore(b)                  // โ†’ true (a แŠจ b แ‰ แŠแ‰ต แАแ‹)
a.isAfter(b)                   // โ†’ false (a แŠจ b แ‰ แŠ‹แˆ‹ แŠ แ‹ญแ‹ฐแˆˆแˆ)
a.isSame(b)                    // โ†’ false (แŠฅแŠฉแˆ แŠ แ‹ญแ‹ฐแˆ‰แˆ)
a.isSame(b, 'year')            // โ†’ true (แ‹“แˆ˜แ‰ณแ‰ธแ‹ แŠ แŠ•แ‹ต แАแ‹!)
a.isBefore(b, 'month')        // โ†’ true (แ‰ แ‹ˆแˆญ แˆฒแ‹ˆแ‹ณแ‹ฐแˆญ a แ‹ญแ‰€แ‹ตแˆ›แˆ)

// โœ… isBetween (แˆ˜แŠซแŠจแˆ แˆ˜แˆ†แŠ‘แŠ• แˆˆแˆ›แˆจแŒ‹แŒˆแŒฅ - plugin แ‹ซแˆตแˆแˆแŒˆแ‹‹แˆ)
import isBetween from 'dayjs/plugin/isBetween';
dayjs.extend(isBetween);

const check = dayjs('2026-06-15');
check.isBetween(a, b)           // โ†’ true (แ‰  a แŠฅแŠ“ b แˆ˜แŠซแŠจแˆ แАแ‹)
check.isBetween(a, b, 'month') // แ‰ แ‹ˆแˆญ แ‹ฐแˆจแŒƒ แˆ›แ‹ˆแ‹ณแ‹ฐแˆญ

// ๐Ÿ“… Real use: Deadline check (แ‹จแŒŠแ‹œ แŒˆแ‹ฐแ‰ฅ แˆ›แˆจแŒ‹แŒˆแŒซ)
const deadline = dayjs('2026-12-31');
const isPassed = dayjs().isAfter(deadline); // แŒŠแ‹œแ‹ แŠ แˆแแˆ?
const daysLeft = deadline.diff(dayjs(), 'day'); // แˆตแŠ•แ‰ต แ‰€แŠ• แ‰€แˆจแ‹?

diff() โ€” แ‹จแˆแˆˆแ‰ต Dates แˆแ‹ฉแАแ‰ต! แ‰ แ‹“แˆ˜แ‰ต แฃ แ‰ แ‹ˆแˆญ แฃ แ‰ แ‰€แŠ• แฃ แ‰ แˆฐแ‹“แ‰ต โ€” แ‰ แˆแˆ‰แˆ แ‹“แ‹ญแАแ‰ต แˆ˜แˆˆแŠซแ‰ต แ‹ญแ‰ปแˆ‹แˆ!

diff.ts
const start = dayjs('2026-01-01');
const end   = dayjs('2026-05-16');

// diff(date2, unit, float?)
end.diff(start, 'day')          // โ†’ 135 days (แ‹จแ‰€แŠ• แˆแ‹ฉแАแ‰ต)
end.diff(start, 'month')        // โ†’ 4 months (แ‹จแ‹ˆแˆญ แˆแ‹ฉแАแ‰ต)
end.diff(start, 'week')         // โ†’ 19 weeks (แ‹จแˆณแˆแŠ•แ‰ต แˆแ‹ฉแАแ‰ต)
end.diff(start, 'hour')         // โ†’ 3240 hours (แ‹จแˆฐแ‹“แ‰ต แˆแ‹ฉแАแ‰ต)
end.diff(start, 'year')         // โ†’ 0 years (แ‰ฐแˆ˜แˆณแˆณแ‹ญ แ‹“แˆ˜แ‰ต แˆตแˆˆแˆ†แА)
end.diff(start, 'month', true)  // โ†’ 4.5 (float/แАแŒฅแ‰ฅ แˆฒแ‹ซแˆตแˆแˆแŒ)

// ๐ŸŽ‚ Age Calculator (แ‹•แ‹ตแˆœ แˆ›แˆตแ‹ซ)
const birth = dayjs('2000-05-16');
const age = dayjs().diff(birth, 'year');
console.log(`แ‹•แ‹ตแˆœ: ${age} แ‹“แˆ˜แ‰ต`);     // 26

// ๐Ÿ“ฆ Duration Plugin (แ‹จแ‰†แ‹ญแ‰ณ แŒŠแ‹œ แ•แˆˆแŒŠแŠ•)
import duration from 'dayjs/plugin/duration';
dayjs.extend(duration);
const dur = dayjs.duration(135, 'days');
dur.asHours()   // โ†’ 3240 (แ‹ˆแ‹ฐ แˆฐแ‹“แ‰ต แˆฒแ‰€แ‹จแˆญ)
dur.humanize()  // โ†’ '4 months' (แˆฐแ‹ แˆŠแ‹ซแАแ‰ แ‹ แ‰ แˆšแ‰ฝแˆ แˆ˜แˆแŠฉ)
04๐ŸŽฎ Date Calculator โ€” แ‰€แŒฅแ‰ณ แˆžแŠญแˆฉแ‰ต!
โš™๏ธ Day.js Calculator โ€” Date Manipulation Live
โš–๏ธ Date Diff (แˆแ‹ฉแАแ‰ต)
โž• Add / Subtract (แˆ˜แŒจแˆ˜แˆญ/แˆ˜แ‰€แАแˆต)
๐Ÿ“‹ Format (แ‰…แˆญแ…)
๐Ÿ• Relative Time (แŠ แŠ•แƒแˆซแ‹Š แŒŠแ‹œ)
๐Ÿ“… Date 1
๐Ÿ“… Date 2
๐Ÿ“ Unit
๐Ÿ“… Dates แˆแˆจแŒก โ†’ Calculate แŒ แ‰… แŠ แ‹ตแˆญแŒ‰!
05๐Ÿ”Œ Plugins โ€” Day.js แˆ›แˆตแ‹แŠแ‹ซแ‹Žแ‰ฝ

Day.js แ‹‹แŠ“ package แ‰€แˆˆแˆ แ‹ซแˆˆ แŠฅแŠ“ แ‰ตแŠ•แˆฝ แАแ‹! แ‰ฐแŒจแˆ›แˆช Features แˆฒแ‹ซแˆตแˆแˆแŒ‹แ‰ฝแˆ plugin แ‰ตแŒจแˆแˆซแˆ‹แ‰ฝแˆ โ€” แ‹ซ แ‰ฅแ‰ป แАแ‹! Tree-shaking แ‹ญแ‹ฐแŒแ‹แˆ โœ…

๐Ÿ•
relativeTime
dayjs/plugin/relativeTime
"2 hours ago", "in 3 days" โ€” แˆฐแ‹ แˆŠแ‹ซแАแ‰ แ‹ แ‹จแˆšแ‰ฝแˆ แ‹จแŒŠแ‹œ แŠ แŒˆแˆ‹แˆˆแ…!
dayjs.extend(relativeTime)
dayjs('2026-01-01').fromNow()
// โ†’ "4 months ago"
dayjs().to(deadline)
// โ†’ "in 7 months"
๐ŸŒ
timezone + utc
dayjs/plugin/timezone
Timezone convert แˆˆแˆ›แ‹ตแˆจแŒ! Africa/Addis_Ababa โ†” UTC โ†” America/New_York!
dayjs().tz('Africa/Addis_Ababa')
dayjs().utc()
dayjs.tz('2026-05-16', 'Africa/...')
// โ†’ EAT +03:00
๐Ÿ“…
isBetween
dayjs/plugin/isBetween
Date range แ‹แˆตแŒฅ แˆ˜แˆ†แŠ‘แŠ• แˆˆแˆ›แˆจแŒ‹แŒˆแŒฅ? โ€” แˆˆ Event schedules, booking systems!
dayjs.extend(isBetween)
d.isBetween(start, end)
d.isBetween(a, b, 'month')
// โ†’ true / false
๐Ÿ“
duration
dayjs/plugin/duration
Duration object! แˆˆ Countdown timers, interval calculations!
dayjs.extend(duration)
dayjs.duration(2, 'hours')
.asMinutes() // โ†’ 120
.humanize() // โ†’ '2 hours'
๐Ÿ“†
weekOfYear
dayjs/plugin/weekOfYear
แ‹“แˆ˜แ‰ฑ แˆตแŠ•แ‰ฐแŠ› แˆณแˆแŠ•แ‰ต แˆ‹แ‹ญ แАแ‹? แˆˆ Calendars, analytics dashboards!
dayjs.extend(weekOfYear)
dayjs('2026-05-16').week()
// โ†’ 20 (week 20 of 2026)
๐Ÿ“
customParseFormat
dayjs/plugin/customParseFormat
Custom string format parse แˆˆแˆ›แ‹ตแˆจแŒ! แˆˆ Ethiopian dates, non-ISO formats!
dayjs.extend(customParseFormat)
dayjs('16-05-2026', 'DD-MM-YYYY')
dayjs('May 16 2026', 'MMM D YYYY')
06๐Ÿ• Relative Time โ€” fromNow() Live Demo

relativeTime plugin โ†’ fromNow() / to() โ€” Dates แˆฐแ‹ แˆŠแ‹ซแАแ‰ แ‹ แ‹ˆแ‹ฐแˆšแ‰ฝแˆ แ‰‹แŠ•แ‰‹ แ‹ญแ‰€แ‹ญแˆซแˆ! Social media แฃ Comments แฃ Timestamps โ€” แˆˆแˆแˆ‰แˆ แ‹ซแŒˆแˆˆแŒแˆ‹แˆ!

โช แ‹ซแˆˆแˆ แŒŠแ‹œ (Past)แ‹›แˆฌ (Now)แ‹ˆแ‹ฐแŠแ‰ต (Future) โฉ
DATE
โ€”
โ†’
fromNow()
โ€”
|
DIFF
โ€”
relativeTime.ts
import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(relativeTime);

dayjs().fromNow()                    // โ†’ 'a few seconds ago'
dayjs().subtract(5,'min').fromNow()  // โ†’ '5 minutes ago'
dayjs().subtract(2,'hour').fromNow() // โ†’ '2 hours ago'
dayjs().subtract(3,'day').fromNow()  // โ†’ '3 days ago'
dayjs().add(1,'week').fromNow()      // โ†’ 'in 7 days'
dayjs().add(3,'month').fromNow()    // โ†’ 'in 3 months'

// to() โ€” แŠจแŠ แŠ•แ‹ต date แŠ แŠ•แƒแˆญ แ‹จแˆŒแˆ‹แ‹แŠ• แŒŠแ‹œ แˆˆแˆ›แ‹ˆแ‰…
const deadline = dayjs('2026-12-31');
dayjs().to(deadline)                  // โ†’ 'in 7 months'
07โšก Production Ready โ€” แˆ™แˆ‰ แˆแˆณแˆŒ
dateUtils.ts โ€” แ‰ แˆแˆ‰แˆ แ‰ฆแ‰ณ แ‹จแˆแŠ•แŒ แ‰€แˆ›แ‰ธแ‹ utils
import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
import timezone   from 'dayjs/plugin/timezone';
import utc        from 'dayjs/plugin/utc';
import duration   from 'dayjs/plugin/duration';

dayjs.extend(relativeTime);
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.extend(duration);

// 1๏ธโƒฃ Display โ€” Post timestamp (แŠฅแŠ•แ‹ฐ Twitter/Facebook style)
export const timeAgo = (date: string) =>
  dayjs(date).fromNow();
// '2026-05-16T08:00:00' โ†’ '2 hours ago'

// 2๏ธโƒฃ Format โ€” Ethiopian date display (แ‰€แŠ• แŠฅแŠ“ แˆฐแ‹“แ‰ต แˆ›แˆณแ‹ซ)
export const formatEt = (date: string) =>
  dayjs(date).format('MMMM D, YYYY ยท HH:mm');
// โ†’ 'May 16, 2026 ยท 10:30'

// 3๏ธโƒฃ Age calculator (แ‹•แ‹ตแˆœ แˆ›แˆตแ‹ซ)
export const calcAge = (birth: string) =>
  dayjs().diff(dayjs(birth), 'year');

// 4๏ธโƒฃ Deadline check (แ‹จแŒŠแ‹œ แŒˆแ‹ฐแ‰ฅ แˆ›แˆจแŒ‹แŒˆแŒซ)
export const deadlineInfo = (deadline: string) => ({
  isPassed: dayjs().isAfter(dayjs(deadline)),
  daysLeft: dayjs(deadline).diff(dayjs(), 'day'),
  label:    dayjs().to(dayjs(deadline)),
});

// 5๏ธโƒฃ Timezone convert (EAT โ†” UTC)
export const toEAT = (utcDate: string) =>
  dayjs.utc(utcDate).tz('Africa/Addis_Ababa').format('HH:mm');

// 6๏ธโƒฃ Date range for calendar (แˆˆแŠซแˆ‹แŠ•แ‹ฐแˆญ แ‹จแˆšแˆ†แŠ‘ แ‰€แŠ“แ‰ตแŠ• แˆ›แ‹แŒฃแ‰ต)
export const getMonthDays = (year: number, month: number) => {
  const start = dayjs().year(year).month(month).startOf('month');
  const end   = start.endOf('month');
  const days  = [];
  let cur = start;
  while (cur.isBefore(end) || cur.isSame(end, 'day')) {
    days.push(cur.format('YYYY-MM-DD'));
    cur = cur.add(1, 'day');
  }
  return days; // แ‰ แ‹ˆแˆฉ แ‹แˆตแŒฅ แ‹ซแˆ‰แ‰ตแŠ• แ‰€แŠ“แ‰ต แ‰ แˆ™แˆ‰ แ‹ญแˆ˜แˆแˆณแˆ
};
๐Ÿ“ŒแŒ แ‰…แˆˆแˆ แ‹ซแˆˆ แˆ›แˆตแ‰ณแ‹ˆแˆป
1
๐Ÿ“ฆ 2KB โ€” Moment.js แŠ• แ‰ฐแŠซ!

Moment.js 230KB แˆฒแˆ†แŠ• Day.js 2KB แАแ‹! Immutable แАแ‹ โ€” add(), subtract() แˆแˆ‰แˆ แŠ แ‹ฒแˆต object แ‹ญแˆ˜แˆแˆณแˆ‰! Original แ‹ณแ‰ณแ‹ แŠ แ‹ญแ‰€แ‹จแˆญแˆ โ€” แˆตแˆ…แ‰ฐแ‰ต แŠ แ‹ญแˆแŒ แˆญแˆ!

dayjs() is chainable: dayjs().add(1,'d').subtract(2,'h').format('...')
2
๐Ÿ“ format() โ€” Display แˆแˆ‰!

YYYY-MM-DD ยท HH:mm:ss ยท MMMM D, YYYY โ€” แ‹จแˆแˆˆแŒ‹แ‰ฝแˆแ‰ตแŠ• format tokens แŠ แ‰€แˆ‹แ‰…แˆ‰! API responses แˆแˆŒ ISO 8601 แˆ˜แˆ†แŠ• แŠ แˆˆแ‰ฃแ‰ธแ‹ โ€” Display แˆฒแˆ†แŠ• format() แ‰ฐแŒ แ‰€แˆ™!

Always store dates in ISO 8601 (UTC), only format for display.
3
๐Ÿ• relativeTime Plugin โ€” Social UX!

fromNow() = "2 minutes ago" แฃ to() = "in 3 months"! แˆˆ Comments แฃ Post timestamps แฃ Countdown โ€” แˆˆแˆแˆ‰แˆ แ‹ซแŒˆแˆˆแŒแˆ‹แˆ! Plugin แˆ˜แŒจแˆ˜แˆญ แ‰ฅแ‰ป แАแ‹ แ‹จแˆšแŒ แ‰ แ‰…แ‰ฃแ‰ฝแˆ!

dayjs.extend(relativeTime) โ€” once at app entry, use everywhere.
4
โš–๏ธ diff() โ€” แ‹จแˆแ‹ฉแАแ‰ต แˆตแˆŒแ‰ต!

dayjs(end).diff(start, 'day') โ€” Age แฃ Deadline days left แฃ Duration โ€” แˆˆแˆแˆ‰แˆ แ‹ญแˆฐแˆซแˆ! float: true แˆฒแ‰€แˆ˜แŒฅ decimal (แАแŒฅแ‰ฅ) แ‹ญแˆฐแŒ แŠ“แˆ!

Positive = end is after start ยท Negative = end is before start.
5
๐ŸŒ Timezone โ€” Global Apps!

EAT (Ethiopia +03:00)แฃ UTC แฃ US timezones โ€” timezone + utc plugins แ‹ซแˆตแˆแˆแŒ‰แ‰ณแˆ! API แˆแˆŒ UTC แˆ˜แˆ†แŠ• แŠ แˆˆแ‰ แ‰ต แฃ Display แˆฒแˆ†แŠ• แ‹ˆแ‹ฐ user timezone convert แ‹ญแ‹ฐแˆจแŒ‹แˆ!

dayjs.utc(isoString).tz('Africa/Addis_Ababa').format('HH:mm')
๐ŸŽฏแˆˆแ‹•แ‹แ‰€แ‰ต แˆ˜แˆแ‰ฐแŠ› Quiz!
โ“ Day.js แ‹แˆตแŒฅ add() method แˆแŠ• แ‹ญแˆ˜แˆแˆณแˆ?
What does the add() method return in Day.js?
A
แ‹‹แŠ“แ‹ Date object แ‹ญแ‰€แ‹ญแˆญแŠ“ แˆแŠ•แˆ แŠ แ‹ญแˆ˜แˆแˆตแˆ (Mutates and returns undefined)
B
แŠ แ‹ฒแˆต Day.js object แ‹ญแˆแŒฅแˆญแŠ“ แ‹ญแˆ˜แˆแˆณแˆ โ€” Original แ‹ณแ‰ณแ‹ แŠ แ‹ญแ‰€แ‹จแˆญแˆ! (Immutable) โœ…
C
JavaScript Date object แ‹ญแˆ˜แˆแˆณแˆ
D
String format แˆฐแŒฅแ‰ถ แ‹ญแˆ˜แˆแˆณแˆ