Công cụ dành cho nhà phát triển · Trình chuyển đổi dấu thời gian Unix
Cách trình duyệt chuyển đổi một kỷ nguyên thành giờ địa phương bằng Date và Intl
· Cách thức hoạt động
dấu thời gian javascript browser-apis
Trình chuyển đổi trình duyệt không có đồng hồ máy chủ hoặc cơ sở dữ liệu múi giờ riêng; nó dựa vào đối tượng Date và Intl API được hệ điều hành của bạn hỗ trợ. Bài đăng này giải thích đường ống đó và các giới hạn của nó.
Trình duyệt lấy 'cục bộ' từ đâu? — cùng một thời điểm được hiển thị khác nhau trên máy tính xách tay và điện thoại trong cùng một phòng
Hai thiết bị cạnh nhau có thể hiển thị một kỷ nguyên khác nhau khi các vùng cục bộ được định cấu hình của chúng khác nhau. Số nguyên không thay đổi giữa máy tính xách tay và điện thoại; mỗi trình duyệt xây dựng cùng một thời điểm, sau đó cung cấp các trường lịch cục bộ cho môi trường riêng của nó. Do đó, “địa phương” mô tả người đọc chứ không phải một tài sản được mang trong thời đại.
ToolAcre làm cho phần phụ thuộc đó hiển thị bằng cách gắn nhãn hàng cục bộ với `Intl.DateTimeFormat().resolvedOptions().timeZone`. Ảnh chụp màn hình cho biết thời gian của một đồng hồ và nhật ký máy chủ cho biết thời gian khác đều có thể là kết quả đọc chính xác. Trước tiên hãy so sánh các hàng UTC của chúng; kết quả đầu ra UTC khớp với nhau cho thấy rằng bản trình bày đó, chứ không phải tức thời cơ bản, khác nhau.
Ngày mất mili giây — hợp đồng của nhà xây dựng, tại sao số giây phải được nhân với một nghìn và phạm vi Ngày có thể biểu thị
JavaScript `Date` nhận được mili giây từ kỷ nguyên. ToolAcre của `fromEpoch` nhân giá trị đầu vào giây với 1,000 và giữ nguyên giá trị đầu vào mili giây trước khi xây dựng đối tượng. Chuyển đổi đó là rõ ràng vì việc chuyển 1,717,243,200 trực tiếp đến `new Date` có nghĩa là khoảng 20 ngày sau 1970 chứ không phải 2024 tháng 6.
Quá trình triển khai từ chối số không hữu hạn và mọi giá trị được diễn giải vượt quá ±8.64×10¹⁵ mili giây trước khi định dạng. Giới hạn đó đến từ phạm vi Ngày có tên trong nguồn, không phải từ cơ sở dữ liệu hoặc đồng hồ hệ điều hành. Việc thay đổi bộ chọn có thể di chuyển một giá trị qua ranh giới, do đó, lỗi cũng cho bạn biết đơn vị nào đã được áp dụng.
UTC bộ truy cập so với bộ truy cập cục bộ — getUTCHours và getHours cũng như cách công cụ áp dụng phần bù
ToolAcre không trích xuất các trường có `getUTCHours` và `getHours`; từ ngữ truy cập của phác thảo cụ thể hơn việc triển khai. Nó yêu cầu `Intl.DateTimeFormat` định dạng Ngày một lần bằng `timeZone: "UTC"` và một lần không có ghi đè vùng. Cả hai cuộc gọi đều nhận được cùng một giá trị mili giây, do đó, cả hai cuộc gọi đều không thể tự di chuyển sự kiện.
Sự khác biệt đó quan trọng khi gỡ lỗi. Nếu hàng giây và mili giây đồng ý với nhà sản xuất nhưng nhãn cục bộ làm bạn ngạc nhiên, hãy kiểm tra vùng trình duyệt thay vì thêm giờ vào kỷ nguyên. Số học bù đắp thủ công sẽ tạo ra một thời điểm khác và sau đó cho phép trình định dạng áp dụng lại các quy tắc cục bộ, tạo ra lỗi điều chỉnh kép cổ điển.
UTC và định dạng cục bộ yêu cầu công cụ đọc hai giá trị trong một Ngày
Trình chuyển đổi có thể chứng minh rằng nó yêu cầu trình duyệt `resolvedOptions().timeZone`; nó không thể chứng minh liệu một công cụ cụ thể có thu được mọi quy tắc múi giờ từ hệ điều hành, dữ liệu đi kèm hoặc lớp nền tảng khác hay không. Nguồn cố tình coi máy móc đó là trách nhiệm của động cơ và quay lại cụm từ “giờ địa phương” nếu truy vấn vùng không thành công.
Ranh giới bằng chứng này rất hữu ích. Vùng được đặt tên trong kết quả xác định lựa chọn hiện tại của trình duyệt, nhưng nó không phải là báo cáo phiên bản cho cơ sở dữ liệu múi giờ. Nếu hai môi trường không đồng ý về ngày cũ, hãy ghi lại trình duyệt, hệ điều hành và vùng hiển thị. Trình chuyển đổi cung cấp quan sát; nó không chẩn đoán gói dữ liệu phía sau Intl.
Trình duyệt báo cáo vùng cục bộ, trong khi nguồn quy tắc của nó vẫn là chi tiết triển khai
Đối với hàng ISO, `toISOString()` cung cấp chuỗi UTC có chữ Z ở cuối và ba chữ số phân số. UTC mà con người có thể đọc được và các hàng cục bộ sử dụng bộ định dạng của Vương quốc Anh với năm số, tháng viết tắt, ngày có hai chữ số và đồng hồ 24 giờ. Trình định dạng cũng yêu cầu `shortOffset`, tạo phần chênh lệch có thể áp dụng cho mỗi hàng được hiển thị.
Những lựa chọn đó giải thích tại sao việc sao chép `Date.toString()` từ bảng điều khiển không phải là bằng chứng tương đương. Văn xuôi chính xác của nó phụ thuộc vào địa phương và nằm ngoài hợp đồng đầu ra của công cụ này. ToolAcre sửa các tùy chọn hiển thị trong khi vẫn cho phép vùng cục bộ thực tế thay đổi. Sao chép giá trị ISO khi hệ thống khác cần bản so sánh ổn định mà máy có thể đọc được.
Ví dụ đã hoạt động: một kỷ nguyên, ba kết quả đầu ra — một chuỗi UTC ISO, thời gian được định dạng cục bộ và độ lệch tính bằng phút từ getTimezoneOffset
Nhập 1,717,243,200 và chọn giây. Phép nhân tạo ra 1,717,243,200,000 mili giây mà quá trình kiểm tra thiết lập là `2024-06-01T12:00:00.000Z`. Định dạng hàng UTC ngay lập tức trong UTC; hàng cục bộ định dạng Ngày giống hệt nhau trong vùng trình duyệt và đặt tên cho vùng đó. Hàng giây và mili giây giữ nguyên cả hai dạng số.
Đồng hồ cục bộ chính xác và độ lệch phải được đọc từ thiết bị chạy ví dụ; xuất bản một cái ở đây sẽ giả vờ như mọi độc giả đều có cùng một khu vực. Đó là lý do tại sao quá trình kiểm tra này thành công sử dụng xác nhận ISO làm kết quả cố định và coi đầu ra cục bộ là giá trị được quan sát. Nếu ISO khác, hãy truy cập lại đơn vị đã chọn trước khi điều tra cài đặt vị trí.
Ví dụ đã hoạt động: một kỷ nguyên, ba kết quả đầu ra ToolAcre thực sự hiển thị
Tuyến đường này không cung cấp bộ chọn cho vùng thứ ba tùy ý. `formatInZone` có thể chấp nhận một vùng nội bộ nhưng bảng điều khiển gọi vùng đó cho UTC và chỉ dành cho mặc định của trình duyệt. Một bài báo tuyên bố rằng người dùng có thể chọn Tokyo, Nairobi hoặc Toronto sẽ mô tả một giao diện không được cung cấp, mặc dù Intl có thể hỗ trợ định dạng như vậy ở những nơi khác.
Nó cũng không hiển thị lựa chọn lịch, lựa chọn ngôn ngữ hoặc sửa đổi cơ sở dữ liệu múi giờ. Để chuyển đổi giữa các văn phòng, hãy giữ lại kỷ nguyên làm điểm cố định và sử dụng công cụ có giao diện được ghi lại tên cho vùng mục tiêu. Ở đây, lời hứa hẹp hơn rất có giá trị: phổ quát UTC bên cạnh môi trường cục bộ, không có máy chủ ẩn nào quyết định ý nghĩa cục bộ.
Bài học rút ra: trình duyệt của bạn là đồng hồ và tập bản đồ — và cách trình chuyển đổi dấu thời gian Unix sử dụng nó để hiển thị UTC và cục bộ cạnh nhau mà không cần máy chủ
Trình duyệt hoạt động như cả công cụ số học và môi trường trình bày. ToolAcre phân giải đơn vị, tạo một Ngày, yêu cầu giá trị ISO chuẩn, sau đó định dạng UTC và các chỉ số cục bộ cạnh nhau. Không cần dịch vụ chuyển đổi từ xa cho các bước đó và thiết bị được hiển thị luôn sẵn sàng đưa ra quyết định về hệ số1,000 để xem xét.
Khi đầu ra không đồng nhất giữa các thiết bị, hãy so sánh hàng ISO, ghi chú đơn vị và vùng cục bộ được đặt tên theo thứ tự đó. Ba quan sát đó tách biệt tức thời, quy mô và cách trình bày. Việc coi đồng hồ địa phương là nguồn gốc của sự thật sẽ thu gọn cả ba câu hỏi thành một và khiến chuyển đổi chính xác có vẻ sai bất cứ khi nào người xem thay đổi vùng.