Bộ chuyển đổi Unix Timestamp sang Ngày: Hỗ trợ định dạng 12/24 giờ
Chuyển đổi Unix timestamps thành ngày và giờ dễ đọc cho con người. Chọn giữa định dạng thời gian 12 giờ và 24 giờ với công cụ chuyển đổi đơn giản, thân thiện với người dùng này.
Bộ chuyển đổi dấu thời gian Unix
Ngày & Giờ đã chuyển đổi
Tài liệu hướng dẫn
Bộ chuyển đổi dấu thời gian Unix
Giới thiệu
Dấu thời gian Unix (còn được gọi là thời gian POSIX hoặc thời gian Epoch) là một hệ thống để mô tả một thời điểm trong thời gian. Nó là số giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970 (nửa đêm UTC/GMT), không tính đến các giây nhuận. Dấu thời gian Unix được sử dụng rộng rãi trong các hệ thống máy tính và ngôn ngữ lập trình vì chúng cung cấp một đại diện gọn gàng, độc lập với ngôn ngữ về một khoảnh khắc cụ thể trong thời gian.
Công cụ chuyển đổi dấu thời gian thành ngày này tự động phát hiện và xử lý các dấu thời gian với nhiều độ dài khác nhau, bao gồm độ chính xác micro giây (16 chữ số), độ chính xác mili giây (13 chữ số) và dấu thời gian Unix tiêu chuẩn (10 chữ số). Công cụ xác định định dạng dấu thời gian dựa trên độ dài đầu vào, chuyển đổi nó thành định dạng ngày và giờ dễ đọc và hiển thị kết quả mà không yêu cầu người dùng chỉ định loại dấu thời gian. Nó hỗ trợ cả định dạng thời gian 12 giờ (AM/PM) và 24 giờ để phù hợp với các sở thích khu vực và cá nhân khác nhau.
Cách Dấu Thời Gian Unix Hoạt Động
Dấu thời gian Unix được tính toán là số giây kể từ Epoch Unix (ngày 1 tháng 1 năm 1970, 00:00:00 UTC). Điều này làm cho chúng đặc biệt hữu ích cho việc tính toán chênh lệch thời gian và lưu trữ ngày tháng ở định dạng gọn gàng.
Công thức toán học chuyển đổi từ dấu thời gian Unix sang ngày lịch bao gồm một số bước:
- Bắt đầu với Epoch Unix (ngày 1 tháng 1 năm 1970, 00:00:00 UTC)
- Thêm số giây trong dấu thời gian
- Tính đến các năm nhuận, độ dài tháng khác nhau và các phức tạp khác của lịch
- Áp dụng điều chỉnh múi giờ nếu cần
Ví dụ, dấu thời gian Unix 1609459200
đại diện cho thứ Sáu, ngày 1 tháng 1 năm 2021, 00:00:00 UTC.
Công thức chuyển đổi có thể được biểu diễn như sau:
Hầu hết các ngôn ngữ lập trình và hệ điều hành cung cấp các hàm tích hợp sẵn để xử lý chuyển đổi này, trừu tượng hóa các phép tính lịch phức tạp.
Định Dạng Dấu Thời Gian và Phát Hiện Tự Động
Bộ chuyển đổi của chúng tôi hỗ trợ ba định dạng dấu thời gian phổ biến, được phát hiện tự động dựa trên số chữ số:
-
Dấu Thời Gian Unix Tiêu Chuẩn (10 chữ số): Đại diện cho giây kể từ Epoch Unix. Ví dụ:
1609459200
(ngày 1 tháng 1 năm 2021, 00:00:00 UTC) -
Độ Chính Xác Mili Giây (13 chữ số): Đại diện cho mili giây kể từ Epoch Unix. Ví dụ:
1609459200000
(ngày 1 tháng 1 năm 2021, 00:00:00 UTC) -
Độ Chính Xác Micro Giây (16 chữ số): Đại diện cho micro giây kể từ Epoch Unix. Ví dụ:
1609459200000000
(ngày 1 tháng 1 năm 2021, 00:00:00 UTC)
Việc phát hiện tự động hoạt động bằng cách phân tích độ dài của đầu vào:
- Nếu đầu vào chứa 10 chữ số, nó được coi là dấu thời gian Unix tiêu chuẩn (giây)
- Nếu đầu vào chứa 13 chữ số, nó được coi là dấu thời gian mili giây
- Nếu đầu vào chứa 16 chữ số, nó được coi là dấu thời gian micro giây
Việc phát hiện tự động này loại bỏ sự cần thiết cho người dùng phải chỉ định loại dấu thời gian, làm cho công cụ trở nên thân thiện và hiệu quả hơn.
Tùy Chọn Định Dạng Thời Gian
Bộ chuyển đổi này cung cấp hai tùy chọn định dạng thời gian:
-
Định Dạng 24 Giờ (đôi khi được gọi là "thời gian quân đội"): Giờ dao động từ 0 đến 23, và không có ký hiệu AM/PM. Ví dụ, 3:00 PM được biểu diễn là 15:00.
-
Định Dạng 12 Giờ: Giờ dao động từ 1 đến 12, với AM (ante meridiem) cho thời gian từ nửa đêm đến trưa, và PM (post meridiem) cho thời gian từ trưa đến nửa đêm. Ví dụ, 15:00 trong định dạng 24 giờ được biểu diễn là 3:00 PM.
Sự lựa chọn giữa các định dạng này chủ yếu là vấn đề về quy ước khu vực và sở thích cá nhân:
- Định dạng 24 giờ thường được sử dụng ở hầu hết châu Âu, Mỹ Latinh và châu Á, cũng như trong các ngữ cảnh khoa học, quân sự và y tế trên toàn thế giới.
- Định dạng 12 giờ phổ biến ở Hoa Kỳ, Canada, Úc và một số quốc gia nói tiếng Anh khác trong việc sử dụng hàng ngày.
Các Trường Hợp Cạnh và Giới Hạn
Khi làm việc với các dấu thời gian Unix có độ chính xác khác nhau, điều quan trọng là phải nhận thức về một số trường hợp cạnh và giới hạn:
-
Dấu thời gian âm: Những dấu thời gian này đại diện cho các ngày trước Epoch Unix (ngày 1 tháng 1 năm 1970). Mặc dù hợp lệ về mặt toán học, một số hệ thống có thể không xử lý đúng các dấu thời gian âm. Điều này áp dụng cho cả ba định dạng dấu thời gian.
-
Vấn đề Năm 2038: Dấu thời gian Unix tiêu chuẩn (10 chữ số) thường được lưu trữ dưới dạng số nguyên 32 bit có dấu, điều này sẽ tràn vào ngày 19 tháng 1 năm 2038. Sau thời điểm này, các hệ thống 32 bit sẽ không thể biểu diễn thời gian chính xác trừ khi được sửa đổi để sử dụng kiểu số nguyên lớn hơn.
-
Cân nhắc về độ chính xác:
- Dấu thời gian tiêu chuẩn (10 chữ số) có độ chính xác ở cấp giây, điều này đủ cho hầu hết các ứng dụng hàng ngày.
- Dấu thời gian mili giây (13 chữ số) cung cấp độ chính xác gấp 1000 lần, hữu ích cho các ứng dụng yêu cầu thời gian chính xác hơn.
- Dấu thời gian micro giây (16 chữ số) cung cấp độ chính xác tinh vi hơn (1/1.000.000 giây), điều này cần thiết cho tính toán hiệu suất cao, các ứng dụng khoa học và một số giao dịch tài chính.
-
Dấu thời gian cực lớn: Các ngày xa trong tương lai có thể không thể biểu diễn trong một số hệ thống, hoặc có thể được xử lý không nhất quán. Điều này đặc biệt liên quan đến các dấu thời gian mili giây và micro giây, sử dụng các giá trị số lớn hơn.
-
Giây nhuận: Thời gian Unix không tính đến các giây nhuận, thường được thêm vào UTC để bù đắp cho sự quay không đều của Trái Đất. Điều này có nghĩa là thời gian Unix không được đồng bộ chính xác với thời gian thiên văn.
-
Cân nhắc về múi giờ: Dấu thời gian Unix đại diện cho những khoảnh khắc ở UTC. Việc chuyển đổi sang giờ địa phương cần thông tin múi giờ bổ sung.
-
Giờ mùa hè: Khi chuyển đổi dấu thời gian sang giờ địa phương, các phức tạp của việc chuyển đổi Giờ Mùa Hè phải được xem xét.
-
Nhầm lẫn định dạng dấu thời gian: Nếu không có phát hiện đúng, một dấu thời gian mili giây 13 chữ số có thể bị hiểu nhầm là một ngày rất xa trong tương lai nếu được xử lý như một dấu thời gian tính bằng giây. Bộ chuyển đổi của chúng tôi ngăn chặn điều này bằng cách tự động phát hiện định dạng dựa trên độ dài chữ số.
Các Trường Hợp Sử Dụng
Các dấu thời gian Unix với các độ chính xác khác nhau được sử dụng trong nhiều ứng dụng trên toàn bộ lĩnh vực máy tính và quản lý dữ liệu:
-
Ghi Chép Cơ Sở Dữ Liệu: Dấu thời gian thường được sử dụng để ghi lại thời điểm các mục được tạo hoặc sửa đổi.
- Dấu thời gian tiêu chuẩn (10 chữ số) thường đủ cho các ứng dụng cơ sở dữ liệu chung.
- Dấu thời gian mili giây (13 chữ số) được sử dụng khi cần sắp xếp các sự kiện chính xác hơn.
-
Phát Triển Web: Các tiêu đề HTTP, cookie và cơ chế bộ nhớ đệm thường sử dụng dấu thời gian Unix.
- Hàm
Date.now()
của JavaScript trả về dấu thời gian mili giây (13 chữ số).
- Hàm
-
Tệp Nhật Ký: Các nhật ký hệ thống thường ghi lại các sự kiện với dấu thời gian Unix để sắp xếp theo thứ tự thời gian chính xác.
- Các hệ thống ghi nhật ký tần suất cao có thể sử dụng độ chính xác mili giây hoặc micro giây.
-
Hệ Thống Kiểm Soát Phiên Bản: Git và các hệ thống VCS khác sử dụng dấu thời gian để ghi lại thời điểm các cam kết được thực hiện.
-
Phản Hồi API: Nhiều API web bao gồm dấu thời gian trong phản hồi của chúng để chỉ ra thời điểm dữ liệu được tạo ra hoặc khi tài nguyên được sửa đổi lần cuối.
- Các API REST thường sử dụng dấu thời gian có độ chính xác mili giây.
-
Hệ Thống Tệp: Thời gian tạo và sửa đổi tệp thường được lưu trữ dưới dạng dấu thời gian Unix.
-
Quản Lý Phiên: Các ứng dụng web sử dụng dấu thời gian để xác định khi nào các phiên người dùng nên hết hạn.
-
Phân Tích Dữ Liệu: Dấu thời gian cung cấp một cách tiêu chuẩn để làm việc với dữ liệu tạm thời trong các ứng dụng phân tích.
-
Giao Dịch Tần Suất Cao: Các hệ thống tài chính thường yêu cầu độ chính xác micro giây (16 chữ số) để sắp xếp chính xác các giao dịch.
-
Đo Lường Khoa Học: Thiết bị nghiên cứu có thể ghi lại các quan sát với độ chính xác micro giây để phân tích tạm thời chính xác.
Các Giải Pháp Thay Thế
Mặc dù dấu thời gian Unix được sử dụng rộng rãi, có những định dạng đại diện thời gian thay thế có thể phù hợp hơn trong một số ngữ cảnh:
-
ISO 8601: Một định dạng chuỗi tiêu chuẩn (ví dụ: "2021-01-01T00:00:00Z") mà dễ đọc cho con người trong khi vẫn giữ được khả năng sắp xếp. Nó thường được ưa chuộng cho việc trao đổi dữ liệu và các ứng dụng hướng tới người dùng.
-
RFC 3339: Một hồ sơ của ISO 8601 được sử dụng trong các giao thức internet, với các yêu cầu định dạng nghiêm ngặt hơn.
-
Định Dạng Dễ Đọc Cho Con Người: Các chuỗi ngày tháng được địa phương hóa (ví dụ: "Ngày 1 tháng 1 năm 2021") phù hợp hơn cho tương tác trực tiếp với người dùng nhưng ít phù hợp hơn cho tính toán.
-
Microsoft FILETIME: Một giá trị 64 bit đại diện cho số khoảng thời gian 100 nanô giây kể từ ngày 1 tháng 1 năm 1601, được sử dụng trong các hệ thống Windows.
-
Số Ngày Julian: Được sử dụng trong thiên văn học và một số ứng dụng khoa học, đếm số ngày kể từ ngày 1 tháng 1 năm 4713 TCN.
Sự lựa chọn định dạng thời gian phụ thuộc vào các yếu tố như:
- Độ chính xác yêu cầu
- Nhu cầu dễ đọc cho con người
- Giới hạn lưu trữ
- Tính tương thích với các hệ thống hiện có
- Phạm vi các ngày cần được biểu diễn
Lịch Sử
Khái niệm về thời gian Unix bắt nguồn từ sự phát triển của hệ điều hành Unix tại Bell Labs vào cuối những năm 1960 và đầu những năm 1970. Quyết định sử dụng ngày 1 tháng 1 năm 1970 làm epoch là một điều gì đó tùy ý nhưng thực tiễn cho thời điểm đó—nó gần đây đủ để giảm thiểu yêu cầu lưu trữ cho các ngày tháng quan tâm nhưng đủ xa trong quá khứ để hữu ích cho dữ liệu lịch sử.
Việc triển khai ban đầu sử dụng một số nguyên 32 bit có dấu để lưu trữ số giây, điều này đủ cho tuổi thọ dự kiến của các hệ thống Unix vào thời điểm đó. Tuy nhiên, quyết định này dẫn đến Vấn Đề Năm 2038 (đôi khi được gọi là "Y2K38" hoặc "Lỗi Thiên Niên Kỷ Unix"), vì các số nguyên 32 bit có dấu chỉ có thể biểu diễn các ngày đến ngày 19 tháng 1 năm 2038 (03:14:07 UTC).
Khi nhu cầu tính toán phát triển, các dấu thời gian có độ chính xác cao hơn trở nên cần thiết:
-
Độ Chính Xác Mili Giây (13 chữ số) trở nên phổ biến với sự gia tăng của tính toán tương tác và nhu cầu đo lường độ nhạy của giao diện người dùng.
-
Độ Chính Xác Micro Giây (16 chữ số) xuất hiện với các ứng dụng tính toán hiệu suất cao và các hệ thống yêu cầu thời gian cực kỳ chính xác.
Khi Unix và các hệ điều hành giống Unix ngày càng trở nên phổ biến, dấu thời gian Unix trở thành một tiêu chuẩn mặc định để biểu diễn thời gian trong máy tính. Nó đã được nhiều ngôn ngữ lập trình, cơ sở dữ liệu và ứng dụng áp dụng, mở rộng xa hơn môi trường Unix ban đầu.
Các hệ thống hiện đại ngày càng sử dụng số nguyên 64 bit cho các dấu thời gian, điều này mở rộng phạm vi có thể biểu diễn lên khoảng 292 tỷ năm theo cả hai hướng từ epoch, hiệu quả giải quyết Vấn Đề Năm 2038. Tuy nhiên, các hệ thống và ứng dụng cũ có thể vẫn bị tổn thương.
Sự đơn giản và tiện ích của dấu thời gian Unix đã đảm bảo sự liên quan của nó mặc dù đã phát triển các định dạng biểu diễn thời gian tinh vi hơn. Nó vẫn là một khái niệm cơ bản trong máy tính, làm nền tảng cho nhiều cơ sở hạ tầng kỹ thuật số của chúng ta.
Ví Dụ Mã
Dưới đây là các ví dụ về cách chuyển đổi các dấu thời gian Unix với các độ chính xác khác nhau thành các ngày dễ đọc trong các ngôn ngữ lập trình khác nhau:
1// Chuyển đổi dấu thời gian JavaScript với phát hiện định dạng tự động
2function convertTimestamp(timestamp, use12Hour = false) {
3 // Chuyển đổi chuỗi thành số nếu cần
4 const numericTimestamp = Number(timestamp);
5
6 // Phát hiện định dạng dấu thời gian dựa trên độ dài chữ số
7 let date;
8 if (timestamp.length === 16) {
9 // Độ chính xác micro giây (chia cho 1.000.000 để lấy giây)
10 date = new Date(numericTimestamp / 1000);
11 console.log("Phát hiện: Dấu thời gian độ chính xác micro giây");
12 } else if (timestamp.length === 13) {
13 // Độ chính xác mili giây
14 date = new Date(numericTimestamp);
15 console.log("Phát hiện: Dấu thời gian độ chính xác mili giây");
16 } else if (timestamp.length === 10) {
17 // Dấu thời gian Unix tiêu chuẩn (giây)
18 date = new Date(numericTimestamp * 1000);
19 console.log("Phát hiện: Dấu thời gian Unix tiêu chuẩn (giây)");
20 } else {
21 throw new Error("Định dạng dấu thời gian không hợp lệ. Mong đợi 10, 13, hoặc 16 chữ số.");
22 }
23
24 // Tùy chọn định dạng
25 const options = {
26 year: 'numeric',
27 month: 'long',
28 day: 'numeric',
29 weekday: 'long',
30 hour: use12Hour ? 'numeric' : '2-digit',
31 minute: '2-digit',
32 second: '2-digit',
33 hour12: use12Hour
34 };
35
36 // Chuyển đổi thành chuỗi sử dụng định dạng địa phương
37 return date.toLocaleString(undefined, options);
38}
39
40// Ví dụ sử dụng
41try {
42 // Dấu thời gian Unix tiêu chuẩn (10 chữ số)
43 console.log(convertTimestamp("1609459200", false));
44
45 // Độ chính xác mili giây (13 chữ số)
46 console.log(convertTimestamp("1609459200000", false));
47
48 // Độ chính xác micro giây (16 chữ số)
49 console.log(convertTimestamp("1609459200000000", true));
50} catch (error) {
51 console.error(error.message);
52}
53
1# Chuyển đổi dấu thời gian Python với phát hiện định dạng tự động
2import datetime
3
4def convert_timestamp(timestamp, use_12hour=False):
5 # Chuyển đổi thành số nguyên
6 timestamp = str(timestamp).strip()
7 numeric_timestamp = int(timestamp)
8
9 # Phát hiện định dạng dấu thời gian dựa trên độ dài chữ số
10 if len(timestamp) == 16:
11 # Độ chính xác micro giây (chia cho 1.000.000 để lấy giây)
12 date = datetime.datetime.fromtimestamp(numeric_timestamp / 1000000)
13 print("Phát hiện: Dấu thời gian độ chính xác micro giây")
14 elif len(timestamp) == 13:
15 # Độ chính xác mili giây (chia cho 1.000 để lấy giây)
16 date = datetime.datetime.fromtimestamp(numeric_timestamp / 1000)
17 print("Phát hiện: Dấu thời gian độ chính xác mili giây")
18 elif len(timestamp) == 10:
19 # Dấu thời gian Unix tiêu chuẩn (giây)
20 date = datetime.datetime.fromtimestamp(numeric_timestamp)
21 print("Phát hiện: Dấu thời gian Unix tiêu chuẩn (giây)")
22 else:
23 raise ValueError("Định dạng dấu thời gian không hợp lệ. Mong đợi 10, 13, hoặc 16 chữ số.")
24
25 # Định dạng chuỗi ngày
26 if use_12hour:
27 format_string = "%A, %B %d, %Y %I:%M:%S %p" # Định dạng 12 giờ với AM/PM
28 else:
29 format_string = "%A, %B %d, %Y %H:%M:%S" # Định dạng 24 giờ
30
31 return date.strftime(format_string)
32
33# Ví dụ sử dụng
34try:
35 # Dấu thời gian Unix tiêu chuẩn (10 chữ số)
36 print(convert_timestamp("1609459200", False))
37
38 # Độ chính xác mili giây (13 chữ số)
39 print(convert_timestamp("1609459200000", False))
40
41 # Độ chính xác micro giây (16 chữ số)
42 print(convert_timestamp("1609459200000000", True))
43except ValueError as e:
44 print(e)
45
1<?php
2// Chuyển đổi dấu thời gian PHP với phát hiện định dạng tự động
3function convertTimestamp($timestamp, $use12Hour = false) {
4 // Đảm bảo dấu thời gian là một chuỗi để kiểm tra độ dài
5 $timestamp = trim((string)$timestamp);
6
7 // Phát hiện định dạng dấu thời gian dựa trên độ dài chữ số
8 if (strlen($timestamp) === 16) {
9 // Độ chính xác micro giây (chia cho 1.000.000 để lấy giây)
10 $seconds = $numericTimestamp / 1000000;
11 echo "Phát hiện: Dấu thời gian độ chính xác micro giây\n";
12 } elseif (strlen($timestamp) === 13) {
13 // Độ chính xác mili giây
14 $seconds = $numericTimestamp / 1000;
15 echo "Phát hiện: Dấu thời gian độ chính xác mili giây\n";
16 } elseif (strlen($timestamp) === 10) {
17 // Dấu thời gian Unix tiêu chuẩn (giây)
18 $seconds = $numericTimestamp;
19 echo "Phát hiện: Dấu thời gian Unix tiêu chuẩn (giây)\n";
20 } else {
21 throw new Exception("Định dạng dấu thời gian không hợp lệ. Mong đợi 10, 13, hoặc 16 chữ số.");
22 }
23
24 // Định dạng chuỗi
25 $formatString = $use12Hour
26 ? 'l, F j, Y g:i:s A' // Định dạng 12 giờ với AM/PM
27 : 'l, F j, Y H:i:s'; // Định dạng 24 giờ
28
29 // Chuyển đổi và định dạng ngày
30 return date($formatString, $seconds);
31}
32
33// Ví dụ sử dụng
34try {
35 // Dấu thời gian Unix tiêu chuẩn (10 chữ số)
36 echo convertTimestamp("1609459200", false) . "\n";
37
38 // Độ chính xác mili giây (13 chữ số)
39 echo convertTimestamp("1609459200000", false) . "\n";
40
41 // Độ chính xác micro giây (16 chữ số)
42 echo convertTimestamp("1609459200000000", true) . "\n";
43} catch (Exception $e) {
44 echo $e->getMessage() . "\n";
45}
46?>
47
1// Chuyển đổi dấu thời gian Java với phát hiện định dạng tự động
2import java.time.Instant;
3import java.time.LocalDateTime;
4import java.time.ZoneId;
5import java.time.format.DateTimeFormatter;
6
7public class TimestampConverter {
8 public static String convertTimestamp(String timestamp, boolean use12Hour) {
9 // Trim đầu vào
10 timestamp = timestamp.trim();
11
12 // Phát hiện định dạng dấu thời gian dựa trên độ dài chữ số
13 LocalDateTime dateTime;
14 if (timestamp.length() == 16) {
15 // Độ chính xác micro giây (chia cho 1.000.000 để lấy giây)
16 long microseconds = Long.parseLong(timestamp);
17 Instant instant = Instant.ofEpochSecond(0, microseconds * 1000); // Chuyển đổi sang nan giây
18 dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
19 System.out.println("Phát hiện: Dấu thời gian độ chính xác micro giây");
20 } else if (timestamp.length() == 13) {
21 // Độ chính xác mili giây
22 long milliseconds = Long.parseLong(timestamp);
23 Instant instant = Instant.ofEpochMilli(milliseconds);
24 dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
25 System.out.println("Phát hiện: Dấu thời gian độ chính xác mili giây");
26 } else if (timestamp.length() == 10) {
27 // Dấu thời gian Unix tiêu chuẩn (giây)
28 long seconds = Long.parseLong(timestamp);
29 Instant instant = Instant.ofEpochSecond(seconds);
30 dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
31 System.out.println("Phát hiện: Dấu thời gian Unix tiêu chuẩn (giây)");
32 } else {
33 throw new IllegalArgumentException("Định dạng dấu thời gian không hợp lệ. Mong đợi 10, 13, hoặc 16 chữ số.");
34 }
35
36 // Tạo định dạng dựa trên định dạng mong muốn
37 DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
38 use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
39 );
40
41 // Định dạng ngày
42 return dateTime.format(formatter);
43 }
44
45 public static void main(String[] args) {
46 try {
47 // Dấu thời gian Unix tiêu chuẩn (10 chữ số)
48 System.out.println(convertTimestamp("1609459200", false));
49
50 // Độ chính xác mili giây (13 chữ số)
51 System.out.println(convertTimestamp("1609459200000", false));
52
53 // Độ chính xác micro giây (16 chữ số)
54 System.out.println(convertTimestamp("1609459200000000", true));
55 } catch (IllegalArgumentException e) {
56 System.err.println(e.getMessage());
57 }
58 }
59}
60
1// Chuyển đổi dấu thời gian C# với phát hiện định dạng tự động
2using System;
3
4class TimestampConverter
5{
6 public static string ConvertTimestamp(string timestamp, bool use12Hour)
7 {
8 // Trim đầu vào
9 timestamp = timestamp.Trim();
10
11 // Phát hiện định dạng dấu thời gian dựa trên độ dài chữ số
12 DateTime dateTime;
13 if (timestamp.Length == 16)
14 {
15 // Độ chính xác micro giây (chia cho 1.000.000 để lấy giây)
16 if (!double.TryParse(timestamp, out double microseconds))
17 throw new ArgumentException("Định dạng dấu thời gian không hợp lệ");
18
19 // Chuyển đổi micro giây thành DateTime
20 dateTime = DateTimeOffset.FromUnixTimeSeconds(0).DateTime.AddSeconds(microseconds / 1000000);
21 Console.WriteLine("Phát hiện: Dấu thời gian độ chính xác micro giây");
22 }
23 else if (timestamp.Length == 13)
24 {
25 // Độ chính xác mili giây
26 if (!long.TryParse(timestamp, out long milliseconds))
27 throw new ArgumentException("Định dạng dấu thời gian không hợp lệ");
28
29 dateTime = DateTimeOffset.FromUnixTimeMilliseconds(milliseconds).DateTime;
30 Console.WriteLine("Phát hiện: Dấu thời gian độ chính xác mili giây");
31 }
32 else if (timestamp.Length == 10)
33 {
34 // Dấu thời gian Unix tiêu chuẩn (giây)
35 if (!long.TryParse(timestamp, out long seconds))
36 throw new ArgumentException("Định dạng dấu thời gian không hợp lệ");
37
38 dateTime = DateTimeOffset.FromUnixTimeSeconds(seconds).DateTime;
39 Console.WriteLine("Phát hiện: Dấu thời gian Unix tiêu chuẩn (giây)");
40 }
41 else
42 {
43 throw new ArgumentException("Định dạng dấu thời gian không hợp lệ. Mong đợi 10, 13, hoặc 16 chữ số.");
44 }
45
46 // Định dạng chuỗi dựa trên sở thích 12 giờ hoặc 24 giờ
47 string formatString = use12Hour
48 ? "dddd, MMMM d, yyyy h:mm:ss tt" // Định dạng 12 giờ với AM/PM
49 : "dddd, MMMM d, yyyy HH:mm:ss"; // Định dạng 24 giờ
50
51 // Trả về chuỗi ngày đã định dạng
52 return dateTime.ToString(formatString);
53 }
54
55 static void Main()
56 {
57 try
58 {
59 // Dấu thời gian Unix tiêu chuẩn (10 chữ số)
60 Console.WriteLine(ConvertTimestamp("1609459200", false));
61
62 // Độ chính xác mili giây (13 chữ số)
63 Console.WriteLine(ConvertTimestamp("1609459200000", false));
64
65 // Độ chính xác micro giây (16 chữ số)
66 Console.WriteLine(ConvertTimestamp("1609459200000000", true));
67 }
68 catch (ArgumentException e)
69 {
70 Console.WriteLine(e.Message);
71 }
72 }
73}
74
Xử Lý Các Trường Hợp Cạnh
Khi làm việc với các dấu thời gian Unix có độ chính xác khác nhau, điều quan trọng là phải xử lý các trường hợp cạnh một cách chính xác. Dưới đây là một ví dụ cho thấy cách xử lý toàn diện các trường hợp cạnh:
1// JavaScript xử lý toàn diện các trường hợp cạnh cho nhiều định dạng dấu thời gian
2function safeConvertTimestamp(timestamp, use12Hour = false) {
3 // Kiểm tra đầu vào
4 if (timestamp === undefined || timestamp === null || timestamp === '') {
5 return "Lỗi: Dấu thời gian trống hoặc không xác định";
6 }
7
8 // Đảm bảo dấu thời gian là một chuỗi để kiểm tra độ dài
9 const timestampStr = String(timestamp).trim();
10
11 // Kiểm tra xem dấu thời gian có chỉ chứa chữ số hay không
12 if (!/^\d+$/.test(timestampStr)) {
13 return "Lỗi: Dấu thời gian phải chỉ chứa chữ số";
14 }
15
16 // Phát hiện định dạng dựa trên độ dài
17 let date;
18 try {
19 if (timestampStr.length === 16) {
20 // Độ chính xác micro giây
21 const microseconds = Number(timestampStr);
22 date = new Date(microseconds / 1000); // Chuyển đổi sang mili giây
23 console.log("Đang xử lý dấu thời gian micro giây (16 chữ số)");
24
25 // Kiểm tra ngày không hợp lệ
26 if (isNaN(date.getTime())) {
27 return "Lỗi: Dấu thời gian micro giây không hợp lệ";
28 }
29 } else if (timestampStr.length === 13) {
30 // Độ chính xác mili giây
31 const milliseconds = Number(timestampStr);
32 date = new Date(milliseconds);
33 console.log("Đang xử lý dấu thời gian mili giây (13 chữ số)");
34
35 // Kiểm tra ngày không hợp lệ
36 if (isNaN(date.getTime())) {
37 return "Lỗi: Dấu thời gian mili giây không hợp lệ";
38 }
39 } else if (timestampStr.length === 10) {
40 // Dấu thời gian Unix tiêu chuẩn (giây)
41 const seconds = Number(timestampStr);
42 date = new Date(seconds * 1000);
43 console.log("Đang xử lý dấu thời gian tiêu chuẩn (10 chữ số)");
44
45 // Kiểm tra ngày không hợp lệ
46 if (isNaN(date.getTime())) {
47 return "Lỗi: Dấu thời gian tiêu chuẩn không hợp lệ";
48 }
49
50 // Kiểm tra vấn đề Y2K38 (đối với hệ thống 32 bit)
51 const maxInt32 = 2147483647; // Giá trị tối đa cho số nguyên 32 bit có dấu
52 if (seconds > maxInt32) {
53 console.warn("Cảnh báo: Dấu thời gian vượt quá giới hạn số nguyên 32 bit (vấn đề Y2K38)");
54 }
55 } else {
56 return "Lỗi: Độ dài dấu thời gian không hợp lệ. Mong đợi 10, 13, hoặc 16 chữ số.";
57 }
58
59 // Định dạng ngày
60 const options = {
61 year: 'numeric',
62 month: 'long',
63 day: 'numeric',
64 weekday: 'long',
65 hour: use12Hour ? 'numeric' : '2-digit',
66 minute: '2-digit',
67 second: '2-digit',
68 hour12: use12Hour
69 };
70
71 return date.toLocaleString(undefined, options);
72 } catch (error) {
73 return "Lỗi chuyển đổi dấu thời gian: " + error.message;
74 }
75}
76
77// Kiểm tra với các trường hợp cạnh khác nhau
78console.log(safeConvertTimestamp("1609459200")); // Tiêu chuẩn (10 chữ số)
79console.log(safeConvertTimestamp("1609459200000")); // Mili giây (13 chữ số)
80console.log(safeConvertTimestamp("1609459200000000")); // Micro giây (16 chữ số)
81console.log(safeConvertTimestamp("abc123")); // Không phải số
82console.log(safeConvertTimestamp("12345")); // Độ dài không hợp lệ
83console.log(safeConvertTimestamp("9999999999999999")); // Dấu thời gian micro giây cực lớn
84console.log(safeConvertTimestamp("")); // Chuỗi trống
85
Câu Hỏi Thường Gặp
Dấu thời gian Unix là gì?
Dấu thời gian Unix là số giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970 (nửa đêm UTC/GMT), không tính đến các giây nhuận. Nó cung cấp một cách đại diện gọn gàng, độc lập với ngôn ngữ để biểu diễn một khoảnh khắc cụ thể trong thời gian.
Phát hiện định dạng dấu thời gian tự động hoạt động như thế nào?
Bộ chuyển đổi tự động phát hiện định dạng dấu thời gian dựa trên số chữ số:
- 10 chữ số: Dấu thời gian Unix tiêu chuẩn (giây kể từ epoch)
- 13 chữ số: Dấu thời gian độ chính xác mili giây
- 16 chữ số: Dấu thời gian độ chính xác micro giây
Tại sao tôi cần độ chính xác mili giây hoặc micro giây?
Độ chính xác mili giây (13 chữ số) hữu ích cho các ứng dụng yêu cầu thời gian chính xác hơn, chẳng hạn như theo dõi hiệu suất, theo dõi tương tác người dùng và một số ứng dụng tài chính. Độ chính xác micro giây (16 chữ số) cần thiết cho tính toán hiệu suất cao, các ứng dụng khoa học và các hệ thống giao dịch tần suất cao nơi thời gian cực kỳ chính xác là rất quan trọng.
Tôi có thể chuyển đổi các ngày trước năm 1970 bằng dấu thời gian Unix không?
Có, các ngày trước ngày 1 tháng 1 năm 1970 được biểu diễn bằng các dấu thời gian âm. Tuy nhiên, một số hệ thống có thể không xử lý đúng các dấu thời gian âm, vì vậy điều quan trọng là phải kiểm tra chức năng này nếu bạn cần làm việc với các ngày lịch sử.
Vấn đề Năm 2038 là gì?
Vấn đề Năm 2038 xảy ra vì nhiều hệ thống lưu trữ dấu thời gian Unix dưới dạng số nguyên 32 bit có dấu, điều này chỉ có thể biểu diễn các ngày đến ngày 19 tháng 1 năm 2038 (03:14:07 UTC). Sau thời điểm này, số nguyên sẽ tràn, có thể gây ra sự cố hệ thống. Các hệ thống hiện đại ngày càng sử dụng số nguyên 64 bit để tránh vấn đề này.
Làm thế nào tôi xử lý các chuyển đổi múi giờ với dấu thời gian Unix?
Dấu thời gian Unix luôn ở UTC (Thời gian Phối hợp Toàn cầu). Để chuyển đổi sang một múi giờ cụ thể, bạn cần áp dụng độ lệch thích hợp sau khi chuyển đổi dấu thời gian thành một ngày. Hầu hết các ngôn ngữ lập trình cung cấp các hàm tích hợp để xử lý các chuyển đổi múi giờ.
Sự khác biệt giữa thời gian Unix và ISO 8601 là gì?
Thời gian Unix là một đại diện số (giây kể từ epoch), trong khi ISO 8601 là một định dạng chuỗi (ví dụ: "2021-01-01T00:00:00Z"). Thời gian Unix gọn gàng hơn và dễ sử dụng cho các phép tính, trong khi ISO 8601 dễ đọc hơn cho con người và tự mô tả hơn.
Dấu thời gian Unix chính xác như thế nào?
Dấu thời gian Unix tiêu chuẩn có độ chính xác ở cấp giây. Đối với các ứng dụng yêu cầu độ chính xác cao hơn, các dấu thời gian mili giây (13 chữ số) cung cấp độ chính xác 1/1000 giây, và các dấu thời gian micro giây (16 chữ số) cung cấp độ chính xác 1/1.000.000 giây.
Dấu thời gian Unix có tính đến các giây nhuận không?
Không, thời gian Unix được định nghĩa là số giây kể từ epoch, không bao gồm các giây nhuận. Điều này có nghĩa là trong một giây nhuận, dấu thời gian Unix không tăng. Điều này có thể gây ra vấn đề trong các ứng dụng yêu cầu thời gian thiên văn chính xác.
Tôi có thể sử dụng dấu thời gian Unix để lập lịch các sự kiện trong tương lai không?
Có, dấu thời gian Unix thường được sử dụng để lập lịch. Tuy nhiên, đối với các ngày rất xa trong tương lai, hãy nhận thức về các giới hạn tiềm năng như vấn đề Năm 2038 đối với các hệ thống 32 bit và việc xử lý các thay đổi múi giờ và các chuyển đổi giờ mùa hè.
Tài Liệu Tham Khảo
-
"Thời gian Unix." Wikipedia, Quỹ Wikimedia, https://en.wikipedia.org/wiki/Unix_time
-
"Vấn đề Năm 2038." Wikipedia, Quỹ Wikimedia, https://en.wikipedia.org/wiki/Year_2038_problem
-
Olson, Arthur David. "Các Phức Tạp của Thời Gian Lịch." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf
-
"ISO 8601." Wikipedia, Quỹ Wikimedia, https://en.wikipedia.org/wiki/ISO_8601
-
"RFC 3339: Ngày và Thời gian trên Internet: Dấu Thời gian." Nhóm Kỹ thuật Internet (IETF), https://tools.ietf.org/html/rfc3339
-
Kernighan, Brian W., và Dennis M. Ritchie. "Ngôn Ngữ Lập Trình C." Prentice Hall, 1988.
-
"Thời Gian Chính Xác trong Tính Toán Hiệu Suất Cao." ACM Computing Surveys, https://dl.acm.org/doi/10.1145/3232678
-
"Biểu Diễn Thời Gian trong Các Hệ Thống Tài Chính." Tạp Chí Công Nghệ Tài Chính, https://www.fintech-journal.com/time-representation
Hãy thử bộ chuyển đổi dấu thời gian của chúng tôi ngay bây giờ để dễ dàng chuyển đổi các dấu thời gian Unix ở bất kỳ độ chính xác nào thành các ngày dễ đọc. Cho dù bạn đang làm việc với các dấu thời gian Unix tiêu chuẩn, độ chính xác mili giây, hay độ chính xác micro giây, công cụ của chúng tôi tự động phát hiện định dạng và cung cấp các chuyển đổi chính xác.
Phản hồi
Nhấp vào thông báo phản hồi để bắt đầu đưa ra phản hồi về công cụ này
Công cụ Liên quan
Khám phá thêm các công cụ có thể hữu ích cho quy trình làm việc của bạn