Khái niệm và cách xử lý chuyển đổi chuỗi ngày tháng thành đối tượng Date trong JavaScript

Khi làm việc với thời gian trong JavaScript, việc hiểu rõ cách trình bày và phân tích (parse) giá trị ngày tháng là rất quan trọng để tránh lỗi do sự khác biệt giữa các múi giờ.

  1. Đại lượng số học biểu diễn thời gian Số miligiây kể từ epoch (1970-01-01T00:00:00.000Z) là cách biểu diễn thời gian trung lập, không phụ thuộc múi giờ:
const epoch = Date.now();
console.log(epoch); // Ví dụ: 1712304000000

Mọi hệ thống tính cùng một giá trị này tại cùng một thời điểm thực tế, bất kể múi giờ cục bộ.

  1. Chuỗi biểu diễn ngày-tháng và tính chất phụ thuộc múi giờ Chuỗi ngày tháng là ký hiệu thuận tiện cho con người, nhưng lại có thể gây hiểu nhầm do tính chất liên quan đến múi giờ — kể cả khi không có phần múi giờ trong chuỗi:

Chuỗi chỉ ngày: "2022-10-08" → được coi là UTC nếu không include múi giờ. Chuỗi ngày-giờ: "2022-10-08T14:48:00" → được coi là giờ địa phương, không phải UTC.

  1. UTC và múi giờ UTC (Coordinated Universal Time) là chuẩn cơ sở, tương đương với GMT cũ — múi giờ gốc (UTC+0). Khi xuất chuỗi, JavaScript cung cấp hai cách phổ biến:
// GMT (UTC)
const utcStr = new Date().toUTCString();
console.log(utcStr); // Ví dụ: "Sat, 08 Apr 2023 06:40:00 GMT"

// Giờ địa phương
const localStr = new Date().toString();
console.log(localStr); // Ví dụ: "Sat Apr 08 2023 13:40:00 GMT+0700 (Indochina Time)"
  1. Hàm Date.parse() và quy tắc xử lý chuỗi Trình phân tích mặc định của Date.parse() tuân theoistas sau (ECMA-262):

Chỉ ngày (date-only): "YYYY-MM-DD" → phân tích thành UTC. Ngày-giờ (date-time): "YYYY-MM-DDTHH:mm:ss" hoặc định dạng không chuẩn → phân tích thành giờ địa phương.

console.log(Date.parse("2011-10-10"));           // UTC
console.log(Date.parse("2011-10-10T14:48:00"));  // Giờ địa phương
console.log(Date.parse("10/10/2022"));           // Không chuẩn – phụ thuộc JS engine và địa phương
  1. Xác định rõ múi giờ trong chuỗi Để kiểm soát hành vi phân tích, nên explicitly thêm múi giờ:
const date1 = new Date("2011-10-10 GMT+0800");
const date2 = new Date("2011-10-10 UTC+08:00");
const date3 = new Date("2011-10-10T12:00:00.000+08:00");
console.log(date1.getTime() === date2.getTime()); // true — cùng một thời điểm

Các biểu diễn múi giờ đúng theo chuẩn:

Z hoặc +00:00 — UTC. +HH:mm hoặc -HH:mm — độ lệch so với UTC.

  1. Lưu trữ ngày/tháng trong cơ sở dữ liệu Tránh lưu trữ dưới dạng chuỗi khi chạy ứng dụng đa múi giờ. Tham khảo các lựa chọn thay thế:

Loại dữ liệu DATE hoặc TIMESTAMPTZ trên PostgreSQL / MySQL. Loại số: số miligiây UTC —MAP với Date object trong JS. ISO 8601 full string: "2023-04-08T13:20:00.000+07:00" nếu bắt buộc phải là chuỗi.

  1. Định dạng chuẩn ECMA-262 (ISO-like) Chuỗi hợp lệ theo chuẩn kịch bản interchange:

YYYY-MM-DDTHH:mm:ss.sssZ

Với các thành phần:

YYYY: Năm (0000–9999 hoặc mở rộng +/−YYYYYY). MM: Tháng (01–12). DD: Ngày (01–31). T: Dấu phân cách bắt đầu thành phần thời gian. HH: Giờ (00–24). mm: Phút (00–59). ss: Giây (00–59). sss: Miligiây (000–999). Z: UTC hoặc +HH:mm / -HH:mm (độ lệch múi giờ).

Ví dụ hợp lệ đầy đủ:

new Date("2023-04-08T13:40:00.000+07:00"); // Hợp lệ

Thẻ: JavaScript date-parsing iso-8601 timezone utc

Đăng vào ngày 13 tháng 6 lúc 16:39