Moment.js



moment

Moment.js

أين يمكن استخدامه

تم تصميم لحظة للعمل في كل من المتصفح وفي Node.js.

يجب أن يعمل كل رمز في كل من هذه البيئات ، ويتم تشغيل جميع اختبارات الوحدة في كل من هذه البيئات.

يتم حاليًا استخدام المتصفحات التالية لنظام ci: Chrome على Windows XP و IE 8 و 9 و 10 على Windows 7 و IE 11 على Windows 10 وأحدث Firefox على نظام التشغيل Linux وأحدث Safari على OSX 10.8 و 10.11.

إذا كنت ترغب في تجربة رموز العينة أدناه ، فافتح وحدة تحكم المتصفح وأدخلها.

نود.جي إس

npm install moment
var moment = require('moment');
moment().format();

ملاحظة: في 2.4.0 ، تم إهمال كائن اللحظة الذي تم تصديره عالميًا. سيتم إزالته في الإصدار الرئيسي التالي.

المتصفح

<script src="moment.js"></script>
<script>
    moment().format();
</script>

Moment.js متاح على cdnjs.com وعلى jsDelivr .

كوخ ريفي

bower

bower install --save moment

الملفات البارزة هي moment.js ، locale/*.js و min/moment-with-locales.js .

Require.js

نوصي بشدة بقراءة this إذا كنت تخطط لاستخدام اللحظة مع Require.js. الترقية أيضًا إلى 2.14.0 أو أعلى للحصول على أفضل تجربة.

كبداية ، ربما تكون قد استمتعت بلحظة من خلال الكوخ أو node_modules أو أي شيء آخر يضع moment.js مع دليل لغات في مجلد أساسي. ثم يجب عليك استخدام أداة مثل adapt-pkg-main ، أو يدوياً - باستخدام حزم الحزم .

requirejs.config({
  packages: [{
    name: 'moment',
    // This location is relative to baseUrl. Choose bower_components
    // or node_modules, depending on how moment was installed.
    location: '[bower_components|node_modules]/moment'
    main: 'moment'
  }]
});

مع الإعداد أعلاه ، يمكنك أن تطلب النواة مع moment واللغة مع moment/locale/de .

// only needing core
define(['moment'], function (moment) {
    console.log(moment().format('LLLL'));  // 'Friday, June 24, 2016 1:42 AM'
});

// core with single locale
define(['moment', 'moment/locale/de'], function (moment) {
    moment.locale('de');
    console.log(moment().format('LLLL')); // 'Freitag, 24. Juni 2016 01:42'
});

// core with all locales
define(['moment/min/moment-with-locales'], function (moment) {
    moment.locale('de');
    console.log(moment().format('LLLL')); // 'Freitag, 24. Juni 2016 01:42'
});

// async load locale
define(['require', 'moment'], function(require, moment) {
  // Inside some module after the locale is detected. This is the
  // case where the locale is not known before module load time.
  require(['moment/locale/de'], function(localeModule) {
    // here the locale is loaded, but not yet in use
    console.log(moment().format('LLLL'));  // 'Friday, June 24, 2016 1:42 AM'

    moment.locale('de');
    // Use moment now that the locale has been properly set.
    console.log(moment().format('LLLL')); // 'Freitag, 24. Juni 2016 01:42'
  })
});

لمزيد من حالات الاستخدام المعقدة ، يرجى قراءة this .

ستستمر اللحظة في إنشاء moment عالمية ، وهي مفيدة للمكونات الإضافية ورمز الطرف الآخر. إذا كنت ترغب في noGlobal هذا noGlobal ، noGlobal خيار noGlobal في تهيئة الوحدة النمطية.

require.config({
    config: {
        moment: {
            noGlobal: true
        }
    }
});

إذا لم تقم بتحديد noGlobal اللحظة التي تم تصديرها عالميًا بطباعة تحذير حول الإيقاف. من الإصدار الرئيسي التالي ، سيكون عليك تصديره بنفسك إذا كنت تريد هذا السلوك.

بالنسبة للإصدار 2.5.x ، في حالة استخدام المكونات الإضافية الأخرى التي تعتمد على لحظة ولكنها ليست متوافقة مع AMD ، فقد تحتاج إلى إضافة wrapShim: true إلى r.js config الخاص بك.

ملاحظة: للسماح بتثبيت الإضافات moment.js في بيئات requiredjs ، يتم إنشاء اللحظة كوحدة نمطية مسماة. وبسبب هذا ، يجب تحميل اللحظة تمامًا مثل "moment" ، باستخدام paths لتحديد الدليل. سيؤدي طلب لحظة باستخدام مسار مثل "vendor\moment" إلى عرض undefined .

ملاحظة: بدءًا من الإصدار 2.9.0 ، تصدّر اللحظة نفسها كوحدة نمطية مجهولة ، لذلك إذا كنت تستخدم النواة فقط (بدون لغات / مكونات إضافية) ، فإنك لا تحتاج إلى تهيئة إذا قمت بوضعها في موقع غير قياسي.

NuGet

NuGet / Moment.js

Install-Package Moment.js

نيزك

meteor / atmosphere / momentjs:moment

meteor add momentjs:moment

Browserify

npm install moment
var moment = require('moment');
moment().format();

ملاحظة: يوجد خطأ يمنع moment.locale من التحميل.

var moment = require('moment');
moment.locale('cs');
console.log(moment.locale()); // en

استخدم الحل أدناه

var moment = require('moment');
require('moment/locale/cs');
console.log(moment.locale()); // cs

من أجل تضمين جميع اللغات

var moment = require('moment');
require("moment/min/locales.min");
moment.locale('cs');
console.log(moment.locale()); // cs

مطبوع 2.13.0 أو أكثر

اعتبارًا من الإصدار 2.13.0 ، يتضمن Moment ملف تعريف الطباعة .

التثبيت عبر NPM

npm install moment

الاستيراد والاستخدام في ملف Typescript الخاص بك

import * as moment from 'moment';


let now = moment().format('LLLL');

ملاحظة: إذا كنت تواجه مشكلة في استيراد اللحظة ، فجرّب إضافة "allowSyntheticDefaultImports": true في compilerOptions في ملف tsconfig.json ثم استخدم الصيغة

import moment from 'moment';

استيراد اللغة

لاستخدام moment.locale يجب أولاً استيراد اللغة التي تستهدفها.

import * as moment from 'moment';
import 'moment/locale/pt-br';


console.log(moment.locale()); // en
moment.locale('fr');
console.log(moment.locale()); // en
moment.locale('pt-BR');
console.log(moment.locale()); // pt-BR

System.js

لتحميل لحظة ، ضعها في المسار المحدد بواسطة System.config في تكوين baseURL. ثم قم باستيرادها إلى صفحتك.

<script src="system.js"></script>
<script>
  System.config({
    baseURL: '/app'
  });

  System.import('moment.js');
 </script>

إذا كنت بحاجة إلى لحظة لتحميلها على مستوى عالمي ، فيمكنك إجراء ذلك باستخدام تهيئة التعريف:

System.config({
  meta: {
    'moment': { format: 'global' }
  }
});

بدلاً من ذلك ، لتوفير لحظة كحالة عالمي إلى تبعية محددة فقط ، يمكنك القيام بذلك:

System.config({
  meta: {
    'path/to/global-file.js': {
      globals: {
        moment: 'moment'
      }
    }
  }
});

آخر

لاستخدامها أسفل Java / Rhino ، انظر هذه التعليمات .

لاستخدامها في Demandware ، راجع هذه الإرشادات .

استكشاف الأخطاء وإصلاحها

إذا كنت تواجه أي مشاكل ، فإن أول مكان يجب التحقق منه هو guides .

إذا لم تجد ما تبحث عنه هناك ، فحاول طرح سؤال على Stack Overflow مع علامة momentjs .

ملاحظة: يمكن الإجابة على أكثر من نصف المشكلات التي يتم مشاهدتها على Stack Overflow بواسطة مشاركة المدونة هذه .

يمكنك أيضًا استخدام أداة تعقب مشكلات GitHub للعثور على المشكلات ذات الصلة أو فتح مشكلة جديدة.

بالإضافة إلى ذلك ، يحتوي Moment على Gitter حيث يتوفر الفريق الداخلي بشكل متكرر.

للحصول على تعليمات عامة لاستكشاف الأخطاء وإصلاحها ، Stack Overflow هو المنتدى المفضل. يعمل مشرفو Moment بنشاط كبير على Stack Overflow ، وكذلك العديد من المستخدمين المطلعين. أسرع استجابة ستكون هناك.

تحليل

بدلاً من تعديل Date.prototype الأصلي ، ينشئ Moment.js مجمّعًا لعنصر Date . للحصول على كائن المجمّع هذا ، ما عليك سوى استدعاء moment() باستخدام أحد أنواع الإدخال المدعومة.

يتم الكشف عن النموذج Moment خلال moment.fn . إذا كنت ترغب في إضافة وظائفك الخاصة ، فهذا هو المكان الذي ستضعها فيه.

لسهولة الرجوع ، سيتم الإشارة إلى أي طريقة في Moment.prototype في المستندات كأسلوب moment#method . So Moment.prototype.format == moment.fn.format == moment#format .

الآن 1.0.0+

moment();
// From 2.14.0 onward, also supported
moment([]);
moment({});

للحصول على التاريخ والوقت الحالي ، ما عليك سوى استدعاء moment() بدون أي معلمات.

var now = moment();

هذا هو أساسا نفس moment(new Date()) الدعوة moment(new Date()) .

ملاحظة: من الإصدار 2.14.0 ، تعود moment([]) moment({}) الآن. اعتادوا على التقصير في بداية اليوم قبل 2.14.0 ، ولكن هذا كان تعسفيا لذلك تم تغييره.

سلسلة 1.0.0+

moment(String);

عند إنشاء لحظة من سلسلة ، نتحقق أولاً مما إذا كانت السلسلة تتطابق مع تنسيقات ISO 8601 المعروفة ، ثم نتحقق مما إذا كانت السلسلة تتطابق مع تنسيق وقت التاريخ RFC 2822 قبل الإسقاط إلى التراجع إلى new Date(string) إذا كان التنسيق المعروف هو غير معثور عليه.

var day = moment("1995-12-25");

تحذير: دعم المستعرض لسلاسل التوزيع غير متناسق . نظرًا لعدم وجود مواصفات على التنسيقات التي يجب دعمها ، لن يعمل ما يعمل في بعض المتصفحات في المتصفحات الأخرى.

للحصول على نتائج متناسقة لتحليل أي شيء بخلاف سلاسل ISO 8601 ، يجب استخدام String + Format .

سلاسل ISO 8601 المدعومة

تتطلب سلسلة ISO 8601 جزء تاريخ.

2013-02-08  # A calendar date part
2013-W06-5  # A week date part
2013-039    # An ordinal date part

20130208    # Basic (short) full date
2013W065    # Basic (short) week, weekday
2013W06     # Basic (short) week only
2013050     # Basic (short) ordinal date

يمكن أيضًا تضمين جزء الوقت ، مفصولة عن جزء التاريخ بمسافة أو حرف كبير.

2013-02-08T09            # An hour time part separated by a T
2013-02-08 09            # An hour time part separated by a space
2013-02-08 09:30         # An hour and minute time part
2013-02-08 09:30:26      # An hour, minute, and second time part
2013-02-08 09:30:26.123  # An hour, minute, second, and millisecond time part
2013-02-08 24:00:00.000  # hour 24, minute, second, millisecond equal 0 means next day at midnight

20130208T080910,123      # Short date and time up to ms, separated by comma
20130208T080910.123      # Short date and time up to ms
20130208T080910          # Short date and time up to seconds
20130208T0809            # Short date and time up to minutes
20130208T08              # Short date and time, hours only

أي جزء من أجزاء التاريخ يمكن أن يكون جزء من الوقت.

2013-02-08 09  # A calendar date part and hour time part
2013-W06-5 09  # A week date part and hour time part
2013-039 09    # An ordinal date part and hour time part

إذا تم تضمين جزء الوقت ، يمكن أيضًا تضمين إزاحة من التوقيت العالمي المنسق كـ +-HH:mm ، +-HHmm ، +-HH +-HHmm أو Z

2013-02-08 09+07:00            # +-HH:mm
2013-02-08 09-0100             # +-HHmm
2013-02-08 09Z                 # Z
2013-02-08 09:30:26.123+07:00  # +-HH:mm
2013-02-08 09:30:26.123+07     # +-HH

ملاحظة: تم إضافة الدعم المتقاطع التلقائي ISO-8601 في الإصدار 1.5.0 . تمت إضافة دعم للأشكال الأسبوعية والأشكال في الإصدار 2.3.0 .

إذا كانت إحدى السلاسل لا تتطابق مع أي من التنسيقات المذكورة أعلاه ولا يمكن تحليلها مع Date.parse ، Date.parse moment#isValid false.

moment("not a real date").isValid(); // false

تنسيق التاريخ RFC 2822

قبل تحليل تاريخ 2822 RFC يتم تنظيف السلسلة لإزالة أي تعليقات و / أو أحرف السطر الجديد. الأحرف الإضافية قانونية في التنسيق ولكن لا تضيف أي شيء لإنشاء مثيل لحظة صالح.

بعد التطهير ، يتم التحقق من صحة السلسلة في الأقسام التي تفصل بينها مسافات ، كل ذلك باستخدام اللغة الإنجليزية:

6 Mar 17 21:22 UT
6 Mar 17 21:22:23 UT
6 Mar 2017 21:22:23 GMT
06 Mar 2017 21:22:23 Z
Mon 06 Mar 2017 21:22:23 z
Mon, 06 Mar 2017 21:22:23 +0000
  1. يوم من الأسبوع في ثلاثة أحرف ، متبوعًا بفاصلة اختيارية. (اختياري)
  2. يوم من الشهر (رقم واحد أو رقمين) ، يتبعه شهر من ثلاثة أحرف وسنة أو أربعة أرقام
  3. يتم تحديد الساعات والدقائق المكونة من رقمين بواسطة نقطتين (:) ، متبوعة اختيارًا اختياريًا بنقطتين مختلفتين وثواني في رقمين
  4. المنطقة الزمنية أو الإزاحة بأحد التنسيقات التالية:

    1. UT: +0000
    2. GMT: +0000
    3. EST | CST MST | PST | EDT | CDT | MDT | PDT: المناطق الزمنية الأمريكية *
    4. أ - أنا | K - Z: المناطق الزمنية العسكرية *
    5. وقت الإزاحة +/- 9999

    [*] انظر القسم 4.3 من المواصفات للحصول على التفاصيل.

يؤكد المحلل اللغوي أيضًا أن يوم الأسبوع (عند تضمينه) متوافق مع التاريخ.

String + Format 1.0.0+

moment(String, String);
moment(String, String, String);
moment(String, String, Boolean);
moment(String, String, String, Boolean);

إذا كنت تعرف تنسيق سلسلة إدخال ، فيمكنك استخدام ذلك لتحليل لحظة.

moment("12-25-1995", "MM-DD-YYYY");

يتجاهل المحلل اللغوي الأحرف غير الأبجدية الرقمية ، لذا سيعود كل من التاليين إلى الشيء نفسه.

moment("12-25-1995", "MM-DD-YYYY");
moment("12/25/1995", "MM-DD-YYYY");

تشبه الرموز المميزة للتعبير الرموز المميزة بالتنسيقات المستخدمة في moment#format .

السنة والشهر واليوم الرموز

إدخال مثال وصف
YYYY 2014 4 أو 2 أرقام العام
YY 14 عدد 2 سنة
Y -25 السنة مع أي عدد من الأرقام والتوقيع
Q 1..4 ربع السنة. يعين الشهر إلى الشهر الأول في الربع.
M MM 1..12 رقم الشهر
MMM MMMM Jan..December اسم شهر باللغة المحلية تم تعيينه بواسطة moment.locale()
D DD 1..31 يوم من الشهر
Do 1st..31st يوم من الشهر مع ترتيبي
DDD DDDD 1..365 يوم من السنة
X 1410715640.579 الطابع الزمني يونيكس
x 1410715640579 يونيكس ms timestamp

YYYY من الإصدار 2.10.5 يدعم السنوات المكونة من 2 ، وتحولها إلى سنة قرب 2000 (مثل YY ).

تم إضافة Y في 2.11.1 . ستطابق أي رقم ، موقّع أو غير موقّع. ومن المفيد لسنوات ليست 4 أرقام أو قبل العصر المشترك. يمكن استخدامه لأي سنة.

أسبوع الأسبوع ، والأسبوع ، ورموز أيام الأسبوع

بالنسبة لهذه ، تستخدم الرموز المميزة الصغيرة أيام البدء الأسبوعية المحلية ، بينما تستخدم الرموز المميزة الكبيرة أيام بدء تاريخ ISO في الأسبوع .

إدخال مثال وصف
gggg 2014 لغة 4 أرقام أسبوع السنة
gg 14 اللغة رقم 2 الأسبوع الأسبوع
w ww 1..53 أسبوع اللغة من العام
e 0..6 يوم اللغة من الأسبوع
ddd dddd Mon...Sunday اسم اليوم في locale set by moment.locale()
GGGG 2014 ISO 4 أرقام في الأسبوع
GG 14 ISO 2 أرقام في الأسبوع
W WW 1..53 أسبوع ISO من السنة
E 1..7 ISO يوم من الأسبوع

ساعة ، دقيقة ، ثانية ، ميلي ثانية ، وإزاحة الرموز

إدخال مثال وصف
H HH 0..23 الساعات (24 ساعة)
h hh 1..12 الساعات (12 ساعة من الوقت المستخدم مع a A .)
k kk 1..24 الساعات (24 ساعة من 1 إلى 24 ساعة)
a A am pm Postid or ante meridiem (لاحظ أن الحرف الواحد ap يعتبر أيضًا صالحًا)
m mm 0..59 الدقائق
s ss 0..59 ثواني
S SS SSS 0..999 ثواني كسور
Z ZZ +12:00 الإزاحة من التوقيت العالمي المنسق كـ +-HH:mm ، +-HHmm ، أو Z

من الإصدار 2.10.5 : يمكن للقسمة الثانية الكسرية الثانية من 4 إلى 9 تحليل أي عدد من الأرقام ، ولكن لن تأخذ في الاعتبار إلا أعلى 3 (ميلي ثانية). استخدم إذا كان لديك الوقت المطبوع مع العديد من الأرقام الكسرية وترغب في استهلاك المدخلات.

لاحظ أن عدد الأحرف S المقدمة لا يكون ذا صلة إلا عند التحليل اللغوي في الوضع المقيد. في الوضع القياسي ، تكون S و SS و SSS و SSSS مكافئة تمامًا ويتم تفسيرها على أنها أجزاء من الثانية. على سبيل المثال ، يكون .12 دائمًا 120 مللي ثانية ، ولن يؤدي تمرير SS إلى تفسيره على أنه 12 ميلي ثانية.

كما تتوفر تنسيقات التاريخ والوقت المدركة محليًا باستخدام LT LTS L LL LLL LLLL . تمت إضافتها في الإصدار 2.2.1 ، باستثناء LTS التي تمت إضافتها 2.8.4 .

تم إضافة Z ZZ في الإصدار 1.2.0 .

تمت إضافة S SS SSS في الإصدار 1.6.0 .

تمت إضافة X في الإصدار 2.0.0 .

تمت إضافة k kk في الإصدار 2.18.0

ما لم تحدد إزاحة المنطقة الزمنية ، سيؤدي تحليل سلسلة إلى إنشاء تاريخ في المنطقة الزمنية الحالية.

moment("2010-10-20 4:30",       "YYYY-MM-DD HH:mm");   // parsed as 4:30 local time
moment("2010-10-20 4:30 +0000", "YYYY-MM-DD HH:mm Z"); // parsed as 4:30 UTC

إذا لم تكن اللحظة التي تنتج عن الإدخال parsed موجودة ، فإن moment#isValid ستظهر false.

moment("2010 13",           "YYYY MM").isValid();     // false (not a real month)
moment("2010 11 31",        "YYYY MM DD").isValid();  // false (not a real day)
moment("2010 2 29",         "YYYY MM DD").isValid();  // false (not a leap year)
moment("2010 notamonth 29", "YYYY MMM DD").isValid(); // false (not a real month name)

اعتبارًا من الإصدار 2.0.0 ، يمكن تمرير مفتاح الإعدادات المحلية moment.utc() ثالث moment() و moment.utc() .

moment('2012 juillet', 'YYYY MMM', 'fr');
moment('2012 July',    'YYYY MMM', 'en');

محلل اللحظة هو متسامح جدا ، وهذا يمكن أن يؤدي إلى سلوك غير مرغوب فيه / غير متوقع.

على سبيل المثال ، يمكن ملاحظة السلوك التالي:

moment('2016 is a date', 'YYYY-MM-DD').isValid() //true, 2016 was matched

السابق إلى 2.13.0 عرض المحلل اللغوي السلوك التالي. لقد تم تصحيح هذا.

moment('I am spartacus', 'h:hh A').isValid();     //true - the 'am' matches the 'A' flag.

اعتبارًا من الإصدار 2.3.0 ، يمكنك تحديد قيمة منطقية للوسيطة الأخيرة لجعل Moment تستخدم تحليلًا صارمًا. يتطلب التحليل الدقيق تطابق التنسيق والإدخال تمامًا ، بما في ذلك المحددات .

moment('It is 2012-05-25', 'YYYY-MM-DD').isValid();       // true
moment('It is 2012-05-25', 'YYYY-MM-DD', true).isValid(); // false
moment('2012-05-25',       'YYYY-MM-DD', true).isValid(); // true
moment('2012.05.25',       'YYYY-MM-DD', true).isValid(); // false

يمكنك استخدام كل من اللغة والتشدّد.

moment('2012-10-14', 'YYYY-MM-DD', 'fr', true);

عادةً ما يكون التحليل الصارم أفضل خيار للتحليل. لمزيد من المعلومات حول اختيار تحليل صارم مقارنة بالتعسفية ، راجع دليل التحليل.

تحليل رقمين من السنوات

افتراضيا ، من المفترض أن تكون سنتان أكثر من 68 في عام 1900 والسنوات 68 أو أقل من المفترض أن تكون في عام 2000. هذا يمكن تغييره عن طريق استبدال moment.parseTwoDigitYear . moment.parseTwoDigitYear الطريقة. الوسيطة الوحيدة من هذه الطريقة هي سلسلة تحتوي على المدخلات لسنتين من قبل المستخدم ، ويجب أن تعيد السنة كعدد صحيح.

moment.parseTwoDigitYear = function(yearString) {
    return parseInt(yearString) + 2000;
}

تحليل ساعة ودقائق ملتصقتين

من الإصدار 2.11.0 تحليل ، يتم دعم Hmm و hmmss و Hmmss :

moment("123", "hmm").format("HH:mm") === "01:23"
moment("1234", "hmm").format("HH:mm") === "12:34"

سلسلة + تنسيقات 1.0.0+

moment(String, String[], String, Boolean);

إذا كنت لا تعرف التنسيق الدقيق لسلسلة إدخال ، ولكنك قد تعرف أنها واحدة من العديد ، فيمكنك استخدام مجموعة من التنسيقات.

هذا هو نفس String + Format ، فقط سيحاول مطابقة الإدخال إلى تنسيقات متعددة.

moment("12-25-1995", ["MM-DD-YYYY", "YYYY-MM-DD"]);

بدايةً من الإصدار 2.3.0 ، تستخدم Moment بعض الاستدلال البسيط لتحديد الصيغة المستخدمة. مرتب:

  • تفضِّل التنسيقات الناتجة عن التواريخ valid على تواريخ غير صالحة.
  • تفضّل الصيغ التي تحلل أكثر من السلسلة أقل وتستخدم المزيد من التنسيق أقل ، أي تفضل توزيع أكثر صرامة.
  • تفضل التنسيقات السابقة في المصفوفة من وقت لاحق.
moment("29-06-1995", ["MM-DD-YYYY", "DD-MM", "DD-MM-YYYY"]); // uses the last format
moment("05-06-1995", ["MM-DD-YYYY", "DD-MM-YYYY"]);          // uses the first format

يمكنك أيضًا تحديد وسيطة الإعدادات المحلية والتضييق. وهي تعمل بنفس طريقة الشكل المفرد.

moment("29-06-1995", ["MM-DD-YYYY", "DD-MM-YYYY"], 'fr');       // uses 'fr' locale
moment("29-06-1995", ["MM-DD-YYYY", "DD-MM-YYYY"], true);       // uses strict parsing
moment("05-06-1995", ["MM-DD-YYYY", "DD-MM-YYYY"], 'fr', true); // uses 'fr' locale and strict parsing

ملاحظة: تحليل تنسيقات متعددة أبطأ بكثير من تحليل تنسيق واحد. إذا كنت تستطيع تجنب ذلك ، فمن الأسرع بكثير تحليل صيغة واحدة.

تنسيقات خاصة 2.7.0+

moment(String, moment.CUSTOM_FORMAT, [String], [Boolean]);
moment(String, moment.HTML_FMT.DATETIME_LOCAL, [String], [Boolean]); // from 2.20.0
moment(String, [..., moment.ISO_8601, ...], [String], [Boolean]);

ISO-8601 هو معيار لعرض الوقت والمدة. يعتمد Moment بالفعل على تحليل السلاسل iso-8601 ، ولكن يمكن تحديد ذلك بشكل صريح في تنسيق / قائمة التنسيقات عند إنشاء لحظة.

لتحديد iso-8601 parsing use moment.ISO_8601 constant.

moment("2010-01-01T05:06:07", moment.ISO_8601);
moment("2010-01-01T05:06:07", ["YYYY", moment.ISO_8601]);

اعتبارًا من الإصدار 2.20.0 ، تتوفر تنسيقات HTML5 التالية:

ثابت شكل مثال نوع المدخلات
moment.HTML5_FMT.DATETIME_LOCAL YYYY-MM-DDTHH:mm 2017-12-14T16: 34 <input type="datetime-local" />
moment.HTML5_FMT.DATETIME_LOCAL_SECONDS YYYY-MM-DDTHH:mm:ss 2017-12-14T16: 34: 10 <input type="datetime-local" step="1" />
moment.HTML5_FMT.DATETIME_LOCAL_MS YYYY-MM-DDTHH:mm:ss.SSS 2017-12-14T16: 34: 10.234 <input type="datetime-local" step="0.001" />
moment.HTML5_FMT.DATE YYYY-MM-DD 2017/12/14 <input type="date" />
moment.HTML5_FMT.TIME HH:mm 16:34 <input type="time" />
moment.HTML5_FMT.TIME_SECONDS HH:mm:ss 16:34:10 <input type="time" step="1" />
moment.HTML5_FMT.TIME_MS HH:mm:ss.SSS 16: 34: 10.234 <input type="time" step="0.001" />
moment.HTML5_FMT.WEEK YYYY-[W]WW 2017-W50 <input type="week" />
moment.HTML5_FMT.MONTH YYYY-MM 2017-12 <input type="month" />

الكائن 2.2.1+

moment({unit: value, ...});
moment({ hour:15, minute:10 });
moment({ y    :2010, M     :3, d   :5, h    :15, m      :10, s      :3, ms          :123});
moment({ year :2010, month :3, day :5, hour :15, minute :10, second :3, millisecond :123});
moment({ years:2010, months:3, days:5, hours:15, minutes:10, seconds:3, milliseconds:123});
moment({ years:2010, months:3, date:5, hours:15, minutes:10, seconds:3, milliseconds:123});
moment({ years:'2010', months:'3', date:'5', hours:'15', minutes:'10', seconds:'3', milliseconds:'123'});  // from 2.11.0

يمكنك إنشاء لحظة بتحديد بعض الوحدات في كائن ما.

الوحدات المحذوفة الافتراضية إلى 0 أو التاريخ والشهر والسنة الحاليين.

day date مفتاح كل يوم من شهر.

تم إضافة date في 2.8.4 .

يتم دعم قيم السلسلة (كما هو موضح في السطر الأخير) من الإصدار 2.11.0 .

لاحظ أنه مثل moment(Array) new Date(year, month, date) ، يتم فهرسة 0 أشهر.

يونكس تيميستامب (ميلي ثانية) 1.0.0+

moment(Number);

على غرار new Date(Number) ، يمكنك إنشاء لحظة بتمرير قيمة عددية تمثل عدد المللي ثانية منذ عهد يونكس (يناير 1 1970 12AM UTC).

var day = moment(1318781876406);

ملاحظة: ECMAScript يستدعي هذا "قيمة الوقت"

يونكس تيميستامب (بالثواني) 1.6.0+

moment.unix(Number)

لإنشاء لحظة من الطابع الزمني لـ Unix ( بالثواني منذ تاريخ Unix) ، استخدم moment.unix(Number) .

var day = moment.unix(1318781876);

يتم تطبيق هذا moment(timestamp * 1000) ، لذلك يتم تضمين الثواني الجزئية في الطابع الزمني للإدخال.

var day = moment.unix(1318781876.721);

ملاحظة: بالرغم من أن طوابع UNIX tim timampamps تعتمد على UTC ، فإن هذه الوظيفة تقوم بإنشاء كائن لحظة في الوضع المحلي . إذا كنت بحاجة إلى UTC ، .utc() بعد ذلك الاتصال .utc() ، كما في:

var day = moment.unix(1318781876).utc();

تاريخ 1.0.0+

moment(Date);

يمكنك إنشاء Moment باستخدام كائن Javascript Date أصلي موجود مسبقًا.

var day = new Date(2011, 9, 16);
var dayWrapper = moment(day);

هذا نسخ كائن Date ؛ لن تؤثر التغييرات الإضافية في Date على " Moment " والعكس صحيح.

صفيف 1.0.0+

moment(Number[]);

يمكنك إنشاء لحظة مع مجموعة من الأرقام التي تعكس المعلمات التي تم تمريرها إلى تاريخ جديد ()

[year, month, day, hour, minute, second, millisecond]

moment([2010, 1, 14, 15, 25, 50, 125]); // February 14th, 3:25:50.125 PM

أي قيمة بعد السنة اختيارية ، وسيتم افتراضيا إلى أقل رقم ممكن.

moment([2010]);        // January 1st
moment([2010, 6]);     // July 1st
moment([2010, 6, 10]); // July 10th

ينشئ الإنشاء مع صفيف تاريخ في المنطقة الزمنية الحالية. لإنشاء تاريخ من صفيف في UTC ، استخدم moment.utc(Number[]) .

moment.utc([2010, 1, 14, 15, 25, 50, 125]);

ملاحظة: نظرًا لأن هذا يعكس معلمات Date الأصلية ، فستصبح الأشهر والساعات والدقائق والثواني والملي ثانية غير مفهرسة. السنوات والأيام من الشهر هي 1 مفهرسة.

غالبًا ما يكون هذا سبب الإحباط ، خاصةً مع الأشهر ، لذا احرص على ملاحظة ذلك!

إذا كان التاريخ الذي يمثله المصفوفة غير موجود ، moment#isValid صحيحة.

moment([2010, 12]).isValid();     // false (not a real month)
moment([2010, 10, 31]).isValid(); // false (not a real day)
moment([2010, 1, 29]).isValid();  // false (not a leap year)

ASP.NET JSON Date 1.3.0+

moment(String);

يقوم Microsoft Web API بإرجاع تواريخ JSON بتنسيق ISO-8601 المناسب بشكل افتراضي ، ولكن قد تقوم تقنيات ASP.NET الأقدم بإرجاع التواريخ في JSON كـ /Date(1198908717056)/ أو /Date(1198908717056-0700)/

إذا تم تمرير سلسلة تطابق هذا التنسيق ، فسيتم تحليلها بشكل صحيح.

moment("/Date(1198908717056-0700)/"); // 2007-12-28T23:11:57.056-07:00

لحظة استنساخ 1.2.0+

moment(Moment);

كل اللحظات قابلة للتغيير. إذا كنت تريد استنساخًا للحظة ، فيمكنك القيام بذلك بشكل ضمني أو صريح.

moment() الدعوة moment() في لحظة سوف استنساخها.

var a = moment([2012]);
var b = moment(a);
a.year(2000);
b.year(); // 2012

بالإضافة إلى ذلك ، يمكنك استدعاء moment#clone لاستنساخ لحظة.

var a = moment([2012]);
var b = a.clone();
a.year(2000);
b.year(); // 2012

UTC 1.5.0+

moment.utc();
moment.utc(Number);
moment.utc(Number[]);
moment.utc(String);
moment.utc(String, String);
moment.utc(String, String[]);
moment.utc(String, String, String);
moment.utc(String, String, Boolean);
moment.utc(String, String, String, Boolean);
moment.utc(Moment);
moment.utc(Date);

بشكل افتراضي ، يتم توزيع اللحظة وعرضها بالتوقيت المحلي.

إذا كنت تريد تحليل أو عرض لحظة بالتوقيت العالمي المنسق ، فيمكنك استخدام moment.utc() بدلاً من moment() .

هذا يقودنا إلى ميزة مثيرة للاهتمام من Moment.js. وضع UTC.

أثناء عرض الوضع UTC ، سيتم عرض جميع طرق العرض في وقت UTC بدلاً من التوقيت المحلي.

moment().format();     // 2013-02-04T10:35:24-08:00
moment.utc().format(); // 2013-02-04T18:35:24+00:00

بالإضافة إلى ذلك ، بينما في وضع UTC ، سيستخدم كل Date#getUTC* داخليًا Date#getUTC* و Date#setUTC* أساليب بدلاً من Date#get* و Date#set* الطرق.

moment.utc().seconds(30).valueOf() === new Date().setUTCSeconds(30);
moment.utc().seconds()   === new Date().getUTCSeconds();

من المهم ملاحظة أنه على الرغم من اختلاف شاشات العرض أعلاه ، إلا أنها في نفس الوقت في الوقت نفسه.

var a = moment();
var b = moment.utc();
a.format();  // 2013-02-04T10:35:24-08:00
b.format();  // 2013-02-04T18:35:24+00:00
a.valueOf(); // 1360002924000
b.valueOf(); // 1360002924000

أي لحظة تم إنشاؤها بـ moment.utc() ستكون في الوضع UTC ، وأي لحظة يتم إنشاؤها moment.utc() لن.

للتبديل من التوقيت العالمي المنسق إلى التوقيت المحلي ، يمكنك استخدام moment#utc أو moment#local .

var a = moment.utc([2011, 0, 1, 8]);
a.hours(); // 8 UTC
a.local();
a.hours(); // 0 PST

parseZone 2.3.0+

moment.parseZone()
moment.parseZone(String)
moment.parseZone(String, String)
moment.parseZone(String, [String])
moment.parseZone(String, String, Boolean)
moment.parseZone(String, String, String, Boolean)

وظائف توزيع سلسلة Moment مثل moment(string) و moment.utc(string) تقبل معلومات offset إذا تم توفيرها ، ولكن قم بتحويل كائن Moment الناتج إلى التوقيت المحلي أو UTC. على النقيض من ذلك ، moment.parseZone() السلسلة ولكن تحافظ على كائن Moment الناتج في المنطقة الزمنية ذات الإزاحة الثابتة مع الإزاحة المتوفرة في السلسلة.

moment.parseZone("2013-01-01T00:00:00-13:00").utcOffset(); // -780 ("-13:00" in total minutes)
moment.parseZone('2013 01 01 05 -13:00', 'YYYY MM DD HH ZZ').utcOffset(); // -780  ("-13:00" in total minutes)
moment.parseZone('2013-01-01-13:00', ['DD MM YYYY ZZ', 'YYYY MM DD ZZ']).utcOffset(); // -780  ("-13:00" in total minutes);

كما يسمح لك لتمرير الحجج المحلية والصرامة.

moment.parseZone("2013 01 01 -13:00", 'YYYY MM DD ZZ', true).utcOffset(); // -780  ("-13:00" in total minutes)
moment.parseZone("2013-01-01-13:00", 'YYYY MM DD ZZ', true).utcOffset(); // NaN (doesn't pass the strictness check)
moment.parseZone("2013 01 01 -13:00", 'YYYY MM DD ZZ', 'fr', true).utcOffset(); // -780 (with locale and strictness argument)
moment.parseZone("2013 01 01 -13:00", ['DD MM YYYY ZZ', 'YYYY MM DD ZZ'], 'fr', true).utcOffset(); // -780 (with locale and strictness argument alongside an array of formats)

moment.parseZone يكافئ تحليل السلاسل وباستخدام moment#utcOffset لتحليل المنطقة.

var s = "2013-01-01T00:00:00-13:00";
moment(s).utcOffset(s);

التحقق من الصحة 1.7.0+

moment().isValid();

تطبق لحظة تطبيق قواعد التهيئة الأكثر صرامة من مُنشئ Date .

new Date(2013, 25, 14).toString(); // "Sat Feb 14 2015 00:00:00 GMT-0500 (EST)"
moment([2015, 25, 35]).format();   // 'Invalid date'

يمكنك التحقق مما إذا كانت "لحظة" تعتبر أن التاريخ غير صالح باستخدام moment#isValid . يمكنك التحقق من المقاييس المستخدمة بواسطة #isValid باستخدام moment#parsingFlags ، والتي تعرض كائنًا.

تؤدي علامات التحليل التالية إلى تاريخ غير صالح:

  • overflow : تجاوز حد حقل تاريخ ، مثل الشهر الثالث عشر ، أو اليوم الثاني والثلاثين من الشهر (أو 29 فبراير على السنوات غير الكبيسة) ، أي يوم 367 من السنة ، وما إلى ذلك. وحدة لمطابقة #invalidAt (انظر أدناه) ؛ -1 يعني عدم تجاوز.
  • invalidMonth : اسم شهر غير صحيح ، مثل moment('Marbruary', 'MMMM'); . يحتوي على سلسلة الشهر غير الصالحة نفسها ، أو لا شيء.
  • empty : سلسلة مدخلات لا تحتوي على أي شيء parsable ، مثل moment('this is nonsense'); . منطقية.
  • nullInput : دخل null ، مثل moment(null); . منطقية.
  • invalidFormat : قائمة فارغة بالتنسيقات ، مثل moment('2013-05-25', []) . منطقية.
  • userInvalidated : تاريخ تم إنشاؤه بشكل صريح باعتباره غير صالح ، مثل moment.invalid() . منطقية.

    بالإضافة إلى ما سبق ، اعتبارًا من 2.13.0 تعمل علامتي meridiem و parsedDateParts لتحديد تاريخ الصلاحية.

  • meridiem : تشير إلى ما تم تحليل meridiem (ص / م) ، إن وجدت. خيط.
  • parsedDateParts : إرجاع صفيف من أجزاء التاريخ parsed بترتيب تنازلي - أي parsedDateParts [0] === year. في حالة عدم وجود أجزاء ، ولكن لدى meridiem قيمة ، يكون التاريخ غير صالح. مجموعة مصفوفة.

بالإضافة إلى ذلك ، إذا تم تحليل هذه اللحظة في الوضع المقيد ، يجب أن تكون هذه العلامات فارغة حتى تكون اللحظة صحيحة:

  • unusedTokens : مصفوفة unusedTokens فرعية غير موجودة في سلسلة الإدخال
  • unusedInput : مجموعة من سلاسل فرعية للإدخال غير متطابقة مع سلسلة التنسيق

ملاحظة: أصبح مفهوم "مومنت" للصحة أكثر صرامة واتساقًا بين 2.2 و 2.3 . ملاحظة: يتم تحديد الصلاحية عند إنشاء اللحظة. تبقى لحظة معدلة (أي moment().hour(NaN) ) صالحة.

بالإضافة إلى ذلك ، يمكنك استخدام moment#invalidAt لتحديد وحدة التاريخ التي فاضت.

var m = moment("2011-10-10T10:20:90");
m.isValid(); // false
m.invalidAt(); // 5 for seconds

قيمة الإرجاع لها المعنى التالي:

  1. سنوات
  2. الشهور
  3. أيام
  4. ساعات
  5. الدقائق
  6. ثواني
  7. ميلي ثانية

ملاحظة: في حالة وجود وحدات خاطئة متعددة ، يتم إرجاع الوحدة الأولى (لأن أيام الصلاحية قد تعتمد على الشهر ، على سبيل المثال).

لحظات غير صالحة

إذا كانت لحظة غير صالحة ، فإنها تتصرف مثل NaN في عمليات النقطة العائمة.

كل ما يلي ينتج لحظات غير صالحة:

  • invalid.add(unit, value)
  • another.add(invalid)
  • invalid.clone()
  • invalid.diff(another)
  • invalid.endOf(unit)
  • invalid.max(another)
  • another.max(invalid)
  • invalid.min(another)
  • another.min(invalid)
  • invalid.set(unit, value)
  • invalid.startOf(unit)
  • invalid.subtract(unit, value)

ينتج ما يلي نسخة مترجمة من 'InvalidDate' :

  • invalid.format(anyFmt) إلى 'Invalid Date' في الإعدادات المحلية الحالية
  • invalid.from(another)
  • another.from(invalid)
  • invalid.fromNow(suffix)
  • invalid.to(another)
  • another.to(invalid)
  • invalid.toNow(suffix)
  • invalid.toISOString()
  • invalid.toString()

ما يلي إرجاع false :

  • invalid.isAfter(another)
  • invalid.isAfter(invalid)
  • another.isAfter(invalid)
  • invalid.isBefore(another)
  • invalid.isBefore(invalid)
  • another.isBefore(invalid)
  • invalid.isBetween(another, another)
  • invalid.isBetween(invalid, invalid)
  • invalid.isSame(another)
  • invalid.isSame(invalid)
  • another.isSame(invalid)
  • invalid.isSameOrAfter(another)
  • invalid.isSameOrAfter(invalid)
  • another.isSameOrAfter(invalid)
  • invalid.isSameOrBefore(another)
  • invalid.isSameOrBefore(invalid)
  • another.isSameOrBefore(invalid)

وهذه العودة null أو NaN مع بعض التركيب:

  • invalid.get(unit) بإرجاع null ، مثل كافة getters المسماة الأخرى
  • invalid.toArray() === [NaN, NaN, NaN, NaN, NaN, NaN]
  • invalid.toObject() لديه كل القيم المحددة ل NaN
  • invalid.toDate() إرجاع كائن تاريخ غير صالح
  • invalid.toJSON() بإرجاع فارغ
  • إرجاع invalid.unix() فارغة
  • إرجاع invalid.valueOf() فارغة

خلق البيانات 2.11.0+

moment().creationData();

بعد إنشاء كائن لحظة ، يمكن الوصول إلى جميع المدخلات باستخدام طريقة creationData() :

moment("2013-01-02", "YYYY-MM-DD", true).creationData() === {
    input: "2013-01-02",
    format: "YYYY-MM-DD",
    locale: Locale obj,
    isUTC: false,
    strict: true
}

افتراضيات 2.2.1+

moment("15", "hh")

يمكنك إنشاء كائن لحظة يحدد فقط بعض الوحدات ، وسيتم تعطيل باقي الوقت إلى اليوم أو الشهر أو السنة الحالية أو 0 للساعات والدقائق والثواني والملي ثانية.

التقصير إلى الآن ، عندما لا يتم تمرير أي شيء:

moment();  // current date and time

التقصير إلى اليوم ، عندما يتم تمرير الساعات والدقائق والثواني والملي ثانية فقط:

moment(5, "HH");  // today, 5:00:00.000
moment({hour: 5});  // today, 5:00:00.000
moment({hour: 5, minute: 10});  // today, 5:10.00.000
moment({hour: 5, minute: 10, seconds: 20});  // today, 5:10.20.000
moment({hour: 5, minute: 10, seconds: 20, milliseconds: 300});  // today, 5:10.20.300

الإلغاء الافتراضي لهذا الشهر والسنة ، عندما يتم تمرير الأيام والوحدات الأصغر:

moment(5, "DD");  // this month, 5th day-of-month
moment("4 05:06:07", "DD hh:mm:ss");  // this month, 4th day-of-month, 05:06:07.000

التقصير إلى هذا العام ، إذا لم يتم تحديد السنة:

moment(3, "MM");  // this year, 3rd month (March)
moment("Apr 4 05:06:07", "MMM DD hh:mm:ss");  // this year, 4th April, 05:06:07.000

احصل على + تعيين

يستخدم Moment.js الحاصلون فوق طاقتهم والمستقرون. قد تكون على دراية بهذا النمط من استخدامه في jQuery.

يعتبر استدعاء هذه الطرق بدون معلمات بمثابة أداة getter ، كما أن الاتصال بها باستخدام معلمة يعمل كمؤشر.

هذه الخريطة إلى الوظيفة المقابلة في كائن Date الأصلي.

moment().seconds(30).valueOf() === new Date().setSeconds(30);
moment().seconds()   === new Date().getSeconds();

إذا كنت في moment#utc ، فسيتم تعيينها إلى مكافئ UTC.

moment.utc().seconds(30).valueOf() === new Date().setUTCSeconds(30);
moment.utc().seconds()   === new Date().getUTCSeconds();

للملاءمة ، توجد أسماء أساليب المفرد والجمع كما في الإصدار 2.0.0 .

ملاحظة: كل هذه الطرق تحور اللحظة الأصلية عند استخدامها كمستقر.

ملحوظة: من 2.19.0 تمرير NaN إلى أي مقرن هو a-op. قبل 2.19.0 كان يبطل اللحظة بطريقة خاطئة.

ميلي ثانية واحدة 1.3.0+

moment().millisecond(Number);
moment().millisecond(); // Number
moment().milliseconds(Number);
moment().milliseconds(); // Number

الحصول على أو تعيين المللي ثانية.

يقبل الأرقام من 0 إلى 999. إذا تم تجاوز النطاق ، فستظهر الفقاعات للثواني.

الثاني 1.0.0+

moment().second(Number);
moment().second(); // Number
moment().seconds(Number);
moment().seconds(); // Number

يحصل أو يحدد ثانية.

يقبل الأرقام من 0 إلى 59. إذا تم تجاوز النطاق ، فستظهر الفقاعات إلى الدقائق.

دقيقة 1.0.0+

moment().minute(Number);
moment().minute(); // Number
moment().minutes(Number);
moment().minutes(); // Number

Gets or sets the minutes.

Accepts numbers from 0 to 59. If the range is exceeded, it will bubble up to the hour.

Hour 1.0.0+

moment().hour(Number);
moment().hour(); // Number
moment().hours(Number);
moment().hours(); // Number

Gets or sets the hour.

Accepts numbers from 0 to 23. If the range is exceeded, it will bubble up to the day.

Date of Month 1.0.0+

moment().date(Number);
moment().date(); // Number
moment().dates(Number);
moment().dates(); // Number

Gets or sets the day of the month.

Accepts numbers from 1 to 31. If the range is exceeded, it will bubble up to the months.

Note: Moment#date is for the date of the month, and Moment#day is for the day of the week.

Note: if you chain multiple actions to construct a date, you should start from a year, then a month, then a day etc. Otherwise you may get unexpected results, like when day=31 and current month has only 30 days (the same applies to native JavaScript Date manipulation), the returned date will be the 30th of the current month (see month for more details).

Bad: moment().date(day).month(month).year(year)

Good: moment().year(year).month(month).date(day)

2.16.0 deprecated using moment().dates() . Use moment().date() instead.

Day of Week 1.3.0+

moment().day(Number|String);
moment().day(); // Number
moment().days(Number|String);
moment().days(); // Number

Gets or sets the day of the week.

This method can be used to set the day of the week, with Sunday as 0 and Saturday as 6.

If the value given is from 0 to 6, the resulting date will be within the current (Sunday-to-Saturday) week.

If the range is exceeded, it will bubble up to other weeks.

moment().day(-7); // last Sunday (0 - 7)
moment().day(7); // next Sunday (0 + 7)
moment().day(10); // next Wednesday (3 + 7)
moment().day(24); // 3 Wednesdays from now (3 + 7 + 7 + 7)

Note: Moment#date is for the date of the month, and Moment#day is for the day of the week.

As of 2.1.0 , a day name is also supported. This is parsed in the moment's current locale.

moment().day("Sunday");
moment().day("Monday");

Day of Week (Locale Aware) 2.1.0+

moment().weekday(Number);
moment().weekday(); // Number

Gets or sets the day of the week according to the locale.

If the locale assigns Monday as the first day of the week, moment().weekday(0) will be Monday. If Sunday is the first day of the week, moment().weekday(0) will be Sunday.

As with moment#day , if the range is exceeded, it will bubble up to other weeks.

// when Monday is the first day of the week
moment().weekday(-7); // last Monday
moment().weekday(7); // next Monday
// when Sunday is the first day of the week
moment().weekday(-7); // last Sunday
moment().weekday(7); // next Sunday

ISO Day of Week 2.1.0+

moment().isoWeekday(Number);
moment().isoWeekday(); // Number

Gets or sets the ISO day of the week with 1 being Monday and 7 being Sunday.

As with moment#day , if the range is exceeded, it will bubble up to other weeks.

moment().isoWeekday(1); // Monday
moment().isoWeekday(7); // Sunday

A day name is also supported. This is parsed in the moment's current locale.

moment().isoWeekday("Sunday");
moment().isoWeekday("Monday");

Day of Year 2.0.0+

moment().dayOfYear(Number);
moment().dayOfYear(); // Number

Gets or sets the day of the year.

Accepts numbers from 1 to 366. If the range is exceeded, it will bubble up to the years.

Week of Year 2.0.0+

moment().week(Number);
moment().week(); // Number
moment().weeks(Number);
moment().weeks(); // Number

Gets or sets the week of the year.

Because different locales define week of year numbering differently, Moment.js added moment#week to get/set the localized week of the year.

The week of the year varies depending on which day is the first day of the week (Sunday, Monday, etc), and which week is the first week of the year.

For example, in the United States, Sunday is the first day of the week. The week with January 1st in it is the first week of the year.

In France, Monday is the first day of the week, and the week with January 4th is the first week of the year.

The output of moment#week will depend on the locale for that moment.

When setting the week of the year, the day of the week is retained.

Week of Year (ISO) 2.0.0+

moment().isoWeek(Number);
moment().isoWeek(); // Number
moment().isoWeeks(Number);
moment().isoWeeks(); // Number

Gets or sets the ISO week of the year .

When setting the week of the year, the day of the week is retained.

Month 1.0.0+

moment().month(Number|String);
moment().month(); // Number
moment().months(Number|String);
moment().months(); // Number

Gets or sets the month.

Accepts numbers from 0 to 11. If the range is exceeded, it will bubble up to the year.

Note: Months are zero indexed, so January is month 0.

As of 2.1.0 , a month name is also supported. This is parsed in the moment's current locale.

moment().month("January");
moment().month("Feb");

Before version 2.1.0 , if a moment changed months and the new month did not have enough days to keep the current day of month, it would overflow to the next month.

As of version 2.1.0 , this was changed to be clamped to the end of the target month.

// before 2.1.0
moment([2012, 0, 31]).month(1).format("YYYY-MM-DD"); // 2012-03-02
// after 2.1.0
moment([2012, 0, 31]).month(1).format("YYYY-MM-DD"); // 2012-02-29

2.16.0 deprecated using moment().months() . Use moment().month() instead.

Quarter 2.6.0+

moment().quarter(); // Number
moment().quarter(Number);
moment().quarters(); // Number
moment().quarters(Number);

Gets the quarter (1 to 4).

moment('2013-01-01T00:00:00.000').quarter() // 1
moment('2013-04-01T00:00:00.000').subtract(1, 'ms').quarter() // 1
moment('2013-04-01T00:00:00.000').quarter() // 2
moment('2013-07-01T00:00:00.000').subtract(1, 'ms').quarter() // 2
moment('2013-07-01T00:00:00.000').quarter() // 3
moment('2013-10-01T00:00:00.000').subtract(1, 'ms').quarter() // 3
moment('2013-10-01T00:00:00.000').quarter() // 4
moment('2014-01-01T00:00:00.000').subtract(1, 'ms').quarter() // 4

Sets the quarter (1 to 4).

moment('2013-01-01T00:00:00.000').quarter(2) // '2013-04-01T00:00:00.000'
moment('2013-02-05T05:06:07.000').quarter(2).format() // '2013-05-05T05:06:07-07:00'

Year 1.0.0+

moment().year(Number);
moment().year(); // Number
moment().years(Number);
moment().years(); // Number

Gets or sets the year.

Accepts numbers from -270,000 to 270,000.

2.16.0 deprecated using moment().years() . Use moment().year() instead.

Week Year 2.1.0+

moment().weekYear(Number);
moment().weekYear(); // Number

Gets or sets the week-year according to the locale.

Because the first day of the first week does not always fall on the first day of the year, sometimes the week-year will differ from the month year.

For example, in the US, the week that contains Jan 1 is always the first week. In the US, weeks also start on Sunday. If Jan 1 was a Monday, Dec 31 would belong to the same week as Jan 1, and thus the same week-year as Jan 1. Dec 30 would have a different week-year than Dec 31.

Week Year (ISO) 2.1.0+

moment().isoWeekYear(Number);
moment().isoWeekYear(); // Number

Gets or sets the ISO week-year .

Weeks In Year 2.6.0+

moment().weeksInYear();

Gets the number of weeks according to locale in the current moment's year.

Weeks In Year (ISO) 2.6.0+

moment().isoWeeksInYear();

Gets the number of weeks in the current moment's year, according to ISO weeks .

Get 2.2.1+

moment().get('year');
moment().get('month');  // 0 to 11
moment().get('date');
moment().get('hour');
moment().get('minute');
moment().get('second');
moment().get('millisecond');

String getter. In general

moment().get(unit) === moment()[unit]()

Units are case insensitive, and support plural and short forms: year (years, y), month (months, M), date (dates, D), hour (hours, h), minute (minutes, m), second (seconds, s), millisecond (milliseconds, ms).

Set 2.2.1+

moment().set(String, Int);
moment().set(Object(String, Int));

Generic setter, accepting unit as first argument, and value as second:

moment().set('year', 2013);
moment().set('month', 3);  // April
moment().set('date', 1);
moment().set('hour', 13);
moment().set('minute', 20);
moment().set('second', 30);
moment().set('millisecond', 123);

moment().set({'year': 2013, 'month': 3});

Units are case insensitive, and support plural and short forms: year (years, y), month (months, M), date (dates, D), hour (hours, h), minute (minutes, m), second (seconds, s), millisecond (milliseconds, ms).

Object parsing was added in 2.9.0

Maximum 2.7.0+

moment.max(Moment[,Moment...]);
moment.max(Moment[]);

Returns the maximum (most distant future) of the given moment instances.

فمثلا:

var a = moment().subtract(1, 'day');
var b = moment().add(1, 'day');
moment.max(a, b);  // b

var friends = fetchFriends(); /* [{name: 'Dan', birthday: '11.12.1977'}, {name: 'Mary', birthday: '11.12.1986'}, {name: 'Stephan', birthday: '11.01.1993'}]*/
var friendsBirthDays = friends.map(function(friend){
    return moment(friend.birthday, 'DD.MM.YYYY');
});
moment.max(friendsBirthDays);  // '11.01.1993'

With no arguments the function returns a moment instance with the current time.

From version 2.10.5 , if an invalid moment is one of the arguments, the result is an invalid moment.

moment.max(moment(), moment.invalid()).isValid() === false
moment.max(moment.invalid(), moment()).isValid() === false
moment.max([moment(), moment.invalid()]).isValid() === false
moment.max([moment.invalid(), moment()]).isValid() === false

Minimum 2.7.0+

moment.min(Moment[,Moment...]);
moment.min(Moment[]);

Returns the minimum (most distant past) of the given moment instances.

فمثلا:

var a = moment().subtract(1, 'day');
var b = moment().add(1, 'day');
moment.min(a, b);  // a
moment.min([a, b]); // a

With no arguments the function returns a moment instance with the current time.

From version 2.10.5 , if an invalid moment is one of the arguments, the result is an invalid moment.

moment.min(moment(), moment.invalid()).isValid() === false
moment.min(moment.invalid(), moment()).isValid() === false
moment.min([moment(), moment.invalid()]).isValid() === false
moment.min([moment.invalid(), moment()]).isValid() === false

Manipulate

Once you have a Moment , you may want to manipulate it in some way. There are a number of methods to help with this.

Moment.js uses the fluent interface pattern , also known as method chaining . This allows you to do crazy things like the following.

moment().add(7, 'days').subtract(1, 'months').year(2009).hours(0).minutes(0).seconds(0);

Note: It should be noted that moments are mutable. Calling any of the manipulation methods will change the original moment.

If you want to create a copy and manipulate it, you should use moment#clone before manipulating the moment. More info on cloning.

Add 1.0.0+

moment().add(Number, String);
moment().add(Duration);
moment().add(Object);

Mutates the original moment by adding time.

This is a pretty robust function for adding time to an existing moment. To add time, pass the key of what time you want to add, and the amount you want to add.

moment().add(7, 'days');

There are some shorthand keys as well if you're into that whole brevity thing.

moment().add(7, 'd');
مفتاح Shorthand
سنوات ذ
quarters Q
months M
weeks ث
أيام د
hours ح
minutes م
ثواني الصورة
milliseconds ms

If you want to add multiple different keys at the same time, you can pass them in as an object literal.

moment().add(7, 'days').add(1, 'months'); // with chaining
moment().add({days:7,months:1}); // with object literal

There are no upper limits for the amounts, so you can overload any of the parameters.

moment().add(1000000, 'milliseconds'); // a million milliseconds
moment().add(360, 'days'); // 360 days

Special considerations for months and years

If the day of the month on the original date is greater than the number of days in the final month, the day of the month will change to the last day in the final month.

moment([2010, 0, 31]);                  // January 31
moment([2010, 0, 31]).add(1, 'months'); // February 28

There are also special considerations to keep in mind when adding time that crosses over daylight saving time. If you are adding years, months, weeks, or days, the original hour will always match the added hour.

var m = moment(new Date(2011, 2, 12, 5, 0, 0)); // the day before DST in the US
m.hours(); // 5
m.add(1, 'days').hours(); // 5

If you are adding hours, minutes, seconds, or milliseconds, the assumption is that you want precision to the hour, and will result in a different hour.

var m = moment(new Date(2011, 2, 12, 5, 0, 0)); // the day before DST in the US
m.hours(); // 5
m.add(24, 'hours').hours(); // 6 (but you may have to set the timezone first)

Alternatively, you can use durations to add to moments.

var duration = moment.duration({'days' : 1});
moment([2012, 0, 31]).add(duration); // February 1

Before version 2.8.0 , the moment#add(String, Number) syntax was also supported. It has been deprecated in favor of moment#add(Number, String) .

moment().add('seconds', 1); // Deprecated in 2.8.0
moment().add(1, 'seconds');

As of 2.12.0 when decimal values are passed for days and months, they are rounded to the nearest integer. Weeks, quarters, and years are converted to days or months, and then rounded to the nearest integer.

moment().add(1.5, 'months') == moment().add(2, 'months')
moment().add(.7, 'years') == moment().add(8, 'months') //.7*12 = 8.4, rounded to 8

Subtract 1.0.0+

moment().subtract(Number, String);
moment().subtract(Duration);
moment().subtract(Object);

Mutates the original moment by subtracting time.

This is exactly the same as moment#add , only instead of adding time, it subtracts time.

moment().subtract(7, 'days');

Before version 2.8.0 , the moment#subtract(String, Number) syntax was also supported. It has been deprecated in favor of moment#subtract(Number, String) .

moment().subtract('seconds', 1); // Deprecated in 2.8.0
moment().subtract(1, 'seconds');

As of 2.12.0 when decimal values are passed for days and months, they are rounded to the nearest integer. Weeks, quarters, and years are converted to days or months, and then rounded to the nearest integer.

moment().subtract(1.5, 'months') == moment().subtract(2, 'months')
moment().subtract(.7, 'years') == moment().subtract(8, 'months') //.7*12 = 8.4, rounded to 8

Note that in order to make the operations moment.add(-.5, 'days') and moment.subtract(.5, 'days') equivalent, -.5, -1.5, -2.5, etc are rounded down.

Start of Time 1.7.0+

moment().startOf(String);

Mutates the original moment by setting it to the start of a unit of time.

moment().startOf('year');    // set to January 1st, 12:00 am this year
moment().startOf('month');   // set to the first of this month, 12:00 am
moment().startOf('quarter');  // set to the beginning of the current quarter, 1st day of months, 12:00 am
moment().startOf('week');    // set to the first day of this week, 12:00 am
moment().startOf('isoWeek'); // set to the first day of this week according to ISO 8601, 12:00 am
moment().startOf('day');     // set to 12:00 am today
moment().startOf('date');     // set to 12:00 am today
moment().startOf('hour');    // set to now, but with 0 mins, 0 secs, and 0 ms
moment().startOf('minute');  // set to now, but with 0 seconds and 0 milliseconds
moment().startOf('second');  // same as moment().milliseconds(0);

These shortcuts are essentially the same as the following.

moment().startOf('year');
moment().month(0).date(1).hours(0).minutes(0).seconds(0).milliseconds(0);
moment().startOf('hour');
moment().minutes(0).seconds(0).milliseconds(0)

As of version 2.0.0 , moment#startOf('day') replaced moment#sod .

Note: moment#startOf('week') was added in version 2.0.0 .

As of version 2.1.0 , moment#startOf('week') uses the locale aware week start day.

Note: moment#startOf('isoWeek') was added in version 2.2.0 .

Note: moment#startOf('date') was added as an alias for day in 2.13.0

End of Time 1.7.0+

moment().endOf(String);

Mutates the original moment by setting it to the end of a unit of time.

This is the same as moment#startOf , only instead of setting to the start of a unit of time, it sets to the end of a unit of time.

moment().endOf("year"); // set the moment to 12-31 23:59:59.999 this year

As of version 2.0.0 , moment#endOf('day') replaced moment#eod .

Note: moment#endOf('week') was added in version 2.0.0 .

As of version 2.1.0 , moment#endOf('week') uses the locale aware week start day.

Maximum From 2.1.0, Deprecated 2.7.0

moment().max(Moment|String|Number|Date|Array);

Note: This function has been deprecated in 2.7.0 . Consider moment.min instead.

Limits the moment to a maximum of another moment value. So a.max(b) is the same as a = moment.min(a, b) (note that max is converted to min ).

Sometimes, server clocks are not quite in sync with client clocks. This ends up displaying humanized strings such as "in a few seconds" rather than "a few seconds ago". You can prevent that with moment#max() :

This is the counterpart for moment#min .

var momentFromServer = moment(input);
var clampedMoment = momentFromServer.max();

You can pass anything to moment#max that you would pass to moment() .

moment().max(moment().add(1, 'd'));
moment().max("2013-04-20T20:00:00+0800");
moment().max("Jan 1 2001", "MMM D YYYY");
moment().max(new Date(2012, 1, 8));

Minimum From 2.1.0, Deprecated 2.7.0

moment().min(Moment|String|Number|Date|Array);

Note: This function has been deprecated in 2.7.0 . Consider moment.max instead.

Limits the moment to a minimum of another moment value. So a.min(b) is the same as a = moment.max(a, b) (note that min is converted to max ).

This is the counterpart for moment#max .

moment().min("2013-04-20T20:00:00+0800");

This can be used in conjunction with moment#max to clamp a moment to a range.

var start  = moment().startOf('week');
var end    = moment().endOf('week');
var actual = moment().min(start).max(end);

Local 1.5.0+

moment().local();

Sets a flag on the original moment to use local time to display a moment instead of the original moment's time.

var a = moment.utc([2011, 0, 1, 8]);
a.hours(); // 8 UTC
a.local();
a.hours(); // 0 PST

Local can also be used to convert out of a fixed offset mode:

moment.parseZone('2016-05-03T22:15:01+02:00').local().format(); // "2016-05-03T15:15:01-05:00"

See moment.utc() for more information on UTC mode.

UTC 1.5.0+

moment().utc();

Sets a flag on the original moment to use UTC to display a moment instead of the original moment's time.

var a = moment([2011, 0, 1, 8]);
a.hours(); // 8 PST
a.utc();
a.hours(); // 16 UTC

UTC can also be used to convert out of a fixed offset mode:

moment.parseZone('2016-05-03T22:15:01+02:00').utc().format(); //"2016-05-03T20:15:01Z"

See moment.utc() for more information on UTC mode.

UTC offset 2.9.0++

moment().utcOffset();
moment().utcOffset(Number|String);
moment().utcOffset(Number|String, Boolean);

Get the UTC offset in minutes.

Note: Unlike moment.fn.zone this function returns the real offset from UTC, not the reverse offset (as returned by Date.prototype.getTimezoneOffset ).

Getting the utcOffset of the current object:

moment().utcOffset(); // (-240, -120, -60, 0, 60, 120, 240, etc.)

Setting the UTC offset by supplying minutes. Note that once you set an offset, it's fixed and won't change on its own (ie there are no DST rules). If you want an actual time zone -- time in a particular location, like America/Los_Angeles , consider moment-timezone .

moment().utcOffset(120);

If the input is less than 16 and greater than -16 , it will interpret your input as hours instead.

// these are equivalent
moment().utcOffset(8);  // set hours offset
moment().utcOffset(480);  // set minutes offset (8 * 60)

It is also possible to set the UTC offset from a string.

// these are equivalent
moment().utcOffset("+08:00");
moment().utcOffset(8);
moment().utcOffset(480);

moment#utcOffset will search the string for the first match of +00:00 +0000 -00:00 -0000 Z , so you can even pass an ISO8601 formatted string and the moment will be changed to that UTC offset.

Note that the string, if not 'Z', is required to start with the + or - character.

moment().utcOffset("2013-03-07T07:00:00+08:00");

The utcOffset function has an optional second parameter which accepts a boolean value indicating whether to keep the existing time of day.

  • Passing false (the default) will keep the same instant in Universal Time, but the local time will change.

  • Passing true will keep the same local time, but at the expense of choosing a different point in Universal Time.

One use of this feature is if you want to construct a moment with a specific time zone offset using only numeric input values:

moment([2016, 0, 1, 0, 0, 0]).utcOffset(-5, true) // Equivalent to "2016-01-01T00:00:00-05:00"

Time zone Offset From 1.2.0, deprecated 2.9.0+

moment().zone();
moment().zone(Number|String);

Note: This function has been deprecated in 2.9.0 . Consider moment.fn.utcOffset instead.

Get the time zone offset in minutes.

moment().zone(); // (60, 120, 240, etc.)

As of version 2.1.0 , it is possible to set the offset by passing in the number of minutes offset from GMT.

moment().zone(120);

If the input is less than 16 and greater than -16 , it will interpret your input as hours instead.

// these are equivalent
moment().zone(480);
moment().zone(8);

It is also possible to set the zone from a string.

moment().zone("-08:00");

moment#zone will search the string for the first match of +00:00 +0000 -00:00 -0000 , so you can even pass an ISO8601 formatted string and the moment will be changed to that zone.

moment().zone("2013-03-07T07:00:00-08:00");

عرض

Once parsing and manipulation are done, you need some way to display the moment.

Format 1.0.0+

moment().format();
moment().format(String);

This is the most robust display option. It takes a string of tokens and replaces them with their corresponding values.

moment().format();                                // "2014-09-08T08:02:17-05:00" (ISO 8601)
moment().format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, February 14th 2010, 3:25:50 pm"
moment().format("ddd, hA");                       // "Sun, 3PM"
moment('gibberish').format('YYYY MM DD');         // "Invalid date"
Token انتاج |
شهر M 1 2 ... 11 12
مو 1st 2nd ... 11th 12th
MM 01 02 ... 11 12
MMM Jan Feb ... Nov Dec
MMMM January February ... November December
Quarter Q 1 2 3 4
Qo 1st 2nd 3rd 4th
Day of Month د 1 2 ... 30 31
Do 1st 2nd ... 30th 31st
DD 01 02 ... 30 31
Day of Year DDD 1 2 ... 364 365
DDDo 1st 2nd ... 364th 365th
DDDD 001 002 ... 364 365
Day of Week د 0 1 ... 5 6
فعل 0th 1st ... 5th 6th
dd Su Mo ... Fr Sa
ddd Sun Mon ... Fri Sat
DDDD Sunday Monday ... Friday Saturday
Day of Week (Locale) البريد 0 1 ... 5 6
Day of Week (ISO) E 1 2 ... 6 7
Week of Year ث 1 2 ... 52 53
wo 1st 2nd ... 52nd 53rd
ww 01 02 ... 52 53
Week of Year (ISO) W 1 2 ... 52 53
Wo 1st 2nd ... 52nd 53rd
WW 01 02 ... 52 53
عام YY 70 71 ... 29 30
YYYY 1970 1971 ... 2029 2030
Y 1970 1971 ... 9999 +10000 +10001
Note: This complies with the ISO 8601 standard for dates past the year 9999
Week Year gg 70 71 ... 29 30
gggg 1970 1971 ... 2029 2030
Week Year (ISO) GG 70 71 ... 29 30
GGGG 1970 1971 ... 2029 2030
AM/PM ا AM PM
ا am pm
Hour H 0 1 ... 22 23
HH 00 01 ... 22 23
ح 1 2 ... 11 12
hh 01 02 ... 11 12
ك 1 2 ... 23 24
kk 01 02 ... 23 24
Minute م 0 1 ... 58 59
مم 00 01 ... 58 59
Second الصورة 0 1 ... 58 59
SS 00 01 ... 58 59
Fractional Second S 0 1 ... 8 9
SS 00 01 ... 98 99
SSS 000 001 ... 998 999
SSSS ... SSSSSSSSS 000[0..] 001[0..] ... 998[0..] 999[0..]
Time Zone z or zz EST CST ... MST PST
Note: as of 1.6.0 , the z/zz format tokens have been deprecated from plain moment objects. Read more about it here. However, they do work if you are using a specific time zone with the moment-timezone addon.
Z -07:00 -06:00 ... +06:00 +07:00
ZZ -0700 -0600 ... +0600 +0700
Unix Timestamp X 1360013296
Unix Millisecond Timestamp س 1360013296123

Z ZZ were added in 1.2.0 .

S SS SSS were added in 1.6.0 .

X was added in 2.0.0 .

e E gg gggg GG GGGG were added in 2.1.0 .

x was added in 2.8.4 .

SSSS to SSSSSSSSS were added in 2.10.5 . They display 3 significant digits and the rest is filled with zeros.

k and kk were added in 2.13.0 .

Localized formats

Because preferred formatting differs based on locale, there are a few tokens that can be used to format a moment based on its locale.

There are upper and lower case variations on the same formats. The lowercase version is intended to be the shortened version of its uppercase counterpart.

Time LT 8:30 PM
Time with seconds LTS 8:30:25 PM
Month numeral, day of month, year L 09/04/1986
ل 9/4/1986
Month name, day of month, year LL September 4, 1986
ll Sep 4, 1986
Month name, day of month, year, time LLL September 4, 1986 8:30 PM
lll Sep 4, 1986 8:30 PM
Month name, day of month, day of week, year, time LLLL Thursday, September 4, 1986 8:30 PM
llll Thu, Sep 4, 1986 8:30 PM

L LL LLL LLLL LT are available in version 1.3.0 . l ll lll llll are available in 2.0.0 . LTS was added in 2.8.4 .

Escaping characters

To escape characters in format strings, you can wrap the characters in square brackets.

moment().format('[today] dddd'); // 'today Sunday'

Similarities and differences with LDML

Note: While these date formats are very similar to LDML date formats, there are a few minor differences regarding day of month, day of year, and day of week.

For a breakdown of a few different date formatting tokens across different locales, see this chart of date formatting tokens.

Formatting speed

To compare Moment.js formatting speed against other libraries, check out this comparison against other libraries .

Other tokens

If you are more comfortable working with strftime instead of LDML-like parsing tokens, you can use Ben Oakes' plugin. benjaminoakes/moment-strftime .

Default format

As of version 1.5.0 , calling moment#format without a format will default to moment.defaultFormat . Out of the box, moment.defaultFormat is the ISO8601 format YYYY-MM-DDTHH:mm:ssZ .

As of version 2.13.0 , when in UTC mode, the default format is governed by moment.defaultFormatUtc which is in the format YYYY-MM-DDTHH:mm:ss[Z] . This returns Z as the offset, instead of +00:00 .

In certain instances, a local timezone (such as Atlantic/Reykjavik ) may have a zero offset, and will be considered to be UTC. In such cases, it may be useful to set moment.defaultFormat and moment.defaultFormatUtc to use the same formatting.

Time from now 1.0.0+

moment().fromNow();
moment().fromNow(Boolean);

A common way of displaying time is handled by moment#fromNow . This is sometimes called timeago or relative time.

moment([2007, 0, 29]).fromNow(); // 4 years ago

If you pass true , you can get the value without the suffix.

moment([2007, 0, 29]).fromNow();     // 4 years ago
moment([2007, 0, 29]).fromNow(true); // 4 years

The base strings are customized by the current locale .

The breakdown of which string is displayed for each length of time is outlined in the table below.

نطاق مفتاح Sample Output
0 to 44 seconds الصورة a few seconds ago
44 to 44 seconds SS 44 seconds ago
45 to 89 seconds م a minute ago
90 seconds to 44 minutes مم 2 minutes ago ... 44 minutes ago
45 to 89 minutes ح an hour ago
90 minutes to 21 hours hh 2 hours ago ... 21 hours ago
22 to 35 hours د a day ago
36 hours to 25 days dd 2 days ago ... 25 days ago
26 to 45 days M قبل شهر
45 to 319 days MM 2 months ago ... 10 months ago
320 to 547 days (1.5 years) ذ a year ago
548 days+ yy 2 years ago ... 20 years ago

Note: From version 2.10.3 , if the target moment object is invalid the result is the localized Invalid date string.

Note: The ss key was added in 2.18.0 .

Time from X 1.0.0+

moment().from(Moment|String|Number|Date|Array);
moment().from(Moment|String|Number|Date|Array, Boolean);

You may want to display a moment in relation to a time other than now. In that case, you can use moment#from .

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b) // "a day ago"

The first parameter is anything you can pass to moment() or an actual Moment .

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b);                     // "a day ago"
a.from([2007, 0, 29]);         // "a day ago"
a.from(new Date(2007, 0, 29)); // "a day ago"
a.from("2007-01-29");          // "a day ago"

Like moment#fromNow , passing true as the second parameter returns value without the suffix. This is useful wherever you need to have a human readable length of time.

var start = moment([2007, 0, 5]);
var end   = moment([2007, 0, 10]);
end.from(start);       // "in 5 days"
end.from(start, true); // "5 days"

From version 2.10.3 , if any of the endpoints are invalid the result is the localized Invalid date string.

Time to now 2.10.3+

moment().toNow();
moment().toNow(Boolean);

A common way of displaying time is handled by moment#toNow . This is sometimes called timeago or relative time.

This is similar to moment.fromNow , but gives the opposite interval: a.fromNow() = - a.toNow() .

This is similar to moment.to , but is special-cased for the current time. Use moment.to , if you want to control the two end points of the interval.

moment([2007, 0, 29]).toNow(); // in 4 years

If you pass true , you can get the value without the prefix.

moment([2007, 0, 29]).toNow();     // in 4 years
moment([2007, 0, 29]).toNow(true); // 4 years

The base strings are customized by the current locale .

The breakdown of which string is displayed for each length of time is outlined in the table below.

نطاق مفتاح Sample Output
0 to 44 seconds الصورة in seconds
45 to 89 seconds م in a minute
90 seconds to 44 minutes مم in 2 minutes ... in 44 minutes
45 to 89 minutes ح in an hour
90 minutes to 21 hours hh in 2 hours ... in 21 hours
22 to 35 hours د in a day
36 hours to 25 days dd in 2 days ... in 25 days
26 to 45 days M in a month
45 to 319 days MM in 2 months ... in 10 months
320 to 547 days (1.5 years) ذ in a year
548 days+ yy in 2 years ... in 20 years

From version 2.10.3 , if the target moment object is invalid the result is the localized Invalid date string.

Time to X 2.10.3+

moment().to(Moment|String|Number|Date|Array);
moment().to(Moment|String|Number|Date|Array, Boolean);

You may want to display a moment in relation to a time other than now. In that case, you can use moment#to .

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.to(b) // "in a day"

The first parameter is anything you can pass to moment() or an actual Moment .

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.to(b);                     // "in a day"
a.to([2007, 0, 29]);         // "in a day"
a.to(new Date(2007, 0, 29)); // "in a day"
a.to("2007-01-29");          // "in a day"

Like moment#toNow , passing true as the second parameter returns value without the suffix. This is useful wherever you need to have a human readable length of time.

var start = moment([2007, 0, 5]);
var end   = moment([2007, 0, 10]);
end.to(start);       // "5 days ago"
end.to(start, true); // "5 days"

From version 2.10.3 , if any of the endpoints are invalid the result is the localized Invalid date string.

Calendar Time 1.3.0+

moment().calendar();
moment().calendar(referenceTime);
moment().calendar(referenceTime, formats);  // from 2.10.5

Calendar time displays time relative to a given referenceTime (defaults to now), but does so slightly differently than moment#fromNow .

moment#calendar will format a date with different strings depending on how close to referenceTime 's date (today by default) the date is.

Last week Last Monday at 2:30 AM
The day before Yesterday at 2:30 AM
The same day Today at 2:30 AM
The next day Tomorrow at 2:30 AM
The next week Sunday at 2:30 AM
Everything else 7/10/2011

These strings are localized, and can be customized .

From 2.10.5 moment supports specifying calendar output formats per invocation:

moment().calendar(null, {
    sameDay: '[Today]',
    nextDay: '[Tomorrow]',
    nextWeek: 'dddd',
    lastDay: '[Yesterday]',
    lastWeek: '[Last] dddd',
    sameElse: 'DD/MM/YYYY'
});

sameElse is used as the format when the moment is more than a week away from the referenceTime

Note: From version 2.14.0 the formats argument to calendar can be a callback that is executed within the moment context with a single argument now:

moment().calendar(null, {
  sameDay: function (now) {
    if (this.isBefore(now)) {
      return '[Will Happen Today]';
    } else {
      return '[Happened Today]';
    }
    /* ... */
  }
});

Difference 1.0.0+

moment().diff(Moment|String|Number|Date|Array);
moment().diff(Moment|String|Number|Date|Array, String);
moment().diff(Moment|String|Number|Date|Array, String, Boolean);

To get the difference in milliseconds, use moment#diff like you would use moment#from .

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b) // 86400000

To get the difference in another unit of measurement, pass that measurement as the second argument.

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') // 1

To get the duration of a difference between two moments, you can pass diff as an argument into moment#duration . See the docs on moment#duration for more info.

The supported measurements are years , months , weeks , days , hours , minutes , and seconds . For ease of development, the singular forms are supported as of 2.0.0 . Units of measurement other than milliseconds are available in version 1.1.1 .

By default, moment#diff will truncate the result to zero decimal places, returning an integer. If you want a floating point number, pass true as the third argument. Before 2.0.0 , moment#diff returned a number rounded to the nearest integer, not a truncated number.

var a = moment([2008, 9]);
var b = moment([2007, 0]);
a.diff(b, 'years');       // 1
a.diff(b, 'years', true); // 1.75

If the moment is earlier than the moment you are passing to moment.fn.diff , the return value will be negative.

var a = moment();
var b = moment().add(1, 'seconds');
a.diff(b) // -1000
b.diff(a) // 1000

An easy way to think of this is by replacing .diff( with a minus operator.

          // a < b
a.diff(b) // a - b < 0
b.diff(a) // b - a > 0

Month and year diffs

moment#diff has some special handling for month and year diffs. It is optimized to ensure that two months with the same date are always a whole number apart.

So Jan 15 to Feb 15 should be exactly 1 month.

Feb 28 to Mar 28 should be exactly 1 month.

Feb 28 2011 to Feb 28 2012 should be exactly 1 year.

See more discussion on the month and year diffs here

This change to month and year diffs was made in 2.0.0 . As of version 2.9.0 diff also support quarter unit.

Unix Timestamp (milliseconds) 1.0.0+

moment().valueOf();
+moment();

moment#valueOf simply outputs the number of milliseconds since the Unix Epoch, just like Date#valueOf .

moment(1318874398806).valueOf(); // 1318874398806
+moment(1318874398806); // 1318874398806

To get a Unix timestamp (the number of seconds since the epoch) from a Moment , use moment#unix .

Note: ECMAScript calls this a "Time Value"

Unix Timestamp (seconds) 1.6.0+

moment().unix();

moment#unix outputs a Unix timestamp (the number of seconds since the Unix Epoch).

moment(1318874398806).unix(); // 1318874398

This value is floored to the nearest second, and does not include a milliseconds component.

Days in Month 1.5.0+

moment().daysInMonth();

Get the number of days in the current month.

moment("2012-02", "YYYY-MM").daysInMonth() // 29
moment("2012-01", "YYYY-MM").daysInMonth() // 31

As Javascript Date 1.0.0+

moment().toDate();

To get a copy of the native Date object that Moment.js wraps, use moment#toDate .

This will return a copy of the Date that the moment uses, so any changes to that Date will not cause moment to change. If you want to change the moment Date , see moment#manipulate or moment#set .

moment#native has been replaced by moment#toDate and has been deprecated as of 1.6.0 .

As Array 1.7.0+

moment().toArray();

This returns an array that mirrors the parameters from new Date() .

moment().toArray(); // [2013, 1, 4, 14, 40, 16, 154];

As JSON 2.0.0+

moment().toJSON();

When serializing an object to JSON, if there is a Moment object, it will be represented as an ISO8601 string, adjusted to UTC.

JSON.stringify({
    postDate : moment()
}); // '{"postDate":"2013-02-04T22:44:30.652Z"}'

If instead you would like an ISO8601 string that reflects the moment's utcOffset() , then you can modify the toJSON function like this:

moment.fn.toJSON = function() { return this.format(); }

This changes the behavior as follows:

JSON.stringify({
    postDate : moment()
}); // '{"postDate":"2013-02-04T14:44:30-08:00"}'

As ISO 8601 String 2.1.0+

moment().toISOString();
moment().toISOString(keepOffset); // from 2.20.0

Formats a string to the ISO8601 standard.

moment().toISOString() // 2013-02-04T22:44:30.652Z

Note that .toISOString() returns a timestamp in UTC, even if the moment in question is in local mode. This is done to provide consistency with the specification for native JavaScript Date .toISOString() , as outlined in the ES2015 specification . From version 2.20.0 , you may call .toISOString(true) to prevent UTC conversion.

From version 2.8.4 the native Date.prototype.toISOString is used if available, for performance reasons.

As Object 2.10.5+

moment().toObject();

This returns an object containing year, month, day-of-month, hour, minute, seconds, milliseconds.

moment().toObject()  // {
                     //     years: 2015
                     //     months: 6
                     //     date: 26,
                     //     hours: 1,
                     //     minutes: 53,
                     //     seconds: 14,
                     //     milliseconds: 600
                     // }

As String 2.1.0+

moment().toString();

Returns an english string in a similar format to JS Date's .toString() .

moment().toString() // "Sat Apr 30 2016 16:59:46 GMT-0500"

Inspect 2.16.0+

moment().inspect();

Returns a machine readable string, that can be evaluated to produce the same moment. Because of the name its also used in node interactive shell to display objects.

moment().inspect() // 'moment("2016-11-09T22:23:27.861")'
moment.utc().inspect() // 'moment.utc("2016-11-10T06:24:10.638+00:00")'
moment.parseZone('2016-11-10T06:24:12.958+05:00').inspect() // 'moment.parseZone("2016-11-10T06:24:12.958+05:00")'
moment(new Date('nope')).inspect() // 'moment.invalid(/* Invalid Date */)'
moment('blah', 'YYYY').inspect() // 'moment.invalid(/* blah */)'

Note: This function is mostly intended for debugging, not all cases are handled precisely.

Query

Is Before 2.0.0+

moment().isBefore(Moment|String|Number|Date|Array);
moment().isBefore(Moment|String|Number|Date|Array, String);

Check if a moment is before another moment. The first argument will be parsed as a moment, if not already so.

moment('2010-10-20').isBefore('2010-10-21'); // true

If you want to limit the granularity to a unit other than milliseconds, pass the units as the second parameter.

As the second parameter determines the precision, and not just a single value to check, using day will check for year, month and day.

moment('2010-10-20').isBefore('2010-12-31', 'year'); // false
moment('2010-10-20').isBefore('2011-01-01', 'year'); // true

Like moment#isAfter and moment#isSame , any of the units of time that are supported for moment#startOf are supported for moment#isBefore .

year month week day hour minute second

If nothing is passed to moment#isBefore , it will default to the current time.

NOTE : moment().isBefore() has undefined behavior and should not be used! If the code runs fast the initial created moment would be the same as the one created in isBefore to perform the check, so the result would be false . But if the code runs slower it's possible that the moment created in isBefore is measurably after the one created in moment() , so the call would return true .

Is Same 2.0.0+

moment().isSame(Moment|String|Number|Date|Array);
moment().isSame(Moment|String|Number|Date|Array, String);

Check if a moment is the same as another moment. The first argument will be parsed as a moment, if not already so.

moment('2010-10-20').isSame('2010-10-20'); // true

If you want to limit the granularity to a unit other than milliseconds, pass it as the second parameter.

moment('2010-10-20').isSame('2009-12-31', 'year');  // false
moment('2010-10-20').isSame('2010-01-01', 'year');  // true
moment('2010-10-20').isSame('2010-12-31', 'year');  // true
moment('2010-10-20').isSame('2011-01-01', 'year');  // false

When including a second parameter, it will match all units equal or larger. Passing in month will check month and year . Passing in day will check day , month , and year .

moment('2010-01-01').isSame('2011-01-01', 'month'); // false, different year
moment('2010-01-01').isSame('2010-02-01', 'day');   // false, different month

Like moment#isAfter and moment#isBefore , any of the units of time that are supported for moment#startOf are supported for moment#isSame .

year month week day hour minute second

Is After 2.0.0+

moment().isAfter(Moment|String|Number|Date|Array);
moment().isAfter(Moment|String|Number|Date|Array, String);

Check if a moment is after another moment. The first argument will be parsed as a moment, if not already so.

moment('2010-10-20').isAfter('2010-10-19'); // true

If you want to limit the granularity to a unit other than milliseconds, pass the units as the second parameter.

As the second parameter determines the precision, and not just a single value to check, using day will check for year, month and day.

moment('2010-10-20').isAfter('2010-01-01', 'year'); // false
moment('2010-10-20').isAfter('2009-12-31', 'year'); // true

Like moment#isSame and moment#isBefore , any of the units of time that are supported for moment#startOf are supported for moment#isAfter .

year month week day hour minute second

If nothing is passed to moment#isAfter , it will default to the current time.

moment().isAfter(); // false

Is Same or Before 2.11.0+

moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrBefore(Moment|String|Number|Date|Array, String);

Check if a moment is before or the same as another moment. The first argument will be parsed as a moment, if not already so.

moment('2010-10-20').isSameOrBefore('2010-10-21');  // true
moment('2010-10-20').isSameOrBefore('2010-10-20');  // true
moment('2010-10-20').isSameOrBefore('2010-10-19');  // false

If you want to limit the granularity to a unit other than milliseconds, pass the units as the second parameter.

As the second parameter determines the precision, and not just a single value to check, using day will check for year, month and day.

moment('2010-10-20').isSameOrBefore('2009-12-31', 'year'); // false
moment('2010-10-20').isSameOrBefore('2010-12-31', 'year'); // true
moment('2010-10-20').isSameOrBefore('2011-01-01', 'year'); // true

Like moment#isAfter and moment#isSame , any of the units of time that are supported for moment#startOf are supported for moment#isSameOrBefore :

year month week day hour minute second

Is Same or After 2.11.0+

moment().isSameOrAfter(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array, String);

Check if a moment is after or the same as another moment. The first argument will be parsed as a moment, if not already so.

moment('2010-10-20').isSameOrAfter('2010-10-19'); // true
moment('2010-10-20').isSameOrAfter('2010-10-20'); // true
moment('2010-10-20').isSameOrAfter('2010-10-21'); // false

If you want to limit the granularity to a unit other than milliseconds, pass the units as the second parameter.

As the second parameter determines the precision, and not just a single value to check, using day will check for year, month and day.

moment('2010-10-20').isSameOrAfter('2011-12-31', 'year'); // false
moment('2010-10-20').isSameOrAfter('2010-01-01', 'year'); // true
moment('2010-10-20').isSameOrAfter('2009-12-31', 'year'); // true

Like moment#isSame and moment#isBefore , any of the units of time that are supported for moment#startOf are supported for moment#isSameOrAfter :

year month week day hour minute second

Is Between 2.9.0+

//From 2.13.0 onward
moment().isBetween(moment-like, moment-like);
moment().isBetween(moment-like, moment-like, String);
moment().isBetween(moment-like, moment-like, String, String);
// where moment-like is Moment|String|Number|Date|Array

//2.9.0 to 2.12.0
moment().isBetween(moment-like, moment-like);
moment().isBetween(moment-like, moment-like, String);
// where moment-like is Moment|String|Number|Date|Array

Check if a moment is between two other moments, optionally looking at unit scale (minutes, hours, days, etc). The match is exclusive. The first two arguments will be parsed as moments, if not already so.

moment('2010-10-20').isBetween('2010-10-19', '2010-10-25'); // true

If you want to limit the granularity to a unit other than milliseconds, pass the units as the third parameter.

moment('2010-10-20').isBetween('2010-01-01', '2012-01-01', 'year'); // false
moment('2010-10-20').isBetween('2009-12-31', '2012-01-01', 'year'); // true

Like moment#isSame , moment#isBefore , moment#isAfter any of the units of time that are supported for moment#startOf are supported for moment#isBetween . Year, month, week, day, hour, minute, and second.

Version 2.13.0 introduces inclusivity. A [ indicates inclusion of a value. A ( indicates exclusion. If the inclusivity parameter is used, both indicators must be passed.

moment('2016-10-30').isBetween('2016-10-30', '2016-12-30', null, '()'); //false
moment('2016-10-30').isBetween('2016-10-30', '2016-12-30', null, '[)'); //true
moment('2016-10-30').isBetween('2016-01-01', '2016-10-30', null, '()'); //false
moment('2016-10-30').isBetween('2016-01-01', '2016-10-30', null, '(]'); //true
moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true

Note that in the event that the from and to parameters are the same, but the inclusivity parameters are different, false will preside.

moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '(]'); //false

If the inclusivity parameter is not specified, Moment will default to () .

Is Daylight Saving Time 1.2.0+

moment().isDST();

moment#isDST checks if the current moment is in daylight saving time.

moment([2011, 2, 12]).isDST(); // false, March 12 2011 is not DST
moment([2011, 2, 14]).isDST(); // true, March 14 2011 is DST

Is DST Shifted From 2.3.0, Deprecated 2.14.0

moment('2013-03-10 2:30', 'YYYY-MM-DD HH:mm').isDSTShifted()

Note: As of version 2.14.0 this function is deprecated . It doesn't give the right answer after modifying the moment object. For more information refer to moment/3160

Another important piece of validation is to know if the date has been moved by a DST. For example, in most of the United States:

moment('2013-03-10 2:30', 'YYYY-MM-DD HH:mm').format(); //=> '2013-03-10T01:30:00-05:00'

This is because daylight saving time shifts the time from 2:00 to 3:00, so 2:30 isn't a real time. The resulting time is browser-dependent, either adjusting the time forward or backwards. Use moment#isDSTShifted to test for this condition.

Note: before 2.3.0 , Moment objects in this condition always returned false for moment#isValid ; they now return true .

Is Leap Year 1.0.0+

moment().isLeapYear();

moment#isLeapYear returns true if that year is a leap year, and false if it is not.

moment([2000]).isLeapYear() // true
moment([2001]).isLeapYear() // false
moment([2100]).isLeapYear() // false

Is a Moment 1.5.0+

moment.isMoment(obj);

To check if a variable is a moment object, use moment.isMoment() .

moment.isMoment() // false
moment.isMoment(new Date()) // false
moment.isMoment(moment()) // true

From version 2.11.0 , you can also test for a moment object by instanceof operator:

moment() instanceof moment // true

Is a Date 2.9.0+

moment.isDate(obj);

To check if a variable is a native js Date object, use moment.isDate() .

moment.isDate(); // false
moment.isDate(new Date()); // true
moment.isDate(moment()); // false

i18n

Moment.js has robust support for internationalization.

You can load multiple locales and easily switch between them.

In addition to assigning a global locale, you can assign a locale to a specific moment.

Changing locale globally 1.0.0+

// From 2.8.1 onward
moment.locale(String);
moment.locale(String[]);
moment.locale(String, Object);

// Deprecated in 2.8.1
moment.lang(String);
moment.lang(String[]);
moment.lang(String, Object);

By default, Moment.js comes with English (United States) locale strings. If you need other locales, you can load them into Moment.js for later use.

To load a locale, pass the key and the string values to moment.locale .

More details on each of the parts of the locale bundle can be found in the customization section.

moment.locale('fr', {
    months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
    monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
    monthsParseExact : true,
    weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
    weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
    weekdaysMin : 'Di_Lu_Ma_Me_Je_Ve_Sa'.split('_'),
    weekdaysParseExact : true,
    longDateFormat : {
        LT : 'HH:mm',
        LTS : 'HH:mm:ss',
        L : 'DD/MM/YYYY',
        LL : 'D MMMM YYYY',
        LLL : 'D MMMM YYYY HH:mm',
        LLLL : 'dddd D MMMM YYYY HH:mm'
    },
    calendar : {
        sameDay : '[Aujourd’hui à] LT',
        nextDay : '[Demain à] LT',
        nextWeek : 'dddd [à] LT',
        lastDay : '[Hier à] LT',
        lastWeek : 'dddd [dernier à] LT',
        sameElse : 'L'
    },
    relativeTime : {
        future : 'dans %s',
        past : 'il y a %s',
        s : 'quelques secondes',
        m : 'une minute',
        mm : '%d minutes',
        h : 'une heure',
        hh : '%d heures',
        d : 'un jour',
        dd : '%d jours',
        M : 'un mois',
        MM : '%d mois',
        y : 'un an',
        yy : '%d ans'
    },
    dayOfMonthOrdinalParse : /\d{1,2}(er|e)/,
    ordinal : function (number) {
        return number + (number === 1 ? 'er' : 'e');
    },
    meridiemParse : /PD|MD/,
    isPM : function (input) {
        return input.charAt(0) === 'M';
    },
    // In case the meridiem units are not separated around 12, then implement
    // this function (look at locale/id.js for an example).
    // meridiemHour : function (hour, meridiem) {
    //     return /* 0-23 hour, given meridiem token and hour 1-12 */ ;
    // },
    meridiem : function (hours, minutes, isLower) {
        return hours < 12 ? 'PD' : 'MD';
    },
    week : {
        dow : 1, // Monday is the first day of the week.
        doy : 4  // The week that contains Jan 4th is the first week of the year.
    }
});

Once you load a locale, it becomes the active locale. To change active locales, simply call moment.locale with the key of a loaded locale.

moment.locale('fr');
moment(1316116057189).fromNow(); // il y a une heure
moment.locale('en');
moment(1316116057189).fromNow(); // an hour ago

As of 2.21.0 , Moment will console.warn if the locale is unavailable.

As of 2.8.0 , changing the global locale doesn't affect existing instances.

moment.locale('fr');
var m = moment(1316116057189);
m.fromNow(); // il y a une heure

moment.locale('en');
m.fromNow(); // il y a une heure
moment(1316116057189).fromNow(); // an hour ago

moment.locale returns the locale used. This is useful because Moment won't change locales if it doesn't know the one you specify.

moment.locale('fr'); // 'fr'
moment.locale('tq'); // 'fr'

You may also specify a list of locales, and Moment will use the first one it has localizations for.

moment.locale(['tq', 'fr']); // 'fr'

Moment will also try locale specifier substrings from most-specific to least-specific until it finds a locale it knows. This is useful when supplying Moment with a locale string pulled from the user's environment, such as window.navigator.language .

moment.locale('en-NZ'); // 'en'

Finally, Moment will search intelligently through an array of locales and their substrings.

moment.locale(['en-NZ', 'en-AU']); // 'en-au', not 'en'

Changing locales locally 1.7.0+

// From version 2.8.1 onward
moment().locale(String|Boolean);

// Deprecated version 2.8.1
moment().lang(String|Boolean);

A global locale configuration can be problematic when passing around moments that may need to be formatted into different locale.

In 1.7.0 we added instance specific locale configurations.

moment.locale('en'); // default the locale to English
var localLocale = moment();

localLocale.locale('fr'); // set this instance to use French
localLocale.format('LLLL'); // dimanche 15 juillet 2012 11:01
moment().format('LLLL'); // Sunday, July 15 2012 11:01 AM

moment.locale('es'); // change the global locale to Spanish
localLocale.format('LLLL'); // dimanche 15 juillet 2012 11:01
moment().format('LLLL'); // Domingo 15 Julio 2012 11:01

localLocale.locale(false); // reset the instance locale
localLocale.format('LLLL'); // Domingo 15 Julio 2012 11:01
moment().format('LLLL'); // Domingo 15 Julio 2012 11:01

If you call moment#locale with no parameters, you get back the locale configuration that would be used for that moment.

var fr = moment().locale('fr');
fr.localeData().months(moment([2012, 0])) // "janvier"
fr.locale('en');
fr.localeData().months(moment([2012, 0])) // "January"

If you need to access the locale data for a moment, this is the preferred way to do so.

As of 2.3.0 , you can also specify an array of locale identifiers. It works the same was it does in the global locale configuration .

Loading locales in NodeJS 1.0.0+

moment.locale(String);

Loading locales in NodeJS is super easy. If there is a locale file in moment-root/locale/ named after that key, the first call to moment.locale will load it.

var moment = require('moment');
moment.locale('fr');
moment(1316116057189).fromNow(); // il y a une heure

If you want your locale supported, create a pull request to the develop branch with the required locale and unit test files .

Loading locales in the browser 1.0.0+

// From 2.8.1 onward
moment.locale(String, Object);

// Deprecated in 2.8.1
moment.lang(String, Object);

Loading locales in the browser just requires you to include the locale files. Be sure to specify the charset to prevent encoding issues.

<script src="moment.js"></script>
<script src="locale/fr.js" charset="UTF-8"></script>
<script src="locale/pt.js" charset="UTF-8"></script>
<script>
  moment.locale('fr');  // Set the default/global locale
  // ...
</script>

There are minified versions of all locales together:

<script src="moment.js"></script>
<script src="min/locales.js" charset="UTF-8"></script>

To minimize HTTP requests, use our Grunt task to compile Moment with a custom list of locales:

grunt transpile:fr,it
<script src="min/moment-with-locales.custom.js" charset="UTF-8"></script>

If you are using JSPM as plugin manager, you should add the locale in your lib.

import * as moment from 'moment';
import 'moment/locale/fr';

Note: Locale files are defined in UMD style, so they should work seamlessly in all environments.

Adding your locale to Moment.js

To add your locale to Moment.js, submit a pull request with both a locale file and a test file. You can find examples in moment/src/locale/fr.js and moment/src/test/locale/fr.js .

To run the tests in Node.js, do npm install , then grunt .

If all the tests pass, submit a pull request, and thank you for contributing!

Checking the current Moment.js locale 1.6.0+

// From version 2.8.1 onward
moment.locale();

// Deprecated in version 2.8.1
moment.lang();

If you are changing locales frequently, you may want to know what locale is currently being used. This is as simple as calling moment.locale without any parameters.

moment.locale('en'); // set to english
moment.locale(); // returns 'en'
moment.locale('fr'); // set to french
moment.locale(); // returns 'fr'

As of version 2.12.0 it is possible to list all locales that have been loaded and are available to use:

moment.locales()

Listing the months and weekdays of the current Moment.js locale 2.3.0+

moment.months()
moment.monthsShort()
moment.weekdays()
moment.weekdaysShort()
moment.weekdaysMin()

It is sometimes useful to get the list of months or weekdays in a locale, for example when populating a dropdown menu.

moment.months();

Returns the list of months in the current locale.

[ 'January',
  'February',
  'March',
  'April',
  'May',
  'June',
  'July',
  'August',
  'September',
  'October',
  'November',
  'December' ]

Similarly, moment.monthsShort returns abbreviated month names, and moment.weekdays , moment.weekdaysShort , moment.weekdaysMin return lists of weekdays.

You can pass an integer into each of those functions to get a specific month or weekday.

moment.weekdays(3); // 'Wednesday'

As of 2.13.0 you can pass a bool as the first parameter of the weekday functions. If true, the weekdays will be returned in locale specific order. For instance, in the Arabic locale, Saturday is the first day of the week, thus:

moment.locale('ar');
moment.weekdays(true); // lists weekdays Saturday-Friday in Arabic
moment.weekdays(true, 2); //will result in Monday in Arabic

Note: Absent the locale specific parameter, weekdays always have Sunday as index 0, regardless of the local first day of the week.

Some locales make special considerations into account when formatting month names. For example, Dutch formats month abbreviations without a trailing period, but only if it's formatting the month between dashes. The months method supports passing a format in so that the months will be listed in the proper context.

moment.locale('nl');
moment.monthsShort(); // ['jan.', 'feb.', 'mrt.', ...]
moment.monthsShort('-MMM-'); // [ 'jan', 'feb', 'mrt', ...]

And finally, you can combine both the format option and the integer option.

moment.monthsShort('-MMM-', 3); // 'apr'

Accessing locale specific functionality 2.8.0+

localeData = moment.localeData()
localeData.months()
localeData.monthsShort()
localeData.monthsParse()
localeData.weekdays()
localeData.weekdaysShort()
localeData.weekdaysMin()
localeData.weekdaysParse()
localeData.longDateFormat()
localeData.isPM()
localeData.meridiem()
localeData.calendar()
localeData.relativeTime()
localeData.pastFuture()
localeData.ordinal()
localeData.preparse()
localeData.postformat()
localeData.week()
localeData.invalidDate()
localeData.firstDayOfWeek()
localeData.firstDayOfYear()

You can access the properties of the currently loaded locale through the moment.localeData(key) function. It returns the current locale or a locale with the given key:

// get current locale
var currentLocaleData = moment.localeData();
var frLocaleData = moment.localeData('fr');

The returned object has the following methods:

localeData.months(aMoment);  // full month name of aMoment
localeData.monthsShort(aMoment);  // short month name of aMoment
localeData.monthsParse(longOrShortMonthString);  // returns month id (0 to 11) of input
localeData.weekdays(aMoment);  // full weekday name of aMoment
localeData.weekdaysShort(aMoment);  // short weekday name of aMoment
localeData.weekdaysMin(aMoment);  // min weekday name of aMoment
localeData.weekdaysParse(minShortOrLongWeekdayString);  // returns weekday id (0 to 6) of input
localeData.longDateFormat(dateFormat);  // returns the full format of abbreviated date-time formats LT, L, LL and so on
localeData.isPM(amPmString);  // returns true iff amPmString represents PM
localeData.meridiem(hours, minutes, isLower);  // returns am/pm string for particular time-of-day in upper/lower case
localeData.calendar(key, aMoment);  // returns a format that would be used for calendar representation. Key is one of 'sameDay', 'nextDay', 'lastDay', 'nextWeek', 'prevWeek', 'sameElse'
localeData.relativeTime(number, withoutSuffix, key, isFuture);  // returns relative time string, key is on of 's', 'm', 'mm', 'h', 'hh', 'd', 'dd', 'M', 'MM', 'y', 'yy'. Single letter when number is 1.
localeData.pastFuture(diff, relTime);  // convert relTime string to past or future string depending on diff
localeData.ordinal(number);  // convert number to ordinal string 1 -> 1st
localeData.preparse(str);  // called before parsing on every input string
localeData.postformat(str);  // called after formatting on every string
localeData.week(aMoment);  // returns week-of-year of aMoment
localeData.invalidDate();  // returns a translation of 'Invalid date'
localeData.firstDayOfWeek();  // 0-6 (Sunday to Saturday)
localeData.firstDayOfYear();  // 0-15 this and the first day of week are used
                              // to determine which is the first week of the
                              // year. dow == 1 and doy == 4 means week starts
                              // Monday and first week that has Thursday is the
                              // first week of the year (but doy is NOT simply
                              // Thursday).

Pseudo Locale 2.13.0+

moment.locale('x-pseudo')

As of version 2.13.0 moment optionally includes a pseudo locale. This locale will populate the dates with very obviously changed data. Pseudo locales can be useful when testing, as they make obvious what data has and has not been localized. Just include the pseudo-locale, and set moment's locale to x-pseudo. Text from Moment will be very easy to spot.

moment.locale('x-pseudo');
moment().format('LLL'); //14 F~ébrú~árý 2010 15:25
moment().fromNow(); //'á ~féw ~sécó~ñds á~gó'
moment().calendar(); //'T~ódá~ý át 02:00'

Customize

Moment.js is very easy to customize. In general, you should create a locale setting with your customizations.

moment.locale('en-my-settings', {
    // customizations.
});

You can remove a previously defined locale by passing null as the second argument. The deleted locale will no longer be available for use.

moment.locale('fr'); // 'fr'
moment.locale('en'); // 'en'
moment.locale('fr', null);
moment.locale('fr'); // 'en'

As of 2.12.0 it is possible to create a locale that inherits from a parent locale.

moment.defineLocale('en-foo', {
  parentLocale: 'en',
  /* */
});

Properties that are not specified in the locale will be inherited from the parent locale.

As of 2.16.0 it is possible to define a locale with a parent that hasn't itself been defined or loaded.

moment.defineLocale('fakeLocale', {parentLocale:'xyz'})

As of 2.21.0 when attempting to create a moment with the newly defined locale, moment will attempt to lazy load the parent if it exists. Failing that it will default the parent to the global locale.

As of 2.12.0 it is also possible to update a locale's properties.

moment.updateLocale('en', {
  /**/
});

Any properties specified will be updated, while others will remain the same. This function does not affect moments that already exist.

To revert an update use:

moment.updateLocale('en', null);

2.12.0 deprecated using moment.locale() to change an existing locale. Use moment.updateLocale() instead.

Month Names 1.0.0+

// From 2.12.0 onward
moment.updateLocale('en', {
    months : String[]
});
moment.updateLocale('en', {
    months : Function
});
moment.updateLocale('en', {
    months : {
        format : String[],
        standalone : String[]
    }
});
// From 2.11.0
moment.locale('en', {
    months : {
        format : String[],
        standalone : String[]
    }
});
// From 2.8.1 to 2.11.2
moment.locale('en', {
    months : String[]
});
moment.locale('en', {
    months : Function
});

// Deprecated in 2.8.1
moment.lang('en', {
    months : String[]
});
moment.lang('en', {
    months : Function
});

Locale#months should be an array of the month names.

moment.updateLocale('en', {
    months : [
        "January", "February", "March", "April", "May", "June", "July",
        "August", "September", "October", "November", "December"
    ]
});

If you need more processing to calculate the name of the month, (for example, if there is different grammar for different formats), Locale#months can be a function with the following signature. It should always return a month name.

moment.updateLocale('en', {
    months : function (momentToFormat, format) {
        // momentToFormat is the moment currently being formatted
        // format is the formatting string
        if (/^MMMM/.test(format)) { // if the format starts with 'MMMM'
            return nominative[momentToFormat.month()];
        } else {
            return subjective[momentToFormat.month()];
        }
    }
});

From version 2.11.0 months can also be an object, specifying standalone and format forms (nominative and accusative). The regular expression that is run on the format to check whether to use the format form is /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/ . From version 2.14.0 a different one can be specified with the isFormat key.

moment.updateLocale('en', {
    months : {
         format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split('_'),
         standalone: 'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split('_'),
         isFormat: /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?|MMMM?(\[[^\[\]]*\]|\s+)+D[oD]?/  // from 2.14.0
    }
});

Month Abbreviations 1.0.0+

// From 2.12.0 onward
moment.updateLocale('en', {
    monthsShort : String[]
});
moment.updateLocale('en', {
    monthsShort : Function
});
moment.updateLocale('en', {
    monthsShort : {
        format: String[],
        standalone : String[]
    }
});
// From 2.11.0
moment.locale('en', {
    monthsShort : {
        format: String[],
        standalone : String[]
    }
});
// From 2.8.1 to 2.11.2
moment.locale('en', {
    monthsShort : String[]
});
moment.locale('en', {
    monthsShort : Function
});

// Deprecated in 2.8.1
moment.lang('en', {
    monthsShort : String[]
});
moment.lang('en', {
    monthsShort : Function
});

Locale#monthsShort should be an array of the month abbreviations.

moment.updateLocale('en', {
    monthsShort : [
        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
    ]
});

Like Locale#months , Locale#monthsShort can be a callback function as well.

moment.updateLocale('en', {
    monthsShort : function (momentToFormat, format) {
        if (/^MMMM/.test(format)) {
            return nominative[momentToFormat.month()];
        } else {
            return subjective[momentToFormat.month()];
        }
    }
});

Note: From version 2.11.0 , like Locale#months , Locale#monthsShort can be an object with standalone and format cases.

moment.updateLocale('en', {
    monthsShort : {
        format: 'янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек'.split('_'),
        standalone: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split('_')
    }
});

Weekday Names 1.0.0+

// From version 2.12.0 onward
moment.updateLocale('en', {
    weekdays : String[]
});
moment.updateLocale('en', {
    weekdays : Function
});
moment.updateLocale('en', {
    weekdays : {
        standalone : String[],
        format : String[],
        isFormat : RegExp
    }
});
// From version 2.11.0
moment.locale('en', {
    weekdays : {
        standalone : String[],
        format : String[],
        isFormat : Boolean
    }
});
// From version 2.8.1 to 2.11.2
moment.locale('en', {
    weekdays : String[]
});
moment.locale('en', {
    weekdays : Function
});

// Deprecated version 2.8.1
moment.lang('en', {
    weekdays : String[]
});
moment.lang('en', {
    weekdays : Function
});

Locale#weekdays should be an array of the weekdays names.

moment.updateLocale('en', {
    weekdays : [
        "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
    ]
});

Locale#weekdays can be a callback function as well.

moment.updateLocale('en', {
    weekdays : function (momentToFormat, format) {
        return weekdays[momentToFormat.day()];
    }
});

Note: From version 2.11.0 format/standalone cases can be passed as well. isFormat will be used against the full format string to determine which form to use.

moment.updateLocale('en', {
    weekdays : {
        standalone: 'Воскресенье_Понедельник_Вторник_Среда_Четверг_Пятница_Суббота'.split('_'),
        format: 'Воскресенье_Понедельник_Вторник_Среду_Четверг_Пятницу_Субботу'.split('_'),
        isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/
    }
});

Weekday Abbreviations 1.0.0+

// From 2.12.0 onward
moment.updateLocale('en', {
    weekdaysShort : String[]
});
moment.updateLocale('en', {
    weekdaysShort : Function
});
// From 2.8.1 to 2.11.2
moment.locale('en', {
    weekdaysShort : String[]
});
moment.locale('en', {
    weekdaysShort : Function
});

// Deprecated in 2.8.1
moment.lang('en', {
    weekdaysShort : String[]
});
moment.lang('en', {
    weekdaysShort : Function
});

Locale#weekdaysShort should be an array of the weekdays abbreviations.

moment.updateLocale('en', {
    weekdaysShort : ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
});

Locale#weekdaysShort can be a callback function as well.

moment.updateLocale('en', {
    weekdaysShort : function (momentToFormat, format) {
        return weekdaysShort[momentToFormat.day()];
    }
});

Minimal Weekday Abbreviations 1.7.0+

// From 2.12.0 onward
moment.updateLocale('en', {
    weekdaysMin : String[]
});
moment.updateLocale('en', {
    weekdaysMin : Function
});

// From 2.8.1 to 2.11.2
moment.locale('en', {
    weekdaysMin : String[]
});
moment.locale('en', {
    weekdaysMin : Function
});

// Deprecated in 2.8.1
moment.lang('en', {
    weekdaysMin : String[]
});
moment.lang('en', {
    weekdaysMin : Function
});

Locale#weekdaysMin should be an array of two letter weekday abbreviations. The purpose of these is for things like calendar pickers, thus they should be as small as possible.

moment.updateLocale('en', {
    weekdaysMin : ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]
});

Locale#weekdaysMin can be a callback function as well.

moment.updateLocale('en', {
    weekdaysMin : function (momentToFormat, format) {
        return weekdaysMin[momentToFormat.day()];
    }
});

Long Date Formats 1.1.0+

// From 2.12.0 onward
moment.updateLocale('en', {
    weekdaysMin : String[]
});
moment.updateLocale('en', {
    weekdaysMin : Function
});

// From 2.8.1 to 2.11.2
moment.locale('en', {
    longDateFormat : Object
});

// Deprecated in 2.8.1
moment.lang('en', {
    longDateFormat : Object
});

Locale#longDateFormat should be an object containing a key/value pair for each long date format L LL LLL LLLL LT LTS . LT should be the time format, and is also used for moment#calendar .

moment.updateLocale('en', {
    longDateFormat : {
        LT: "h:mm A",
        LTS: "h:mm:ss A",
        L: "MM/DD/YYYY",
        l: "M/D/YYYY",
        LL: "MMMM Do YYYY",
        ll: "MMM D YYYY",
        LLL: "MMMM Do YYYY LT",
        lll: "MMM D YYYY LT",
        LLLL: "dddd, MMMM Do YYYY LT",
        llll: "ddd, MMM D YYYY LT"
    }
});

You can eliminate the lowercase l tokens and they will be created automatically by replacing long tokens with the short token variants.

moment.updateLocale('en', {
    longDateFormat : {
        LT: "h:mm A",
        LTS: "h:mm:ss A",
        L: "MM/DD/YYYY",
        LL: "MMMM Do YYYY",
        LLL: "MMMM Do YYYY LT",
        LLLL: "dddd, MMMM Do YYYY LT"
    }
});

Relative Time 1.0.0+

// From 2.12.0 onward
moment.updateLocale('en', {
    relativeTime : Object
});
// From 2.8.1 to 2.11.2
moment.locale('en', {
    relativeTime : Object
});

// Deprecated in 2.8.1
moment.lang('en', {
    relativeTime : Object
});

Locale#relativeTime should be an object of the replacement strings for moment#from .

moment.updateLocale('en', {
    relativeTime : {
        future: "in %s",
        past:   "%s ago",
        s  : 'a few seconds',
        ss : '%d seconds',
        m:  "a minute",
        mm: "%d minutes",
        h:  "an hour",
        hh: "%d hours",
        d:  "a day",
        dd: "%d days",
        M:  "a month",
        MM: "%d months",
        y:  "a year",
        yy: "%d years"
    }
});

Locale#relativeTime.future refers to the prefix/suffix for future dates, and Locale#relativeTime.past refers to the prefix/suffix for past dates. For all others, a single character refers to the singular, and a double character refers to the plural.

If a locale requires additional processing for a token, it can set the token as a function with the following signature. The function should return a string.

function (number, withoutSuffix, key, isFuture) {
    return string;
}

The key argument refers to the replacement key in the Locale#relativeTime object. (eg. sm mm h , etc.)

The number argument refers to the number of units for that key. For m , the number is the number of minutes, etc.

The withoutSuffix argument will be true if the token will be displayed without a suffix, and false if it will be displayed with a suffix. (The reason for the inverted logic is because the default behavior is to display with the suffix.)

The isFuture argument will be true if it is going to use the future suffix/prefix and false if it is going to use the past prefix/suffix. The isFuture argument was added in version 1.6.0 .

AM/PM 1.6.0+

// From 2.12.0 onward
moment.updateLocale('en', {
    meridiem : Function
});
// From 2.8.1 to 2.11.2
moment.locale('en', {
    meridiem : Function
});

// Deprecated in 2.8.1
moment.lang('en', {
    meridiem : Function
});

If your locale uses 'am/pm', Locale#meridiem can be omitted, as those values are the defaults.

If your locale needs any different computation for am/pm, Locale#meridiem should be a callback function that returns the correct string based on hour, minute, and upper/lowercase.

moment.updateLocale('zh-cn', {
    meridiem : function (hour, minute, isLowercase) {
        if (hour < 9) {
            return "早上";
        } else if (hour < 11 && minute < 30) {
            return "上午";
        } else if (hour < 13 && minute < 30) {
            return "中午";
        } else if (hour < 18) {
            return "下午";
        } else {
            return "晚上";
        }
    }
});

Before version 1.6.0 , Locale#meridiem was a map of upper and lowercase versions of am/pm.

moment.updateLocale('en', {
    meridiem : {
        am : 'am',
        AM : 'AM',
        pm : 'pm',
        PM : 'PM'
    }
});

This has been deprecated. The 1.6.0 callback function syntax is now used instead.

AM/PM Parsing 2.1.0+

// From 2.12.0 onward
moment.updateLocale('en', {
    meridiemParse : RegExp
    isPM : Function
});

// From 2.8.1 to 2.11.2
moment.locale('en', {
    meridiemParse : RegExp
    isPM : Function
});

// Deprecated in 2.8.1
moment.lang('en', {
    meridiemParse : RegExp
    isPM : Function
});

Locale#isPM should return true if the input string is past 12 noon. This is used in parsing the a A tokens.

moment.updateLocale('en', {
    isPM : function (input) {
        return ((input + '').toLowerCase()[0] === 'p');
    }
});

To configure what strings should be parsed as input, set the meridiemParse property.

moment.updateLocale('en', {
    meridiemParse : /[ap]\.?m?\.?/i
});

Calendar 1.3.0+

// From 2.12.0 onward
moment.updateLocale('en', {
    calendar : Object
});
// From 2.8.1 to 2.11.2
moment.locale('en', {
    calendar : Object
});

// Deprecated in 2.8.1
moment.lang('en', {
    calendar : Object
});

Locale#calendar should have the following formatting strings.

moment.locale('en', {
    calendar : {
        lastDay : '[Yesterday at] LT',
        sameDay : '[Today at] LT',
        nextDay : '[Tomorrow at] LT',
        lastWeek : '[last] dddd [at] LT',
        nextWeek : 'dddd [at] LT',
        sameElse : 'L'
    }
});

Each of the Locale#calendar keys can also be a callback function with the scope of the current moment and first argument a moment that depicts now. It should return a formatting string.

function callback (now) {
    return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
}

Calendar Format 2.14.0+

moment.calendarFormat = Function

This lets you modify the tokens used by calendar .

moment.calendarFormat = function (myMoment, now) {
    var diff = myMoment.diff(now, 'days', true);
    var nextMonth = now.clone().add(1, 'month');

    var retVal =  diff < -6 ? 'sameElse' :
        diff < -1 ? 'lastWeek' :
        diff < 0 ? 'lastDay' :
        diff < 1 ? 'sameDay' :
        diff < 2 ? 'nextDay' :
        diff < 7 ? 'nextWeek' :
        // introduce thisMonth and nextMonth
        (myMoment.month() === now.month() && myMoment.year() === now.year()) ? 'thisMonth' :
        (nextMonth.month() === myMoment.month() && nextMonth.year() === myMoment.year()) ? 'nextMonth' : 'sameElse';
    return retVal;
};

Ordinal 1.0.0+

// From 2.12.0 onward
moment.updateLocale('en', {
    ordinal : Function
});
// From 2.8.1 to 2.11.2
moment.locale('en', {
    ordinal : Function
});

// Deprecated in 2.8.1
moment.lang('en', {
    ordinal : Function
});

Locale#ordinal should be a function that returns the ordinal for a given number.

moment.updateLocale('en', {
    ordinal : function (number, token) {
        var b = number % 10;
        var output = (~~ (number % 100 / 10) === 1) ? 'th' :
            (b === 1) ? 'st' :
            (b === 2) ? 'nd' :
            (b === 3) ? 'rd' : 'th';
        return number + output;
    }
});

As of 2.0.0 , the ordinal function should return both the number and the ordinal. Previously, only the ordinal was returned.

As of 2.1.0 , the token parameter was added. It is a string of the token that is being ordinalized, for example: M or d .

For more information on ordinal numbers, see Wikipedia .

Relative Time Thresholds 2.7.0+

moment.relativeTimeThreshold(unit);  // getter
moment.relativeTimeThreshold(unit, limit);  // setter

duration.humanize has thresholds which define when a unit is considered a minute, an hour and so on. For example, by default more than 45 seconds is considered a minute, more than 22 hours is considered a day and so on. To change those cutoffs use moment.relativeTimeThreshold(unit, limit) where unit is one of ss , s , m , h , d , M .

unit المعنى usage
SS a few seconds least number of seconds to be considered seconds. Must be set after setting the s unit or without setting the s unit.
الصورة ثواني least number of seconds to be considered a minute.
م minutes least number of minutes to be considered an hour.
ح hours least number of hours to be considered a day.
د أيام least number of days to be considered a month.
M months least number of months to be considered a year.
  // Retrieve existing thresholds
  moment.relativeTimeThreshold('ss'); // 44
  moment.relativeTimeThreshold('s');  // 45
  moment.relativeTimeThreshold('m');  // 45
  moment.relativeTimeThreshold('h');  // 22
  moment.relativeTimeThreshold('d');  // 26
  moment.relativeTimeThreshold('M');  // 11

  // Set new thresholds
  moment.relativeTimeThreshold('ss', 3);
  moment.relativeTimeThreshold('s', 40);
  moment.relativeTimeThreshold('m', 40);
  moment.relativeTimeThreshold('h', 20);
  moment.relativeTimeThreshold('d', 25);
  moment.relativeTimeThreshold('M', 10);

Note: Retrieving thresholds was added in 2.8.1 .

Note: Retrieving and setting ss threshold was added in 2.18.0 .

Relative Time Rounding 2.14.0+

moment.relativeTimeRounding();  // getter
moment.relativeTimeRounding(fn);  // setter

duration.humanize rounds a possibly double value before supplying it to the relativeTime format string specified in the locale. To control the rounding you can use moment.relativeTimeRounding .

var roundingDefault = moment.relativeTimeRounding();

// Round relative time evaluation down
moment.relativeTimeRounding(Math.floor);

moment.relativeTimeThreshold('s', 60);
moment.relativeTimeThreshold('m', 60);
moment.relativeTimeThreshold('h', 24);
moment.relativeTimeThreshold('d', 31);
moment.relativeTimeThreshold('M', 12);

var a = moment();
a.subtract({hours: 23, minutes: 59, seconds: 59});
a.toNow()  // == 'in 23 hours'  'Round down towards the nearest hour'

// back to default
moment.relativeTimeRounding(roundingDefault);

You can even choose to do no rounding at all:

var retainValue = function (value) {
    return value;
};
moment.relativeTimeRounding(retainValue);

var a = moment();
a.subtract({hours: 39});
a.toNow() // == 'in 1.625 days', 'Round down towards the nearest year'

Changing Time Source 2.11.0+

moment.now = function () { return +new Date(); }

If you want to change the time that Moment sees, you can specify a method that returns the number of milliseconds since the Unix epoch (January 1, 1970).

The default is:

moment.now = function () {
    return +new Date();
}

This will be used when calling moment() , and the current date used when tokens are omitted from format() . In general, any method that needs the current time uses this under the hood.

Durations

Moment.js also has duration objects. Where a moment is defined as single points in time, durations are defined as a length of time.

Durations do not have a defined beginning and end date. They are contextless.

A duration is conceptually more similar to '2 hours' than to 'between 2 and 4 pm today'. As such, they are not a good solution to converting between units that depend on context.

For example, a year can be defined as 366 days, 365 days, 365.25 days, 12 months, or 52 weeks. Trying to convert years to days makes no sense without context. It is much better to use moment#diff for calculating days or years between two moments than to use Durations .

Creating 1.6.0+

moment.duration(Number, String);
moment.duration(Number);
moment.duration(Object);
moment.duration(String);

To create a duration, call moment.duration() with the length of time in milliseconds.

moment.duration(100); // 100 milliseconds

If you want to create a moment with a unit of measurement other than milliseconds, you can pass the unit of measurement as well.

moment.duration(2, 'seconds');
moment.duration(2, 'minutes');
moment.duration(2, 'hours');
moment.duration(2, 'days');
moment.duration(2, 'weeks');
moment.duration(2, 'months');
moment.duration(2, 'years');

The same shorthand for moment#add and moment#subtract works here as well.

مفتاح Shorthand
سنوات ذ
months M
weeks ث
أيام د
hours ح
minutes م
ثواني الصورة
milliseconds ms

Much like moment#add , you can pass an object of values if you need multiple different units of measurement.

moment.duration({
    seconds: 2,
    minutes: 2,
    hours: 2,
    days: 2,
    weeks: 2,
    months: 2,
    years: 2
});

As of 2.1.0 , moment supports parsing ASP.NET style time spans. The following formats are supported.

The format is an hour, minute, second string separated by colons like 23:59:59 . The number of days can be prefixed with a dot separator like so 7.23:59:59 . Partial seconds are supported as well 23:59:59.999 .

moment.duration('23:59:59');
moment.duration('23:59:59.999');
moment.duration('7.23:59:59.999');
moment.duration('23:59'); // added in 2.3.0

As of 2.3.0 , moment also supports parsing ISO 8601 durations.

moment.duration('P1Y2M3DT4H5M6S');
moment.duration('P1M');

As of 2.11.0 , duration format strings with a space between days and rest is supported.

moment.duration('7 23:59:59.999');

As of 2.13.0 , mixed negative and positive signs are supported when parsing durations.

moment.duration('PT-6H3M')

As of 2.18.0 , invalid durations are supported, similarly to invalid moments. To create an invalid duration you can pass NaN for a value of a unit.

In upcoming releases expect invalid durations to cover more cases (like null values for units).

moment.duration(NaN);
moment.duration(NaN, 'days');
moment.duration.invalid();

Clone 2.19.0+

moment.duration().clone();

Create a clone of a duration. Durations are mutable, just like moment objects, so this lets you get a snapshot, at some point in time.

var d1 = moment.duration();
var d2 = d1.clone();
d1.add(1, 'second');
d1.asMilliseconds() !== d2.asMilliseconds();

Humanize 1.6.0+

moment.duration().humanize();

Sometimes, you want all the goodness of moment#from but you don't want to have to create two moments, you just want to display a length of time.

Enter moment.duration().humanize() .

moment.duration(1, "minutes").humanize(); // a minute
moment.duration(2, "minutes").humanize(); // 2 minutes
moment.duration(24, "hours").humanize();  // a day

By default, the return string is suffixless. If you want a suffix, pass in true as seen below.

moment.duration(1, "minutes").humanize(true); // in a minute

For suffixes before now, pass in a negative number.

moment.duration(-1, "minutes").humanize(true); // a minute ago

Invalid durations are humanized to the localized version of Invalid Date .

moment.duration.invalid().humanize(); // Invalid Date

Milliseconds 1.6.0+

moment.duration().milliseconds();
moment.duration().asMilliseconds();

To get the number of milliseconds in a duration, use moment.duration().milliseconds() .

It will return a number between 0 and 999.

moment.duration(500).milliseconds(); // 500
moment.duration(1500).milliseconds(); // 500
moment.duration(15000).milliseconds(); // 0

If you want the length of the duration in milliseconds, use moment.duration().asMilliseconds() instead.

moment.duration(500).asMilliseconds(); // 500
moment.duration(1500).asMilliseconds(); // 1500
moment.duration(15000).asMilliseconds(); // 15000

Seconds 1.6.0+

moment.duration().seconds();
moment.duration().asSeconds();

To get the number of seconds in a duration, use moment.duration().seconds() .

It will return a number between 0 and 59.

moment.duration(500).seconds(); // 0
moment.duration(1500).seconds(); // 1
moment.duration(15000).seconds(); // 15

If you want the length of the duration in seconds, use moment.duration().asSeconds() instead.

moment.duration(500).asSeconds(); // 0.5
moment.duration(1500).asSeconds(); // 1.5
moment.duration(15000).asSeconds(); // 15

Minutes 1.6.0+

moment.duration().minutes();
moment.duration().asMinutes();

As with the other getters for durations, moment.duration().minutes() gets the minutes (0 - 59).

moment.duration().asMinutes() gets the length of the duration in minutes.

Hours 1.6.0+

moment.duration().hours();
moment.duration().asHours();

As with the other getters for durations, moment.duration().hours() gets the hours (0 - 23).

moment.duration().asHours() gets the length of the duration in hours.

Days 1.6.0+

moment.duration().days();
moment.duration().asDays();

As with the other getters for durations, moment.duration().days() gets the days (0 - 30).

moment.duration().asDays() gets the length of the duration in days.

Weeks 1.6.0+

moment.duration().weeks();
moment.duration().asWeeks();

As with the other getters for durations, moment.duration().weeks() gets the weeks (0 - 4).

moment.duration().asWeeks() gets the length of the duration in weeks.

Pay attention that unlike the other getters for duration, weeks are counted as a subset of the days, and are not taken off the days count.

Note: The length of a duration in weeks is defined as 7 days.

Months 1.6.0+

moment.duration().months();
moment.duration().asMonths();

As with the other getters for durations, moment.duration().months() gets the months (0 - 11).

moment.duration().asMonths() gets the length of the duration in months.

Years 1.6.0+

moment.duration().years();
moment.duration().asYears();

As with the other getters for durations, moment.duration().years() gets the years.

moment.duration().asYears() gets the length of the duration in years.

Add Time 2.1.0+

moment.duration().add(Number, String);
moment.duration().add(Number);
moment.duration().add(Duration);
moment.duration().add(Object);

Mutates the original duration by adding time.

The same keys and shorthands used to create durations can be used here as the second argument.

var a = moment.duration(1, 'd');
var b = moment.duration(2, 'd');
a.add(b).days(); // 3

Note that adding an invalid duration to any other duration results in an invalid duration.

Subtract Time 2.1.0+

moment.duration().subtract(Number, String);
moment.duration().subtract(Number);
moment.duration().subtract(Duration);
moment.duration().subtract(Object);

Mutates the original duration by subtracting time.

The same keys and shorthands used to create durations can be used here as the second argument.

var a = moment.duration(3, 'd');
var b = moment.duration(2, 'd');
a.subtract(b).days(); // 1

Note that adding an invalid duration to any other duration results in an invalid duration.

Using Duration with Diff 2.1.0+

var duration = moment.duration(x.diff(y))

You can also use duration with moment#diff to get the duration between two moments. To do so, simply pass the moment#diff method into moment#duration as follows:

  var x = new moment()
  var y = new moment()
  var duration = moment.duration(x.diff(y))
  // returns duration object with the duration between x and y

See here for more information about moment#diff .

As Unit of Time 2.1.0+

moment.duration().as(String);

As an alternate to Duration#asX , you can use Duration#as('x') . All the shorthand keys from moment#add apply here as well.

duration.as('hours');
duration.as('minutes');
duration.as('seconds');
duration.as('milliseconds');

Invalid durations return NaN for all units.

Get Unit of Time 2.1.0+

moment.duration().get(String);

As an alternate to Duration#x() getters, you can use Duration#get('x') . All the shorthand keys from moment#add apply here as well.

duration.get('hours');
duration.get('minutes');
duration.get('seconds');
duration.get('milliseconds');

Invalid durations return NaN for all units.

As JSON 2.9.0+

moment.duration().toJSON();

When serializing a duration object to JSON, it will be represented as an ISO8601 string.

JSON.stringify({
    postDuration : moment.duration(5, 'm')
}); // '{"postDuration":"PT5M"}'

Invalid durations return Invalid Date as json representation.

Is a Duration 1.6.0+

moment.isDuration(obj);

To check if a variable is a moment duration object, use moment.isDuration() .

moment.isDuration() // false
moment.isDuration(new Date()) // false
moment.isDuration(moment()) // false
moment.isDuration(moment.duration()) // true
moment.isDuration(moment.duration(2, 'minutes')) // true

As ISO 8601 String 2.8.0+

moment.duration().toISOString();

Returns duration in string as specified by ISO 8601 standard .

moment.duration(1, 'd').toISOString() // "P1D"

Format PnYnMnDTnHnMnS description:

وحدة Meaning
P P stands for period. Placed at the start of the duration representation.
Y عام
M شهر
د يوم
تي Designator that precedes the time components.
H ساعة
M اللحظة
S Second

Locale 2.17.1+

moment.duration().locale();
moment.duration().locale(String);

You can get or set the locale of a duration using locale(...) . The locale will affect the duration's string methods, like humanize() . See the intl section for more information on internationalization generally.

moment.duration(1, "minutes").locale("en").humanize(); // a minute
moment.duration(1, "minutes").locale("fr").humanize(); // une minute
moment.duration(1, "minutes").locale("es").humanize(); // un minuto

Suffixes in humanize() are also internationalized:

moment.duration(1, "minutes").locale("en").humanize(true); // in a minute
moment.duration(1, "minutes").locale("fr").humanize(true); // dans une minute
moment.duration(1, "minutes").locale("es").humanize(true); // en un minuto

moment.duration(-1, "minutes").locale("en").humanize(true); // a minute ago
moment.duration(-1, "minutes").locale("fr").humanize(true); // il y a une minute
moment.duration(-1, "minutes").locale("es").humanize(true); // hace un minuto

Utilities

Moment exposes some methods which may be useful to people extending the library or writing custom parsers.

Normalize Units 2.3.0+

moment.normalizeUnits(String);

Many of Moment's functions allow the caller to pass in aliases for unit enums. For example, all of the get s below are equivalent.

var m = moment();
m.get('y');
m.get('year');
m.get('years');

If you're extending the library, you may want access to Moment's facilities for that in order to better align your functionality with Moment's.

moment.normalizeUnits('y');      // 'year'
moment.normalizeUnits('Y');      // 'year'
moment.normalizeUnits('year');   // 'year'
moment.normalizeUnits('years');  // 'year'
moment.normalizeUnits('YeARS');  // 'year'

Invalid 2.3.0+

moment.invalid(Object);

You can create your own invalid Moment objects, which is useful in making your own parser.

var m = moment.invalid();
m.isValid();                      // false
m.format();                       // 'Invalid date'
m.parsingFlags().userInvalidated; // true

invalid also accepts an object which specifies which parsing flags to set. This will not set the userInvalidated parsing flag unless it's one of the properties specified.

var m = moment.invalid({invalidMonth: 'Actober'});
m.parsingFlags().invalidMonth; // 'Actober'

You need not specify parsing flags recognized by Moment; the Moment will be invalid nonetheless, and the parsing flags will be returned by parsingFlags() .

Plugins

Some other people have made plugins for Moment.js that may be useful to you.

Strftime

npm install moment-strftime

If you are more comfortable working with strftime instead of LDML-like parsing tokens, you can use Ben Oakes' plugin moment-strftime .

The repository is located at benjaminoakes/moment-strftime .

MSDate

If you are using OLE Automation dates in .NET check out Markit On Demand's moment-msdate . Using this plugin allows you to format OA dates into JavaScript dates and vice-versa.

Convert a moment to an OA date:

moment().toOADate(); // a floating point number

Or, convert an OA date to a moment :

moment.fromOADate(41493); // Wed Aug 07 2013 00:00:00 GMT-0600 (MDT)

More information and detailed docs can be found on GitHub at http://markitondemand.github.io/moment-msdate/ .

Java DateFormat Parser

npm install moment-jdateformatparser

If you want to work with the java.text.DateFormat you can use this plugin.

فمثلا،

moment("2013-12-24 14:30").formatWithJDF("dd.MM.yyyy");  // returns the formatted date "24.12.2013"
moment().toJDFString("DD.MM.YYYY");  // returns the Java format pattern "dd.MM.yyyy"

The repository is located at github.com/MadMG/moment-jdateformatparser .

Date Ranges

npm install moment-range

If you need to work with date ranges, you can use Gianni Chiappetta's plugin moment-range .

Documentation can be found on the homepage github.com/rotaready/moment-range .

And it is also available for the web at the repository below.

The repository is located at github.com/rotaready/moment-range .

Twix

npm install twix

Another range plugin is Isaac Cambron's library Twix . It has many range-related features and excels at formatting ranges readably. فمثلا،

var t = moment("1/25/1982 9:30 AM").twix("1/25/1982 1:30 PM");
t.isCurrent(); // false
t.count('minutes'); // 241
t.format();  // 'Jan 25, 1982, 9:30 AM - 1:30 PM'
t.simpleFormat("h:m"); // '9:30 - 1:30'

Full documentation of all the options and features is here .

It's available on npm like so:

npm install twix

Or just grab the JS file from here .

Precise Range

npm install moment-precise-range-plugin

The Precise Range plugin, written by Rob Dawson , can be used to display exact, human-readable representations of date/time ranges:

moment("2014-01-01 12:00:00").preciseDiff("2015-03-04 16:05:06");
 // 1 year 2 months 3 days 4 hours 5 minutes 6 seconds
moment.preciseDiff("2014-01-01 12:00:00", "2014-04-20 12:00:00");
// 3 months 19 days

To obtain the raw numeric values rather than a string, pass the value true as the third argument to the method:

moment.preciseDiff(m1, m2, true); 
// {years : 0, months : 1, days : 2, hours : 3, minutes : 4, seconds : 5, firstDateWasLater : false}

ISO Calendar

npm install moment-isocalendar

If you are looking for a Python-like isocalendar method, you can use Rocky Meza's plugin

moment-isocalendar

Calling the isocalendar method on a moment will return an array like the following:

[year, week_of_year, day_of_week, minutes_since_midnight]

moment().isocalendar(); // [2012, 8, 5, 870]

You can also reconstruct a moment from a isocalendar array.

moment.fromIsocalendar([2011, 51, 5, 870]).format('LLLL');
// "Friday, December 23 2011 2:30 PM"

The repository is located at github.com/fusionbox/moment-isocalendar .

Jalaali Calendar

npm install moment-jalaali

If you want to work with Jalaali calendar system (Jalali, Persian, Khorshidi or Shamsi), you can use Behrang Noruzi Niya's plugin moment-jalaali .

When installed, it will wrap moment and moment will be able to format and parse Jalaali years and months. Here is a short example:

var m = moment('1360/5/26', 'jYYYY/jM/jD'); // Parse a Jalaali date.
m.format('jYYYY/jM/jD [is] YYYY/M/D'); // 1360/5/26 is 1981/8/17

The repository is located at github.com/behrang/moment-jalaali .

Hijri Calendar

npm install moment-hijri

If you want to work with Hijri calendar then you can use moment-hijri plugin. moment-hijri is a moment plugin for the Hijri lunar calendar based on Umm al-Qura calculations. This plugin is developed by Suhail Alkowaileet .

When you install it, it will wrap moment and you will be able to parse Hijri dates. Here is a short example:

m = moment('1410/8/28', 'iYYYY/iM/iD'); // Parse a Hijri date.
m.format('iYYYY/iM/iD [is] YYYY/M/D'); // 1410/8/28 is 1990/3/25

The repository is located at github.com/xsoh/moment-hijri .

Recur

npm install moment-recur

If you need to work with recurring dates, you can use Casey Trimm's plugin moment-recur .

This plugin will allow you to create length-based intervals (days, weeks, etc.) and calendar-based intervals (daysOfMonth, monthsOfYear, etc.).

It provides a matches function to test whether a date recurs according to the rules set, as well as generator functions to get the next and previous dates in a series.

The repository, documentation, and many more examples can be found at github.com/c-trimm/moment-recur

var interval = moment( "01/01/2014" ).recur().every(2).days(); // Length Interval
interval.matches( "01/03/2014" ); // true
interval.next( 2, "L" ); // ["01/03/2014", "01/05/2014"]
interval.forget( "days" ); // Remove a rule
interval.dayOfMonth( 10 ); // Calendar Interval
interval.matches( "05/10/2014" ); // true
interval.previous( 2, "L" ); // ["12/10/2013", "11/10/2013"]

تغريد

If you're trying to format times for tweets like the way Twitter does, you can use the moment.twitter plugin by @hijonathan .

It's a simple way to display both short and long versions of human-readable timestamps.

moment().subtract(5, 'hours').twitterLong();
// 5 hours

Yes, it does smart pluralization.

moment().subtract(1, 'hour').twitterLong();
// 1 hour

Not short enough for you?

moment().subtract(6, 'days').twitterShort();
// 6d

Fiscal Quarters

If you ever have need for Fiscal , Calendar or Academic quarters, you can use the moment-fquarter plugin by @robgallen .

At its simplest, just call the fquarter method on any moment object. It returns a formatted string with April being the first quarter.

moment("2013-01-01").fquarter();
// Q4 2012/13

You can pass in any month as the starting quarter, eg July

moment("2013-01-01").fquarter(7);
// Q3 2012/13

If you want calendar quarters, start in January

moment("2013-01-01").fquarter(1);
// Q1 2013

Parse Date Format

npm install moment-parseformat

This plugin extracts the format of a date/time string.

var format = moment.parseFormat('Thursday, February 6th, 2014 9:20pm');
// dddd, MMMM Do, YYYY h:mma
moment().format(format); // format

That allows to create smart date inputs that let your users set a Date/Time and lets you extract the user's preferred format for future usage. Find an example usage of it at minutes.io .

The Plugin has been authored by @gr2m . Links: Demo | Source

مستدير - كروي

npm install moment-round

This plugin will round date/time to a given interval.

فمثلا،

var m = new moment(); // 2015-06-18 15:30:19
moment.round(5, 'seconds'); // 2015-06-18 15:30:20
moment.ceil(3, 'minutes'); // 2015-06-18 15:33:00
moment.floor(16, 'hours'); // 2015-06-18 00:00:00
moment.ceil(21, 'hours'); // 2015-06-18 21:00:00
moment.ceil(20, 'hours'); // 2015-06-19 00:00:00

The repository is located at github.com/WebDevTmas/moment-round .

تحول

bower install moment-transform

moment-transform is a plugin that manipulated dates through patterns. You can use basic operations –set/add/subtract– on individual parts (hours, month, …) of a Moment instance.

moment().transform('YYYY-MM-+01 00:00:00.000'); // Tonight at midnight
moment().transform('14:30:00.000'); // Today, 2:30 pm
moment().transform('YYYY-MM--30 00:00:00.000'); // 30 days ago

Optional parameters lets you specify custom patterns and force strict pattern usage (non-alphabetic characters are not mandatory in passed string by default).

moment().transform('+01MMYYYY', 'DD/MM/YYYY', false); // Tomorrow, same time
moment().transform('+01MMYYYY', 'DD/MM/YYYY', true); // Invalid date

You can see it live moment-transform while the repository is here .

Taiwan Calendar

npm install moment-taiwan

If you want to work with Taiwan calendar system , you can use Bradwoo8621's plugin moment-taiwan .

When installed, it will wrap moment and moment will be able to format and parse Taiwan years. Here is a short example:

m = moment('104/01/01', 'tYY/MM/DD') // Parse a Taiwan date
m.format('tYY/MM/DD [is] YYYY/M/D') // 104/01/01 is 2015/01/01

m.twYear() // 104

The repository is located at github.com/bradwoo8621/moment-taiwan .

Duration Format

npm install moment-duration-format

This is a plugin that will allow comprehensive formatting of Moment Durations.

فمثلا،

moment.duration(123, "minutes").format("h:mm");
// "2:03"

The repository is located at github.com/jsmreese/moment-duration-format .

مؤقت

npm install moment-timer

This is a Moment.js plugin that allows the use of timers, which offer much more control than the native JavaScript timers. It's basically a rewrite of JavaScripts own setInterval and setTimeout.

فمثلا،

var timer = moment.duration(5, "seconds").timer({loop: true}, function() {
  // Callback
});

The repository is located at github.com/SeverinDK/moment-timer .

اعمال

npm install moment-business

This is a Moment.js library that allows Moment operations for Western work weeks: 7 day weeks where Saturday and Sunday are non-work days.

فمثلا،

import business from 'moment-business';

// true if the moment is Mon-Fri, false otherwise
business.isWeekDay(someMoment);

// Adds five work days to the Moment
business.addWeekDays(someMoment, 5);

The repository is located at github.com/jmeas/moment-business .

Short Date Formatter

If you want to format times in a short way, you can use the moment-shortformat plugin by @researchgate .

It is based on and similar to the moment.twitter plugin but has a different output.

moment().subtract(5, 'hours').short();
// 5h ago
moment().add(5, 'hours').short();
// in 5h

You can also disable the use of the relative time templates

moment().subtract(1, 'hour').short(false);
// 1h

If the date is too far in the future or the past it will display like that

moment().subtract(500, 'days').short();
// 5 Mar, 1970

原文