Không tải lên, 100% cục bộ, không cần tài khoản

Bài viết

Khoảng thời gian ISO 8601: P1DT2H nghĩa là gì

Một phản hồi từ API YouTube cho biết một video dài PT4M13S. Một lời mời lịch mang giá trị P15DT5H0M20S. Một máy chủ thư mục đóng dấu thời gian cho tài khoản là 20260424174227.0Z, trông có vẻ liên quan nhưng thực ra là một thứ hoàn toàn khác. Những chuỗi ký tự gọn gàng này tuân theo những quy tắc đáng để biết, vì đọc sai sẽ biến phút thành tháng. Đây là một chuyến tham quan định dạng khoảng thời gian ISO 8601: các chữ cái có nghĩa gì, định dạng này xuất hiện ở đâu, và một điểm tinh tế lớn nhất của nó, đó là một khoảng thời gian viết theo cách này không phải lúc nào cũng là một lượng thời gian cố định.

P, T, và ý nghĩa của các chữ cái

Một khoảng thời gian ISO 8601 bắt đầu bằng P (period). Sau đó là các thành phần ngày tháng, mỗi thành phần là một số theo sau bởi chữ đơn vị của nó: Y là năm, M là tháng, W là tuần, D là ngày. Chữ T ngăn cách phần ngày tháng với phần thời gian: H là giờ, M là phút, S là giây. Mọi thành phần đều là tùy chọn; bạn chỉ viết những gì cần thiết. PT15M là 15 phút, P1DT2H là một ngày và hai giờ, P3W là ba tuần. Chữ T không phải là trang trí: M nghĩa là tháng trước nó và phút sau nó, nên P1M là một tháng còn PT1M là một phút. Thành phần cuối cùng xuất hiện có thể mang phần thập phân, như PT0.5S nghĩa là nửa giây. Và các đơn vị không tự động chuyển đổi lẫn nhau: PT90M là một cách viết hoàn toàn hợp lệ để chỉ một tiếng rưỡi.

Cấu tạo của khoảng thời gian ISO 8601 P3Y6M4DT12H30M5S: P mở đầu khoảng thời gian, Y M D là đơn vị ngày tháng, T chuyển sang phần thời gian, H M S là đơn vị thời gian

Nơi bạn thực sự gặp định dạng này

Cú pháp này âm thầm xuất hiện ở khắp nơi. YouTube Data API báo cáo độ dài mọi video dưới dạng khoảng thời gian ISO 8601 (PT4M13S). HTML chấp nhận khoảng thời gian trong thuộc tính datetime của phần tử time. Lời mời lịch cũng dùng nó: chuẩn iCalendar (RFC 5545) viết độ dài sự kiện như PT1H0M0S, dù nó bỏ năm và tháng khỏi văn phạm. xs:duration của XML Schema bao phủ toàn bộ dạng đầy đủ và thậm chí cho phép dấu trừ ở đầu để biểu diễn khoảng thời gian âm. Các thư viện chuẩn phân tích nó trực tiếp: java.time đọc chuỗi P và T bằng Period.parse và Duration.parse, và cách chia tương tự tồn tại trong nhiều ngôn ngữ khác. Nếu bạn tạo ra lịch trình, nguồn cấp dữ liệu hoặc API máy đọc được, định dạng này là ngôn ngữ chung để nói "kéo dài bao lâu".

Vì sao P1M không phải là một số giây cố định

PT15M luôn luôn là 900 giây. P1M thì không: một tháng kéo dài 28, 29, 30 hoặc 31 ngày tùy vào nơi nó bắt đầu, nên P1M chỉ trở nên cụ thể khi bạn gắn nó vào một ngày. Ngay cả P1D cũng không đảm bảo là 24 giờ. Tại Liên minh châu Âu, đồng hồ được vặn nhanh lên vào Chủ nhật, ngày 29 tháng 3 năm 2026, nên ngày lịch đó chỉ kéo dài 23 giờ: cộng thêm P1D (một ngày lịch) và cộng thêm PT24H (đúng 24 giờ) vào cùng một buổi tối thứ Bảy sẽ cho ra hai thời điểm khác nhau. Đây là lý do java.time có hai kiểu, Period cho đơn vị lịch và Duration cho số giây chính xác, và cũng là lý do các thư viện ngày tháng yêu cầu một ngày tham chiếu trước khi chuyển đổi một khoảng thời gian. Hãy coi các thành phần Y, M, W và D là phép tính theo lịch, và chỉ H, M và S mới là lượng thời gian cố định.

Không phải khoảng thời gian: 20260424174227.0Z

Một chuỗi như 20260424174227.0Z trông có vẻ thuộc cùng họ, nhưng thực ra đó là dấu thời gian, không phải khoảng thời gian, và cũng không phải ISO 8601. Đó là GeneralizedTime, một định dạng từ ASN.1, ký hiệu được các thư mục LDAP và chứng chỉ X.509 sử dụng. Hãy đọc nó như các trường có độ rộng cố định: năm 2026, tháng 04, ngày 24, tiếp theo là 17:42:27, một phần thập phân tùy chọn (.0), và Z nghĩa là UTC. Bạn gặp nó trong các thuộc tính Active Directory như whenCreated và whenChanged, trong các bản xuất LDAP, và bên trong chứng chỉ, nơi RFC 5280 bắt buộc dùng GeneralizedTime cho ngày hiệu lực từ năm 2050 trở đi. Dấu hiệu phân biệt nó với dạng gọn của ISO 8601 là thiếu chữ T: ISO sẽ viết cùng một thời điểm đó là 20260424T174227Z.

Chuỗi GeneralizedTime 20260424174227.0Z được giải mã từng trường thành ngày 24 tháng 4 năm 2026, 17:42:27 UTC

Giải mã một chuỗi mà không cần đọc đặc tả

Với một chuỗi dùng một lần, công cụ chuyển đổi khoảng thời gian ISO của chúng tôi phân tích bất kỳ khoảng thời gian P/T nào thành các thành phần và tổng số giây của nó, và dựng lại chuỗi đó từ các con số bạn nhập. Khi những gì bạn có là hai mốc giờ chứ không phải một chuỗi khoảng thời gian (chẳng hạn một ca làm việc từ 22:00 đến 06:30), công cụ tính khoảng thời gian cho ra thời gian đã trôi qua, kể cả những khoảng vắt qua nửa đêm. Cả hai đều chạy hoàn toàn trong trình duyệt của bạn: những gì bạn nhập không rời khỏi thiết bị của bạn. Và để đọc nhanh mà không cần công cụ nào, hai phản xạ này bao quát hầu hết các trường hợp: tìm chữ T để biết M nghĩa là tháng hay phút, và nhớ rằng bất cứ thứ gì nằm bên trái chữ T là phép tính theo lịch, không phải một số giây cố định.

Công cụ trong bài viết này

Câu hỏi thường gặp

PT1M có giống P1M không?

Không. Chữ M đổi nghĩa khi ở hai bên dấu ngăn T: P1M là một tháng, PT1M là một phút. Đây là cách đọc sai phổ biến nhất của định dạng này, và đã từng có lỗi API được phát hành vì điều đó. Khi không chắc chắn, hãy quét tìm chữ T trước: mọi thứ trước nó được tính bằng năm, tháng, tuần và ngày; mọi thứ sau nó được tính bằng giờ, phút và giây. Một khoảng thời gian viết đúng chuẩn không bao giờ có đơn vị thời gian trước chữ T hay đơn vị ngày tháng sau chữ T.

Làm sao để viết 90 phút thành khoảng thời gian ISO 8601?

PT90M và PT1H30M đều hợp lệ và mô tả cùng một lượng thời gian. ISO 8601 không bắt buộc các thành phần phải nằm trong phạm vi thông thường, nên số phút trên 59 hay số giờ trên 23 đều không sao. Các bộ phân tích chấp nhận cả hai cách viết; hệ thống nào phát ra cách nào tùy thuộc vào việc nó có chuẩn hóa hay không. Nếu bạn tạo ra khoảng thời gian để con người đọc, PT1H30M thân thiện hơn; nếu bạn so sánh các khoảng thời gian trong mã nguồn, hãy so sánh tổng số giây của chúng thay vì chuỗi ký tự, chính vì hai chuỗi khác nhau có thể mang cùng một ý nghĩa.

Sự khác biệt giữa khoảng thời gian (duration) và khoảng (interval) là gì?

Một khoảng thời gian chỉ nói lên độ dài, không gắn vị trí nào trên lịch: P3D là ba ngày, bắt đầu từ đâu cũng được. Một khoảng ISO 8601 gắn một khoảng thời gian vào những ngày cụ thể, được viết bằng dấu gạch chéo: 2026-07-04T00:00:00Z/P3D nghĩa là ba ngày bắt đầu từ ngày 4 tháng 7 năm 2026, và một cặp bắt đầu/kết thúc như 2026-07-04/2026-07-07 diễn đạt cùng một khoảng đó. Cũng có những khoảng lặp lại với tiền tố R: R5/2026-07-04T00:00:00Z/P1D nghĩa là năm lần lặp lại hằng ngày kể từ thời điểm bắt đầu đó. Khoảng thời gian giải quyết được sự mơ hồ của các đơn vị lịch, vì P1M khi gắn vào một ngày cụ thể luôn có một độ dài xác định.

Nguồn