2 điểm bởi GN⁺ 2025-01-31 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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

 
GN⁺ 2025-01-31
Ý 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 Java

    • Thời gian rất phức tạp, và Temporal xử lý điều này bằng cách tách thành thời gian ngây thơ, thời điểm tức thời và thời gian theo múi giờ
    • Khi thực hiện thao tác cộng thêm một ngày vào timestamp, cần quyết định đó là thời gian cục bộ của một múi giờ cụ thể hay không. Nếu không, có thể phát sinh lỗi khi DST hoặc múi giờ thay đổi
    • Nó cũng giải quyết vấn đề tuần tự hóa giữa timestamp "offset cố định" và timestamp của một múi giờ cụ thể
  • Có thể chuyển đổi múi giờ bằng Temporal.ZonedDateTime.prototype.withTimeZone()

    • Chuyển đổi múi giờ và xử lý duration là những chức năng quan trọng mà thư viện nên đảm nhiệm, và Temporal xử lý được điều đó
    • Tuy nhiên, Temporal.Duration không cung cấp hàm format tù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

    • Điều này loại bỏ khả năng dùng đối tượng làm khóa Map hoặc thu thập vào Set
  • TC39 đ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ần có nỗ lực phát triển để các trình duyệt lớn hỗ trợ các tính năng mới
  • Có thắc mắc về cách Temporal cập nhật dữ liệu múi giờ

    • Nếu người dùng không cập nhật trình duyệt, họ có thể thấy thời gian không chính xác
  • Có đề xuất nên thêm sự kiện khi múi giờ thay đổi

    • Nhiều người di chuyển qua các múi giờ mỗi ngày
  • 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 đổi

    • Nên dùng CarbonImmutable để luôn trả về instance mới
    • Có đề xuất cách import CarbonImmutableCarbon dưới dạng alias trong Laravel
  • Có nhiều bài viết và thảo luận khác nhau liên quan đến JavaScript Temporal