Lý thuyết → Bài tập

JavaScript Date - Bài giảng

1. Date Objects - Đối tượng ngày tháng

JavaScript cung cấp đối tượng Date để làm việc với ngày và giờ.

  • Tạo ngày hiện tại: new Date()
  • Tạo từ chuỗi ngày: new Date(dateString) (ví dụ: "2025-07-01")
  • Tạo từ số mili-giây: new Date(milliseconds) (số mili-giây từ 1/1/1970)
  • Tạo từ các tham số:
    • new Date(year, month)
    • new Date(year, month, day)
    • new Date(year, month, day, hours)
    • new Date(year, month, day, hours, minutes)
    • new Date(year, month, day, hours, minutes, seconds)
    • new Date(year, month, day, hours, minutes, seconds, ms)
    (Lưu ý: month bắt đầu từ 0, day từ 1)
Ví dụ:
let now = new Date();
let birthday = new Date("2000-12-31");
let custom = new Date(2025, 6, 1, 10, 30, 0);

2. Date Formats - Định dạng ngày tháng

Chuỗi ngày tháng có thể ở nhiều định dạng khác nhau khi tạo đối tượng Date (xem trên).
Để chuyển một đối tượng Date sang chuỗi định dạng mong muốn, dùng các phương thức sau:

  • toLocaleDateString(locales, options) - Chuỗi ngày theo locale và options
  • toLocaleTimeString(locales, options) - Chuỗi giờ theo locale và options
  • toLocaleString(locales, options) - Chuỗi ngày + giờ theo locale và options
  • toISOString() - Chuỗi ISO chuẩn quốc tế
  • toString() - Chuỗi đầy đủ mặc định
Ví dụ: Chuyển Date sang định dạng DD/MM/YYYY
let d = new Date("2025-07-01T10:30:00");
d.toLocaleDateString("vi-VN"); // "01/07/2025"
d.toLocaleString("en-GB");     // "01/07/2025, 10:30:00"
d.toLocaleString("en-US");     // "7/1/2025, 10:30:00 AM"
// Tuỳ chỉnh định dạng:
d.toLocaleDateString("en-GB", { year: 'numeric', month: '2-digit', day: '2-digit' }); // "01/07/2025"
Bảng ký tự định dạng (options) thường dùng:
OptionÝ nghĩaGiá trị mẫu
yearNăm"numeric", "2-digit"
monthTháng"numeric", "2-digit", "long", "short", "narrow"
dayNgày"numeric", "2-digit"
hourGiờ"numeric", "2-digit"
minutePhút"numeric", "2-digit"
secondGiây"numeric", "2-digit"
weekdayThứ"long", "short", "narrow"
timeZoneMúi giờ"Asia/Ho_Chi_Minh", "UTC", ...
Kết hợp các option để định dạng ngày giờ theo ý muốn.

3. Date Methods - Các phương thức của Date

Đối tượng Date có rất nhiều phương thức để lấy, đặt, và xử lý ngày giờ:

Phương thứcÝ nghĩaVí dụ
getFullYear()Lấy năm (4 chữ số)date.getFullYear()
getMonth()Lấy tháng (0-11)date.getMonth()
getDate()Lấy ngày trong tháng (1-31)date.getDate()
getDay()Lấy thứ trong tuần (0=Chủ nhật)date.getDay()
getHours()Lấy giờ (0-23)date.getHours()
getMinutes()Lấy phút (0-59)date.getMinutes()
getSeconds()Lấy giây (0-59)date.getSeconds()
getMilliseconds()Lấy mili-giây (0-999)date.getMilliseconds()
getTime()Lấy số mili-giây từ 1/1/1970date.getTime()
setFullYear(y)Đặt nămdate.setFullYear(2030)
setMonth(m)Đặt tháng (0-11)date.setMonth(0)
setDate(d)Đặt ngày trong thángdate.setDate(15)
toISOString()Chuyển thành chuỗi ISOdate.toISOString()
toLocaleDateString()Chuỗi ngày theo localedate.toLocaleDateString()
toLocaleTimeString()Chuỗi giờ theo localedate.toLocaleTimeString()
toString()Chuỗi đầy đủ ngày giờdate.toString()
Ví dụ sử dụng các phương thức:
let d = new Date("2025-07-01T10:30:00");
d.getFullYear();      // 2025
d.getMonth();         // 6 (tháng 7)
d.getDate();          // 1
d.getDay();           // 2 (thứ 3)
d.getHours();         // 10
d.getMinutes();       // 30
d.toLocaleDateString(); // "01/07/2025" (tùy locale)
d.toISOString();      // "2025-07-01T03:30:00.000Z"

4. Một số ví dụ thực tế

  • Tính số ngày giữa hai ngày:
    let d1 = new Date("2025-07-01");
    let d2 = new Date("2025-08-01");
    let diff = Math.abs(d2 - d1); // số mili-giây giữa hai ngày
    let days = diff / (1000 * 60 * 60 * 24); // số ngày
    // days = 31
    
    Giải thích: Chuyển cả hai ngày về đối tượng Date, lấy hiệu số mili-giây rồi chia cho 86.400.000 (số mili-giây trong 1 ngày). Có thể dùng Math.floor(days) nếu chỉ lấy số ngày nguyên.
    Dùng thư viện dayjs:
    dayjs("2025-08-01").diff(dayjs("2025-07-01"), 'day'); // 31
    Cú pháp đơn giản, trả về số ngày nguyên giữa hai ngày.
  • Chuyển ngày sang định dạng DD/MM/YYYY:
    function formatVN(date) {
        let d = date.getDate().toString().padStart(2, '0');
        let m = (date.getMonth()+1).toString().padStart(2, '0');
        let y = date.getFullYear();
        return `${d}/${m}/${y}`;
    }
    // Gọi thử:
    // formatVN(new Date("2025-07-01")); // "01/07/2025"
    
Lưu ý: Tháng trong JavaScript bắt đầu từ 0 (tháng 1 là 0, tháng 12 là 11).

5. Tổng kết

  • Date là đối tượng chuẩn để làm việc với ngày giờ trong JS.
  • Nên dùng định dạng ISO khi tạo ngày.
  • Các phương thức get, set, toString, toLocaleDateString rất hữu ích.
  • Chú ý tháng bắt đầu từ 0.
Chú ý về Timezone: Khi làm việc với Date trong JavaScript, dữ liệu ngày giờ luôn được lưu trữ theo chuẩn UTC (múi giờ quốc tế). Khi hiển thị, trình duyệt sẽ tự động chuyển sang múi giờ của máy người dùng (client). Nếu muốn chuyển đổi sang múi giờ khác hoặc lấy đúng giờ theo client, hãy sử dụng các phương thức toLocaleString, toLocaleDateString với tham số localesoptions.
Ví dụ: Chuyển đổi ngày sang múi giờ mong muốn
let d = new Date("2025-07-01T10:00:00Z");
// Hiển thị theo múi giờ máy client (ví dụ: Asia/Ho_Chi_Minh)
d.toLocaleString("vi-VN", { timeZone: "Asia/Ho_Chi_Minh" }); // "01/07/2025, 17:00:00"
// Hiển thị theo múi giờ New York
d.toLocaleString("en-US", { timeZone: "America/New_York" }); // "07/01/2025, 06:00:00 AM"
Format date theo ký tự dd/mm/yyyy hh:ii
JavaScript không hỗ trợ trực tiếp format date theo chuỗi ký tự như dd/mm/yyyy hh:ii (giống PHP, MySQL, ...). Bạn cần tự xây dựng hàm hoặc dùng thư viện (như dayjs, moment.js).
Dưới đây là ví dụ tự format bằng JS thuần:
function formatDate(date) {
    let d = date.getDate().toString().padStart(2, '0'); // dd
    let m = (date.getMonth()+1).toString().padStart(2, '0'); // mm
    let y = date.getFullYear(); // yyyy
    let h = date.getHours().toString().padStart(2, '0'); // hh
    let i = date.getMinutes().toString().padStart(2, '0'); // ii
    return `${d}/${m}/${y} ${h}:${i}`;
}
// Gọi thử:
// formatDate(new Date("2025-07-01T09:05:00")); // "01/07/2025 09:05"
Bảng ký tự format phổ biến (tự custom):
Ký tựÝ nghĩaVí dụ
ddNgày (2 chữ số)01, 15
mmTháng (2 chữ số)01, 12
yyyyNăm (4 chữ số)2025
yyNăm (2 chữ số)25
hhGiờ (2 chữ số, 0-23)09, 18
iiPhút (2 chữ số)05, 45
ssGiây (2 chữ số)00, 59
Muốn format nâng cao, nên dùng thư viện dayjs hoặc moment.js.

Giới thiệu thư viện dayjs

dayjs là một thư viện JavaScript nhỏ gọn giúp xử lý, định dạng, chuyển đổi ngày tháng dễ dàng, cú pháp tương tự moment.js nhưng nhẹ hơn rất nhiều.

Ví dụ sử dụng:
// Thêm CDN vào <head>:
// <script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script>

// Format ngày:
dayjs("2025-07-01T09:05:00").format("DD/MM/YYYY HH:mm"); // "01/07/2025 09:05"

// Lấy ngày hiện tại:
dayjs().format("YYYY-MM-DD HH:mm:ss");

// Cộng/trừ ngày:
dayjs().add(7, 'day').format("DD/MM/YYYY"); // +7 ngày

dayjs().subtract(1, 'month').format("DD/MM/YYYY"); // -1 tháng
Tài liệu chi tiết: https://day.js.org/