Thao tác với Dates và Times sử dụng Moment.js

Giới thiệu

Khi làm việc với dates và times trong javascript cũng không phải lúc nào cũng dễ dàng. Hôm này mình xin giới thiệu một thư viện javascript rất mạnh và tốt sử dùng để phân tích, xác nhận, thao tác và hiển thị dates và times. Đó là Moment.js

Cách cài đặt

Moment.js có thể download miễn phí tại trang chủ của nó: https://momentjs.com/. Hoặc có thể install bằng node module sử dụng command như sau:

npm install moment

Date Formatting

Sử dụng Moment.js để format daté và times giúp bạn viết code đơn giản và dễ dàng hơn nhiều. Ví dụ đơn giản như sau:

moment().format('YYYY MM DD');  // date time hiện tại có format YYYY MM DD
moment("2017-01-01").format("DD MMM YYYY") // 01 Jan 2017

format của date times, bạn có thể tìm thêm ở docs của moment.js.

Date Validation

Sử dụng moment.js để xác nhận date time đưa vào có đúng format là date time không. Sử dụng method isValid() , trả về true/false.

moment("2010 13",           "YYYY MM").isValid();     // false (sai tháng)
moment("2010 11 31",        "YYYY MM DD").isValid();  // false (sai ngày)
moment("2010 2 29",         "YYYY MM DD").isValid();  // false (không phải năm nhuận)
moment("2010 notamonth 29", "YYYY MMM DD").isValid(); // false (sai tên tháng)

Một số cần chú ý là parser của moment.js khá là tha thứ 😃), tức là dù nó phân tích thấy rằng một từ nào đó trong date time đó là đúng, nó sẽ isValid() sẽ trả về true.

moment('2016 is a date', 'YYYY-MM-DD').isValid() //true, 2016 was matched
moment('It is 2012-05-25', 'YYYY-MM-DD').isValid(); // true 2012-05-25 matched

Nếu bạn cần parser của moment chặn chẽ hơn, bạn phải thêm boolean làm arguement cuối cùng.

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

Để biết là nó invalid ở đâu, bạn có thể dùng hàm invalidAt() như sau:

moment("2014-14-01").invalidAt();  // 1 => month
moment("2014-01-32").invalidAt(); // 2 => day

Giá trị trả về như của nó:

1: years
2: months
3: days
4: hours
5: minutes
6: seconds
7: milliseconds

Manipulating Dates

Moment.js cung cấp nhiều hàm quan trọng để thao tác với date time:

Add

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

ví dụ: moment().add(7, 'days'); // trả về object có date time 7 ngày sau moment().add(7, 'd'); // viết tắt như trên

Key Shorthand
years y
quarters Q
months M
weeks w
days d
hours h
minutes m
seconds s
milliseconds ms

Bạn cũng có thể chain hàm trên với nhau:

moment().add(7, 'days').add(1, 'months'); // with chaining

Subtract

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

ví dụ

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

Start 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);

End of Time

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

Time from now

moment().fromNow();   // time ago
moment().fromNow(Boolean); // relative time
moment("2012-01-01").fromNow(); // 6 years ago
moment("2012-01-01").fromNow(true); // 6 years

Time from X

moment().from(Moment|String|Number|Date|Array);
moment().from(Moment|String|Number|Date|Array, Boolean);
var a = moment([2007, 0, 28]);  // có thể viết array or string
var b = moment([2007, 0, 29]); / có thể viết array or string
a.from(b) // "a day ago"

Difference

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

Days in Month

Trả về số ngày của tháng

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

Is Leap Year

Kiểm tra là năm nhuận hay không

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

Get

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

Conclusion

Nhờ việc sử dụng thư viện Moment.js, việc thao tác và làm việc với date times sẽ không phải là vấn đề khó khăn nữa. Bài nay chỉ tóm tắt những ý và method quan trọng và thường dùng với date time, tuy nhiên còn rất nhiều method khác nữa, bạn có thể tham khảo chi tiết tại Moment.js.

https://www.sitepoint.com/managing-dates-times-using-moment-js/ https://momentjs.com/docs/


All Rights Reserved