Apidog

Nền tảng phát triển API hợp tác tất cả trong một

Thiết kế API

Tài liệu API

Gỡ lỗi API

Giả lập API

Kiểm thử API tự động

API Ngày Thời Gian Trong Javascript Thực Sự Rất Tốt, Đây Là Lý Do:

中村 拓也

中村 拓也

Updated on tháng 3 1, 2025

💡
Trước khi bắt đầu, hãy để tôi nhắc bạn một điều: tải xuống Apidog miễn phí hôm nay để tinh gọn quy trình kiểm tra API của bạn, đặc biệt là khi khám phá các tính năng mạnh mẽ của Claude 3.7 Sonnet—hoàn hảo cho các nhà phát triển muốn thử nghiệm các mô hình AI tiên tiến như thế này!
button

Việc làm việc với ngày và giờ từ lâu đã là một điểm khó khăn cho các nhà phát triển JavaScript. Đối tượng Date có các đặc điểm kỳ quặc và hạn chế của nó đã khiến nhiều nhà phát triển phải chuyển sang các thư viện bên thứ ba như Moment.js hoặc date-fns. Tuy nhiên, ủy ban TC39 (chịu trách nhiệm phát triển JavaScript) đã làm việc trên một giải pháp: API Temporal. Cách tiếp cận toàn diện và hiện đại này cho việc xử lý ngày và giờ hứa hẹn sẽ giải quyết những vấn đề lâu dài với các hoạt động tạm thời của JavaScript.

Vấn Đề Với Đối Tượng Date của JavaScript

Trước khi đi vào API Temporal, điều quan trọng là cần hiểu các hạn chế của đối tượng Date hiện tại:

  1. Trạng thái thay đổi: Các đối tượng Date có thể bị thay đổi tại chỗ, dẫn đến các hiệu ứng phụ bất ngờ
  2. Chức năng hạn chế: Các hoạt động đơn giản như thêm ngày hoặc so sánh ngày đòi hỏi mã phức tạp
  3. Sự không nhất quán trong việc phân tích chuỗi: Việc phân tích ngày từ chuỗi nổi tiếng là không đáng tin cậy trên các trình duyệt
  4. Không hỗ trợ múi giờ: Quản lý kém các múi giờ ngoài UTC và giờ địa phương
  5. Chỉ lịch Gregorian: Không hỗ trợ các hệ thống lịch khác
  6. API gây nhầm lẫn: Các phương thức như getMonth() trả về các giá trị bắt đầu từ 0 (0-11 thay vì 1-12)

Các vấn đề này đã làm cho việc làm việc với ngày trong JavaScript trở nên dễ gây ra lỗi và gây bực bội, dẫn đến việc sử dụng rộng rãi các thư viện bên thứ ba.

Giới Thiệu API Temporal

API Temporal là một bổ sung được đề xuất cho JavaScript cung cấp một giải pháp hiện đại, toàn diện cho việc làm việc với ngày và giờ. Nó được thiết kế như một đối tượng toàn cục (Temporal) hoạt động như một không gian tên cấp cao (tương tự như đối tượng Math), chứa nhiều lớp khác nhau cho các hoạt động ngày và giờ khác nhau.

Các nguyên tắc chính đứng sau API Temporal bao gồm:

  1. Không thể thay đổi: Tất cả các đối tượng Temporal đều không thay đổi, loại bỏ các hiệu ứng phụ
  2. Rõ ràng: Tách biệt rõ ràng giữa các loại khái niệm ngày/giờ khác nhau
  3. Hỗ trợ múi giờ: Hỗ trợ hàng đầu cho tất cả các múi giờ, bao gồm cả phép toán an toàn DST
  4. Nhiều hệ thống lịch: Hỗ trợ các lịch không phải Gregorian
  5. Độ chính xác: Độ chính xác nanosecond cho các phép tính thời gian
  6. Độ nhất quán: Phân tích và định dạng chuẩn hóa

Các Kiểu Dữ Liệu Chính Trong API Temporal

API Temporal giới thiệu một số lớp chuyên dụng để xử lý các khía cạnh khác nhau của ngày và giờ:

Các Kiểu Dữ Liệu Bằng Tính (Không Có Thông Tin Múi Giờ)

  1. Temporal.PlainDate: Đại diện cho một ngày trong lịch (ví dụ: 24 tháng 8, 2006) không có thông tin về giờ hoặc múi giờ
  2. Temporal.PlainTime: Đại diện cho thời gian theo đồng hồ tường (ví dụ: 7:39 PM) không có ngày hoặc múi giờ
  3. Temporal.PlainDateTime: Kết hợp ngày và thời gian theo đồng hồ tường không có thông tin về múi giờ
  4. Temporal.PlainYearMonth: Đại diện cho một năm và tháng cụ thể (ví dụ: tháng 10 năm 2020)
  5. Temporal.PlainMonthDay: Đại diện cho một tháng và một ngày không có năm (ví dụ: 14 tháng 7)

Các Kiểu Dữ Liệu Múi Giờ (Có Thông Tin Múi Giờ)

  1. Temporal.ZonedDateTime: Một đối tượng ngày/giờ có nhận thức về múi giờ, có nhận thức về lịch đại diện cho một sự kiện thực tế vào một thời điểm cụ thể từ góc độ của một vùng cụ thể
  2. Temporal.Instant: Đại diện cho một điểm cố định trong thời gian (thời gian chính xác), không quan tâm đến lịch hay vị trí

Các Kiểu Thêm

  1. Temporal.Duration: Diễn đạt một khoảng thời gian (ví dụ: 5 phút và 30 giây)
  2. Temporal.TimeZone: Đại diện cho một múi giờ và cung cấp các phương thức chuyển đổi
  3. Temporal.Calendar: Đại diện cho một hệ thống lịch

Làm Việc Với API Temporal

Tạo Các Đối Tượng Temporal

API Temporal cung cấp một số cách để tạo đối tượng:

// Lấy ngày và giờ hiện tại
const now = Temporal.Now.plainDateTimeISO();
console.log(now.toString()); // ví dụ: 2023-08-24T14:30:45.123456789

// Chỉ ngày
const today = Temporal.Now.plainDateISO();
console.log(today.toString()); // ví dụ: 2023-08-24

// Chỉ giờ
const currentTime = Temporal.Now.plainTimeISO();
console.log(currentTime.toString()); // ví dụ: 14:30:45.123456789

// Tạo đối tượng từ các thành phần
const date = Temporal.PlainDate.from({ year: 2023, month: 8, day: 24 });
const time = Temporal.PlainTime.from({ hour: 14, minute: 30, second: 45 });
const dateTime = Temporal.PlainDateTime.from({
  year: 2023,
  month: 8,
  day: 24,
  hour: 14,
  minute: 30,
  second: 45
});

// Tạo từ các chuỗi ISO
const dateFromString = Temporal.PlainDate.from("2023-08-24");
const timeFromString = Temporal.PlainTime.from("14:30:45");
const dateTimeFromString = Temporal.PlainDateTime.from("2023-08-24T14:30:45");

Làm Việc Với Các Múi Giờ

API Temporal làm cho việc làm việc với các múi giờ trở nên dễ dàng hơn:

// Thời gian hiện tại theo múi giờ địa phương
const localTime = Temporal.Now.zonedDateTimeISO();
console.log(localTime.toString()); 
// ví dụ: 2023-08-24T14:30:45+01:00[Europe/London]

// Thời gian hiện tại theo một múi giờ cụ thể
const tokyoTime = Temporal.Now.zonedDateTimeISO("Asia/Tokyo");
console.log(tokyoTime.toString()); 
// ví dụ: 2023-08-24T22:30:45+09:00[Asia/Tokyo]

// Chuyển đổi giữa các múi giờ
const nyTime = localTime.withTimeZone("America/New_York");
console.log(nyTime.toString()); 
// ví dụ: 2023-08-24T09:30:45-04:00[America/New_York]

Phép Tính Ngày và Giờ

Một trong những tính năng mạnh mẽ nhất của API Temporal là các phép toán số học trực quan của nó:

// Thêm thời gian
const tomorrow = today.add({ days: 1 });
const nextWeek = today.add({ days: 7 });
const twoHoursLater = currentTime.add({ hours: 2 });

// Trừ thời gian
const yesterday = today.subtract({ days: 1 });
const lastWeek = today.subtract({ days: 7 });
const twoHoursEarlier = currentTime.subtract({ hours: 2 });

// Làm việc với khoảng thời gian
const duration = Temporal.Duration.from({ hours: 2, minutes: 30 });
const laterTime = currentTime.add(duration);

// Tìm sự khác biệt giữa hai ngày
const date1 = Temporal.PlainDate.from("2023-01-01");
const date2 = Temporal.PlainDate.from("2023-08-24");
const difference = date1.until(date2);
console.log(difference.toString()); // P236D (định dạng khoảng thời gian ISO 8601)
console.log(difference.days); // 236

Chỉnh Sửa Thành Phần Với "with"

API Temporal cung cấp một cách sạch sẽ để tạo các đối tượng mới với các thành phần đã được sửa đổi:

// Thay đổi năm của một ngày
const nextYear = date.with({ year: date.year + 1 });

// Đặt các thành phần cụ thể
const newDateTime = dateTime.with({ hour: 12, minute: 0, second: 0 });
console.log(newDateTime.toString()); // 2023-08-24T12:00:00

So Sánh Các Đối Tượng Temporal

API cung cấp các phương thức so sánh trực quan:

const date1 = Temporal.PlainDate.from("2023-08-24");
const date2 = Temporal.PlainDate.from("2023-09-15");

console.log(date1.equals(date2)); // false
console.log(date1.equals(date1)); // true
console.log(date1.before(date2)); // true
console.log(date1.after(date2)); // false
console.log(date1.since(date2).days); // -22

Xử Lý DST và Thời Gian Mơ Hồ

API Temporal xử lý một cách thanh thoát các phức tạp của các chuyển tiếp Giờ Tiết Kiệm Ánh Sáng (DST):

// Tạo một thời gian rơi vào giữa một chuyển tiếp DST
const dstTime = Temporal.ZonedDateTime.from({
  timeZone: "America/New_York",
  year: 2023,
  month: 11,
  day: 5,
  hour: 1,
  minute: 30
});

// API cho phép bạn chỉ định cách xử lý thời gian mơ hồ
const dstTimeExact = Temporal.ZonedDateTime.from({
  timeZone: "America/New_York",
  year: 2023,
  month: 11,
  day: 5,
  hour: 1,
  minute: 30,
  disambiguation: "earlier" // Tùy chọn: 'earlier', 'later', 'compatible', 'reject'
});

Hỗ Trợ Các Lịch Không Phải Gregorian

Không giống như đối tượng Date, API Temporal hỗ trợ nhiều hệ thống lịch khác nhau:

// Tạo một ngày trong lịch Hebrew
const hebrewDate = Temporal.PlainDate.from({
  year: 5783,
  month: 5,
  day: 15,
  calendar: "hebrew"
});

// Chuyển đổi giữa các hệ thống lịch
const gregorianDate = hebrewDate.withCalendar("iso8601");

Phân Tích và Định Dạng

API Temporal cung cấp các phương thức tích hợp cho việc phân tích và định dạng:

// Phân tích từ các chuỗi
const date = Temporal.PlainDate.from("2023-08-24");

// Định dạng tùy chỉnh
const options = {
  year: 'numeric',
  month: 'long',
  day: 'numeric'
};
console.log(date.toLocaleString("en-US", options)); // 24 tháng 8, 2023

Tình Trạng Hiện Tại và Hỗ Trợ Trình Duyệt

Tính đến thời điểm viết, API Temporal đang ở Giai đoạn 3 trong quy trình đề xuất của TC39, có nghĩa là nó gần hoàn thiện nhưng vẫn chưa là một phần của tiêu chuẩn ECMAScript chính thức. Trong khi hỗ trợ trình duyệt bản địa vẫn đang chờ xử lý, các nhà phát triển có thể sử dụng các polyfill như @js-temporal/polyfill để bắt đầu sử dụng API này ngay hôm nay:

// Cài đặt polyfill
// npm install @js-temporal/polyfill

// Sử dụng trong mã của bạn
import { Temporal } from "@js-temporal/polyfill";

const now = Temporal.Now.plainDateTimeISO();

Kết Luận

API Temporal đại diện cho một sự cải tiến đáng kể trong khả năng xử lý ngày và giờ của JavaScript. Bằng cách giải quyết những vấn đề đã tồn tại lâu dài với đối tượng Date và cung cấp một API toàn diện, trực quan, nó hứa hẹn sẽ làm cho việc làm việc với các khái niệm tạm thời trong JavaScript trở nên dễ chịu hơn và ít lỗi hơn.

Các lợi ích chính của API Temporal bao gồm:

  1. Không thể thay đổi: Tất cả các phép toán đều trả về các đối tượng mới, ngăn ngừa các hiệu ứng phụ
  2. Rõ ràng: Phân biệt rõ ràng giữa các loại ngày và giờ khác nhau
  3. Toàn diện: Bao gồm mọi thứ từ ngày đơn giản đến các hoạt động nhận thức về múi giờ phức tạp
  4. Trực quan: Các phương thức như add(), subtract(), và with() làm cho các phép toán phổ biến trở nên đơn giản
  5. Chính xác: Hỗ trợ độ chính xác nanosecond
  6. Tôn trọng toàn cầu: Hỗ trợ nhiều múi giờ và hệ thống lịch khác nhau

Khi chúng ta chờ các trình duyệt triển khai API này bản địa, polyfill cho phép các nhà phát triển bắt đầu tận hưởng những cải tiến này ngay hôm nay. Khi các ứng dụng web ngày càng trở nên toàn cầu và nhạy cảm với thời gian, API Temporal sẽ chắc chắn trở thành một công cụ thiết yếu trong bộ công cụ của mỗi nhà phát triển JavaScript, cuối cùng chấm dứt việc cần đến các thư viện bên ngoài cho các thao tác ngày và giờ cơ bản.

Bằng cách áp dụng API Temporal, các nhà phát triển có thể viết mã sạch hơn, có khả năng bảo trì cao hơn mà xử lý chính xác các phức tạp của ngày, giờ và múi giờ, mang lại trải nghiệm người dùng tốt hơn trên toàn cầu.

button