آموزش جامع Moment.js
محبوبترین کتابخانه تاریخ و زمان جاوااسکریپت — parse، format، محاسبه و locale.
📚معرفی و نصب
Moment.js محبوبترین کتابخانه کار با تاریخ و زمان در جاوااسکریپت است. با وجود اینکه در پروژههای جدید Day.js توصیه میشود، Moment هنوز در میلیونها پروژه استفاده میشود و دانستن آن ضروری است.
<!-- با locales (پشتیبانی از همه زبانها) --> <script src="moment-with-locales.min.js"></script> <!-- فقط انگلیسی (سبکتر) --> <script src="moment.min.js"></script>
ساعت زنده
--:--:--
⚠ نکته: Moment.js در حالت Legacy Mode قرار دارد — برای پروژههای جدید Day.js یا date-fns توصیه میشود. اما برای نگهداری پروژههای موجود هنوز کاملاً معتبر است.
🔧Parse و ساخت تاریخ
// تاریخ فعلی moment() // از رشته ISO moment('2024-03-15') moment('2024-03-15T14:30:00') // با فرمت مشخص moment('15/03/2024', 'DD/MM/YYYY') moment('1402-12-25', 'YYYY-MM-DD') // از timestamp moment(1710504000000) // میلیثانیه moment.unix(1710504000) // ثانیه // از Date moment(new Date()) // اعتبارسنجی moment('2024-03-15').isValid() // true moment('foo').isValid() // false // تبدیل برگشتی moment().toDate() // Date object moment().toISOString() // ISO string moment().valueOf() // timestamp ms moment().unix() // timestamp ثانیه
▶ دمو: Parse
// نتیجه اینجا...
🎨Format — جدول توکنها
| توکن | توضیح | مثال |
|---|
▶ Format Builder — فرمت دلخواه بسازید
📋Get و Set
const m = moment('2024-03-15T14:30:45'); // Get m.year() // 2024 m.month() // 2 (از 0 — مارس = 2) m.date() // 15 (روز ماه) m.day() // 5 (جمعه — 0=یکشنبه) m.hour() // 14 m.minute() // 30 m.second() // 45 m.daysInMonth() // 31 m.dayOfYear() // روز سال m.week() // شماره هفته سال // Set (زنجیری) moment().year(2025).month(0).date(1).format('YYYY-MM-DD') // → "2025-01-01"
▶ دمو: Get
// نتیجه اینجا...
➕Add و Subtract
const now = moment(); // اضافه کردن now.add(7, 'days') // یا 'd' now.add(2, 'months') // یا 'M' now.add(1, 'year') // یا 'y' now.add(3, 'hours') // یا 'h' now.add(30, 'minutes') // یا 'm' // کم کردن now.subtract(1, 'week') now.subtract(6, 'months') // startOf / endOf now.startOf('day') // ۰۰:۰۰:۰۰ امروز now.endOf('day') // ۲۳:۵۹:۵۹ امروز now.startOf('month') // اول ماه now.endOf('month') // آخر ماه now.startOf('year') // اول سال // ⚠️ Moment مutable است! برای کپی: const copy = now.clone().add(7, 'days');
▶ دمو: محاسبات تاریخ
// نتیجه اینجا...
⚖مقایسه و اعتبارسنجی
const a = moment('2024-01-01'); const b = moment('2024-06-15'); a.isBefore(b) // true b.isAfter(a) // true a.isSame(b) // false a.isSame(b, 'year') // true (هر دو ۲۰۲۴) a.isBetween('2023-01-01', '2025-01-01') // true a.isSameOrBefore(b) // true // اختلاف b.diff(a, 'days') // 166 b.diff(a, 'months') // 5 b.diff(a, 'years', true) // 0.454 (اعشاری) // اعتبارسنجی moment('2024-02-30').isValid() // false moment('not-a-date').isValid() // false
▶ دمو: مقایسه تعاملی
// تاریخها را انتخاب کنید...
🕐Relative Time
// از الان moment('2020-01-01').fromNow() // "4 years ago" moment().add(3, 'days').fromNow() // "in 3 days" // نسبت به تاریخ دیگر moment('2024-06-01').from('2024-01-01') // "5 months later" // بدون پیشوند "ago" moment('2020-01-01').fromNow(true) // "4 years" // با locale فارسی moment.locale('fa'); moment('2020-01-01').fromNow() // "۴ سال پیش"
▶ دمو: Relative Time
// نتیجه اینجا...
🏳Locale و فارسی
// تنظیم locale سراسری moment.locale('fa'); moment().format('MMMM D, YYYY') // "فروردین ۱۴, ۱۴۰۳" moment().format('dddd') // "شنبه" moment().fromNow() // "چند ثانیه پیش" // locale فقط برای یک instance moment().locale('ar').format('MMMM') // عربی // برگشتن به انگلیسی moment.locale('en'); // لیست locale های موجود moment.locales() // آرایه همه locale ها
▶ دمو: چند Locale مختلف
// نتیجه اینجا...
💡 تقویم شمسی: Moment.js بهصورت پیشفرض از تقویم میلادی استفاده میکند. با locale
fa فقط نام ماه و روز فارسی میشود. برای تبدیل واقعی به شمسی از پکیج moment-jalaali استفاده کنید.
⏳Duration
// ساخت Duration const d = moment.duration(2, 'hours'); const d2 = moment.duration({ hours:1, minutes:30, seconds:45 }); // خواندن مقادیر d.hours() // 2 d.asMinutes() // 120 d.asSeconds() // 7200 d.humanize() // "2 hours" // Duration از diff const diff = moment.duration( moment('2024-12-31').diff(moment()) ); diff.humanize() // "a few months" diff.days() // روزهای باقیمانده diff.hours() // ساعتهای باقیمانده // جمع duration ها d.add(30, 'minutes').asHours() // 2.5
▶ دمو: Duration
// نتیجه اینجا...
🔥نکات مهم
Mutable بودن Moment
// ⚠️ خطرناک — same object تغییر میکند const a = moment(); const b = a.add(7, 'days'); // a هم تغییر کرد! // ✓ درست — clone بگیرید const a = moment(); const b = a.clone().add(7, 'days');
مقایسه Moment در مقابل Day.js
| ویژگی | Moment.js | Day.js |
|---|---|---|
| حجم (gzip) | ~۷۰KB | ~۲KB |
| Immutable | ✗ خیر | ✓ بله |
| API | مشابه | مشابه |
| Locale فارسی | کامل داخلی | با پلاگین |
| وضعیت | Legacy | فعال |
💡 خلاصه Moment.js:
moment()— تاریخ فعلی.format('YYYY-MM-DD')— نمایش.add(n,'unit') / .subtract()— محاسبه.diff(other,'unit')— اختلاف.fromNow()— زمان نسبی.startOf/endOf('month')— ابتدا/انتها.clone()— کپی (چون mutable است!)moment.locale('fa')— فارسی
🚀زمین بازی کد (Playground)
کد Moment.js را اجرا کن و خروجی را در پنل کنسول ببین. parse/format، add/subtract و locale فارسی را امتحان کن. نسخهٔ ۲.۳۰.۱ (همراه locales) آفلاین بارگذاری میشود.