-
Bắt đầu phát hành JavaScript Temporal
- Việc triển khai đối tượng JavaScript Temporal mới đã bắt đầu được đưa vào các bản phát hành thử nghiệm của trình duyệt. Đây là một tin lớn đối với các nhà phát triển web, vì việc xử lý ngày và giờ trong JavaScript sẽ được đơn giản hóa và hiện đại hóa đáng kể.
- Các ứng dụng phụ thuộc vào quản lý lịch biểu, quốc tế hóa và dữ liệu nhạy cảm về thời gian có thể sử dụng các tính năng tích hợp sẵn để làm việc với ngày, giờ, khoảng thời gian và lịch một cách hiệu quả, chính xác và nhất quán.
- Vẫn còn khá xa mới đạt được hỗ trợ ổn định trên nhiều trình duyệt, và có thể sẽ có thay đổi khi quá trình triển khai tiếp tục phát triển, nhưng hiện tại bạn đã có thể xem qua Temporal để hiểu lý do ra đời của nó và những vấn đề mà nó giải quyết.
- MDN đã bổ sung hơn 270 trang tài liệu về Temporal trong tuần này, bao gồm giải thích chi tiết và ví dụ.
-
JavaScript Temporal là gì?
- Để hiểu Temporal, có thể nhìn vào đối tượng
Date của JavaScript. Khi JavaScript được tạo ra vào năm 1995, đối tượng Date được sao chép từ triển khai java.util.Date đời đầu và có nhiều khiếm khuyết của Java.
- Java đã thay thế triển khai đó vào năm 1997, nhưng JavaScript đã bị mắc kẹt với cùng một API trong gần 30 năm.
- Vấn đề lớn của đối tượng
Date trong JavaScript là nó chỉ hỗ trợ giờ địa phương của người dùng và UTC, chứ không hỗ trợ múi giờ. Ngoài ra, hành vi phân tích chuỗi rất thiếu tin cậy, và bản thân Date có thể bị thay đổi, dẫn đến các lỗi khó theo dõi.
- Tất cả những vấn đề này khiến việc xử lý ngày và giờ trong JavaScript trở nên phức tạp và dễ phát sinh lỗi. Hầu hết lập trình viên phải dựa vào các thư viện như Moment.js và date-fns để xử lý ngày và giờ tốt hơn trong ứng dụng của mình.
- Temporal được thiết kế để thay thế hoàn toàn đối tượng
Date, giúp việc quản lý ngày và giờ trở nên đáng tin cậy và có thể dự đoán được. Temporal hỗ trợ biểu diễn múi giờ và lịch, đồng thời bổ sung nhiều phương thức tích hợp sẵn cho chuyển đổi, so sánh, tính toán, định dạng và hơn thế nữa.
-
Khái niệm cốt lõi
- Khái niệm cốt lõi trong Temporal là instant (một thời điểm duy nhất trong lịch sử), wall-clock time (thời gian địa phương) và duration (khoảng thời gian). API có cấu trúc sau để xử lý các khái niệm này:
- Khoảng thời gian:
Temporal.Duration là chênh lệch giữa hai thời điểm
- Thời điểm:
- Thời điểm duy nhất:
- Dưới dạng timestamp:
Temporal.Instant
- Ngày-giờ có múi giờ:
Temporal.ZonedDateTime
- Ngày/giờ không phụ thuộc múi giờ ("Plain"):
- Ngày và giờ đầy đủ:
Temporal.PlainDateTime
- Chỉ ngày:
Temporal.PlainDate
- Năm và tháng:
Temporal.PlainYearMonth
- Tháng và ngày:
Temporal.PlainMonthDay
- Chỉ giờ:
Temporal.PlainTime
- Hiện tại: dùng
Temporal.now để lấy thời gian hiện tại dưới dạng instance của nhiều lớp khác nhau hoặc theo định dạng cụ thể
-
Ví dụ về Temporal
- Một trong những cách dùng cơ bản nhất của Temporal là lấy ngày và giờ hiện tại dưới dạng chuỗi ISO. Giờ đây, nhiều phương thức có thể nhận múi giờ, giúp không còn phải tự thực hiện các phép tính phức tạp.
- Việc làm việc với nhiều loại lịch cũng được đơn giản hóa, cho phép tạo ngày theo các hệ lịch ngoài lịch Gregory, chẳng hạn như Hebrew, Trung Quốc hoặc Hồi giáo.
- Làm việc với Unix timestamp là một trường hợp sử dụng rất phổ biến vì nhiều hệ thống (API, cơ sở dữ liệu) dùng định dạng này để biểu diễn thời gian.
- Phương thức
compare() cho phép sắp xếp các khoảng thời gian một cách gọn gàng và hiệu quả.
-
Thử Temporal và hỗ trợ trình duyệt
- Hỗ trợ đang dần được đưa vào các bản phát hành trình duyệt thử nghiệm, và Firefox hiện có phần triển khai trưởng thành nhất.
- Trong Firefox, Temporal đang được tích hợp sẵn trong bản Nightly phía sau thiết lập
javascript.options.experimental.temporal.
- Với việc các triển khai thử nghiệm đang được đưa vào sử dụng, đây là thời điểm tốt để thử Temporal và làm quen với cách tiếp cận hiện đại trong việc xử lý ngày và giờ trong JavaScript.
-
Lời cảm ơn
- Cảm ơn Eric Meyer vì những đóng góp cho chủ đề này. Đã khoảng 4 năm kể từ khi Eric tài liệu hóa dữ liệu tương thích trình duyệt và tổ chức tài liệu trong nhánh fork của mdn/content.
- Joshua Chen đã tiếp nối công việc của Eric và chuẩn bị pull request cho tài liệu MDN.
- Cảm ơn André Bargull vì công việc của ông đối với phần triển khai Temporal trên Firefox.
1 bình luận
Ý kiến Hacker News
Temporal hữu ích trong việc giải quyết các vấn đề của API
Date()hiện tại. Nó cung cấp API thuận tiện, lấy cảm hứng từ các thư viện thời gian chất lượng cao như chrono của Rust và Joda Time của JavaCó thể chuyển đổi múi giờ bằng
Temporal.ZonedDateTime.prototype.withTimeZone()Temporal.Durationkhông cung cấp hàmformattùy chỉnhĐề xuất Temporal rất tốt, nhưng khá tiếc vì nó dùng tính đồng nhất tham chiếu khi so sánh
Maphoặc thu thập vàoSetTC39 đang phát triển nhiều tính năng, và mọi người mong Temporal sớm được phát hành
Có thắc mắc về cách Temporal cập nhật dữ liệu múi giờ
Có đề xuất nên thêm sự kiện khi múi giờ thay đổi
Tên Temporal được dùng để tránh xung đột với các đối tượng thời gian thông thường, nhưng ban đầu có thể bị hiểu nhầm là để điều khiển garbage collection
Lớp Carbon của PHP kế thừa từ
DateTime, cho thấy vấn đề của việc xử lý timestamp có thể thay đổiCarbonImmutableđể luôn trả về instance mớiCarbonImmutablevàCarbondưới dạng alias trong LaravelCó nhiều bài viết và thảo luận khác nhau liên quan đến JavaScript Temporal