Whiz Tools

Bộ chuyển đổi dấu thời gian Unix

الطابع الزمني يونكس هو عدد الثواني منذ 1 يناير 1970 (UTC)

Ngày & Giờ đã chuyển đổi

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 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 thời điểm cụ thể trong thời gian.

Bộ chuyển đổi này cho phép bạn biến đổi một dấu thời gian Unix thành định dạng ngày và giờ dễ đọc cho con người. 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 thức hoạt động của dấu thời gian Unix

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 sự khác biệt về thời gian và cho việc 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:

  1. Bắt đầu với Epoch Unix (ngày 1 tháng 1 năm 1970, 00:00:00 UTC)
  2. Thêm số giây trong dấu thời gian
  3. 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
  4. Á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:

Ngaˋy=Epoch Unix+Daˆˊu thời gian (tıˊnh ba˘ˋng giaˆy)\text{Ngày} = \text{Epoch Unix} + \text{Dấu thời gian (tính bằng giây)}

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 away các phép toán phức tạp của lịch.

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:

  1. Đị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.

  2. Đị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à một vấn đề về quy ước khu vực và sở thích cá nhân:

  • Định dạng 24 giờ được sử dụng phổ biến ở hầu hết châu Âu, Mỹ Latinh và châu Á, cũng như trong các bối 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 cho việc sử dụng hàng ngày.

Các trường hợp và giới hạn biên

Khi làm việc với các dấu thời gian Unix, điều quan trọng là phải nhận thức được một số trường hợp và giới hạn biên:

  1. Dấu thời gian âm: Những dấu 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ù về mặt toán học là hợp lệ, một số hệ thống có thể không xử lý đúng các dấu thời gian âm.

  2. Vấn đề năm 2038: Dấu thời gian Unix thường được lưu trữ dưới dạng số nguyên có dấu 32 bit, đ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ể đại diện đúng thời gian trừ khi được sửa đổi để sử dụng kiểu số nguyên lớn hơn.

  3. Dấu thời gian cực lớn: Các ngày rất xa trong tương lai có thể không thể đại diện trong một số hệ thống, hoặc có thể được xử lý không nhất quán.

  4. 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 hoàn toàn đồng bộ với thời gian thiên văn.

  5. 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 yêu cầu thêm thông tin về múi giờ.

  6. Giờ mùa hè: Khi chuyển đổi các dấu thời gian sang giờ địa phương, cần xem xét các phức tạp của các chuyển tiếp giờ mùa hè.

Các trường hợp sử dụng

Dấu thời gian Unix đượ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:

  1. Bản ghi cơ sở dữ liệu: Dấu thời gian thường được sử dụng để ghi lại khi các mục được tạo hoặc sửa đổi.

  2. Phát triển web: Các tiêu đề HTTP, cookie và cơ chế lưu cache thường sử dụng dấu thời gian Unix.

  3. 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.

  4. Hệ thống quản lý 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 khi các cam kết được thực hiện.

  5. Phản hồi API: Nhiều API web bao gồm các dấu thời gian trong phản hồi của chúng để chỉ ra khi dữ liệu được tạo ra hoặc khi tài nguyên được sửa đổi lần cuối.

  6. 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.

  7. 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 phiên người dùng nên hết hạn.

  8. 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.

Các lựa chọn 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ố bối cảnh nhất định:

  1. 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.

  2. 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.

  3. Đị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.

  4. Microsoft FILETIME: Một giá trị 64 bit đại diện cho số khoảng thời gian 100 nanosecond kể từ ngày 1 tháng 1 năm 1601, được sử dụng trong các hệ thống Windows.

  5. 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 trước Công Nguyên.

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 cần thiết
  • 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 đại 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ứ để có thể 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 có dấu 32 bit để lưu trữ số giây, điều này là đủ 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 có dấu 32 bit chỉ có thể đại diện cho các ngày đến ngày 19 tháng 1 năm 2038 (03:14:07 UTC).

Khi Unix và các hệ thống giống Unix trở nên phổ biến, dấu thời gian Unix đã trở thành một tiêu chuẩn mặc định để đại diện cho 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 chấp nhận, mở rộng xa hơn môi trường Unix ban đầu của nó.

Các hệ thống hiện đại ngày càng sử dụng các số nguyên 64 bit cho dấu thời gian, điều này mở rộng phạm vi có thể đại diện lên khoảng 292 tỷ năm về 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 kế thừa có thể vẫn dễ 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 liên tục của nó mặc dù sự phát triển của các định dạng đại 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 dấu thời gian Unix thành các ngày dễ đọc cho con người trong các ngôn ngữ lập trình khác nhau:

// JavaScript chuyển đổi dấu thời gian
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Tạo một đối tượng Date mới (JavaScript sử dụng mili giây)
  const date = new Date(timestamp * 1000);
  
  // Tùy chọn định dạng
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Chuyển đổi thành chuỗi sử dụng định dạng địa phương
  return date.toLocaleString(undefined, options);
}

// Ví dụ sử dụng
const timestamp = 1609459200; // Ngày 1 tháng 1 năm 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // Định dạng 24 giờ
console.log(convertUnixTimestamp(timestamp, true));  // Định dạng 12 giờ
# Python chuyển đổi dấu thời gian
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Chuyển đổi dấu thời gian Unix thành đối tượng datetime
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Định dạng chuỗi ngày
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # Định dạng 12 giờ với AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # Định dạng 24 giờ
    
    return date.strftime(format_string)

# Ví dụ sử dụng
timestamp = 1609459200  # Ngày 1 tháng 1 năm 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # Định dạng 24 giờ
print(convert_unix_timestamp(timestamp, True))   # Định dạng 12 giờ
<?php
// PHP chuyển đổi dấu thời gian
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Định dạng chuỗi
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // Định dạng 12 giờ với AM/PM
        : 'l, F j, Y H:i:s';   // Định dạng 24 giờ
    
    // Chuyển đổi và định dạng ngày
    return date($formatString, $timestamp);
}

// Ví dụ sử dụng
$timestamp = 1609459200; // Ngày 1 tháng 1 năm 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // Định dạng 24 giờ
echo convertUnixTimestamp($timestamp, true) . "\n";  // Định dạng 12 giờ
?>
// Java chuyển đổi dấu thời gian
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class UnixTimestampConverter {
    public static String convertUnixTimestamp(long timestamp, boolean use12Hour) {
        // Chuyển đổi dấu thời gian Unix thành Instant, sau đó thành LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Tạo định dạng dựa trên định dạng mong muốn
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Định dạng ngày
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // Ngày 1 tháng 1 năm 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // Định dạng 24 giờ
        System.out.println(convertUnixTimestamp(timestamp, true));  // Định dạng 12 giờ
    }
}
// C# chuyển đổi dấu thời gian
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Chuyển đổi dấu thời gian Unix thành DateTime
        // Dấu thời gian Unix là giây kể từ 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Định dạng chuỗi dựa trên sở thích 12 giờ hoặc 24 giờ
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // Định dạng 12 giờ với AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // Định dạng 24 giờ
        
        // Trả về chuỗi ngày đã định dạng
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // Ngày 1 tháng 1 năm 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // Định dạng 24 giờ
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // Định dạng 12 giờ
    }
}
# Ruby chuyển đổi dấu thời gian
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Chuyển đổi dấu thời gian Unix thành đối tượng Time
  time = Time.at(timestamp)
  
  # Định dạng dựa trên sở thích 12 giờ hoặc 24 giờ
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # Định dạng 12 giờ với AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # Định dạng 24 giờ
  end
end

# Ví dụ sử dụng
timestamp = 1609459200  # Ngày 1 tháng 1 năm 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # Định dạng 24 giờ
puts convert_unix_timestamp(timestamp, true)   # Định dạng 12 giờ
// Go chuyển đổi dấu thời gian
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Chuyển đổi dấu thời gian Unix thành Time
    t := time.Unix(timestamp, 0)
    
    // Định dạng chuỗi dựa trên sở thích 12 giờ hoặc 24 giờ
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // Định dạng 12 giờ với AM/PM
    } else {
        formatString += "15:04:05"    // Định dạng 24 giờ
    }
    
    // Trả về thời gian đã định dạng
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // Ngày 1 tháng 1 năm 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // Định dạng 24 giờ
    fmt.Println(convertUnixTimestamp(timestamp, true))  // Định dạng 12 giờ
}
// Swift chuyển đổi dấu thời gian
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Tạo Date từ dấu thời gian Unix
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Tạo DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Đặt kiểu thời gian dựa trên sở thích 12 giờ hoặc 24 giờ
    if use12Hour {
        formatter.timeStyle = .medium
        formatter.amSymbol = "AM"
        formatter.pmSymbol = "PM"
    } else {
        formatter.timeStyle = .medium
        formatter.dateFormat = formatter.dateFormat?.replacingOccurrences(of: "h:mm:ss a", with: "HH:mm:ss")
    }
    
    // Trả về ngày đã định dạng
    return formatter.string(from: date)
}

// Ví dụ sử dụng
let timestamp = 1609459200 // Ngày 1 tháng 1 năm 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // Định dạng 24 giờ
print(convertUnixTimestamp(timestamp, use12Hour: true))  // Định dạng 12 giờ
# R chuyển đổi dấu thời gian
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Chuyển đổi dấu thời gian Unix thành datetime POSIXct
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Định dạng dựa trên sở thích 12 giờ hoặc 24 giờ
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # Định dạng 12 giờ với AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # Định dạng 24 giờ
  }
  
  # Trả về chuỗi ngày đã định dạng
  format(date_time, format_string)
}

# Ví dụ sử dụng
timestamp <- 1609459200  # Ngày 1 tháng 1 năm 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # Định dạng 24 giờ
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # Định dạng 12 giờ
% MATLAB chuyển đổi dấu thời gian
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Chuyển đổi dấu thời gian Unix thành datetime MATLAB
    % Ngày tháng trong Excel là số ngày kể từ 1900-01-01, với 1 = 1900-01-01
    % Dấu thời gian Unix là giây kể từ 1970-01-01
    
    % Đầu tiên chuyển đổi sang định dạng ngày tháng Excel
    % 25569 là số ngày giữa 1900-01-01 và 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Định dạng dựa trên sở thích 12 giờ hoặc 24 giờ
    if use12Hour
        formattedDate = datestr(excelDate, 'dddd, mmmm dd, yyyy h:mm:ss AM/PM');
    else
        formattedDate = datestr(excelDate, 'dddd, mmmm dd, yyyy hh:mm:ss');
    end
end

% Ví dụ sử dụng
timestamp = 1609459200;  % Ngày 1 tháng 1 năm 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % Định dạng 24 giờ
disp(convertUnixTimestamp(timestamp, true))   % Định dạng 12 giờ
' Excel VBA chuyển đổi dấu thời gian
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Chuyển đổi dấu thời gian Unix thành ngày/thời gian Excel
    ' Ngày tháng trong Excel là số ngày kể từ 1900-01-01, với 1 = 1900-01-01
    ' Dấu thời gian Unix là giây kể từ 1970-01-01
    
    ' Đầu tiên chuyển đổi sang định dạng ngày tháng Excel
    ' 25569 là số ngày giữa 1900-01-01 và 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Định dạng dựa trên sở thích 12 giờ hoặc 24 giờ
    If use12Hour Then
        ConvertUnixTimestamp = Format(excelDate, "dddd, mmmm d, yyyy h:mm:ss AM/PM")
    Else
        ConvertUnixTimestamp = Format(excelDate, "dddd, mmmm d, yyyy hh:mm:ss")
    End If
End Function

' Sử dụng trong một worksheet:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' Định dạng 12 giờ
' =ConvertUnixTimestamp(1609459200, FALSE) ' Định dạng 24 giờ

Xử lý các trường hợp biên

Khi làm việc với các dấu thời gian Unix, điều quan trọng là phải xử lý các trường hợp biên một cách chính xác. Dưới đây là ví dụ về việc xử lý một số trường hợp biên phổ biến:

// JavaScript xử lý trường hợp biên
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Kiểm tra xem dấu thời gian có hợp lệ không
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Dấu thời gian không hợp lệ";
  }
  
  // Kiểm tra dấu thời gian âm (các ngày trước 1970)
  if (timestamp < 0) {
    // Một số trình duyệt có thể không xử lý đúng các dấu thời gian âm
    // Sử dụng cách tiếp cận mạnh mẽ hơn cho các ngày trước 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Ngày không hợp lệ (trước 1970)";
    }
  }
  
  // Kiểm tra vấn đề Y2K38 (đối với các hệ thống 32 bit)
  const maxInt32 = 2147483647; // Giá trị tối đa cho số nguyên có dấu 32 bit
  if (timestamp > maxInt32) {
    // Xem xét việc sử dụng BigInt cho các dấu thời gian rất lớn trong JavaScript hiện đại
    console.warn("Dấu thời gian vượt quá giới hạn số nguyên 32 bit (vấn đề Y2K38)");
  }
  
  // Tiến hành chuyển đổi bình thường
  try {
    const date = new Date(timestamp * 1000);
    const options = {
      year: 'numeric',
      month: 'long',
      day: 'numeric',
      weekday: 'long',
      hour: use12Hour ? 'numeric' : '2-digit',
      minute: '2-digit',
      second: '2-digit',
      hour12: use12Hour
    };
    return date.toLocaleString(undefined, options);
  } catch (error) {
    return "Lỗi khi chuyển đổi dấu thời gian: " + error.message;
  }
}

Tài liệu tham khảo

  1. "Thời gian Unix." Wikipedia, Quỹ Wikimedia, https://vi.wikipedia.org/wiki/Unix_time

  2. "Vấn đề năm 2038." Wikipedia, Quỹ Wikimedia, https://vi.wikipedia.org/wiki/V%C3%A0n_%C4%91%E1%BB%81_n%C4%83m_2038

  3. 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

  4. "ISO 8601." Wikipedia, Quỹ Wikimedia, https://vi.wikipedia.org/wiki/ISO_8601

  5. "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

  6. Kernighan, Brian W., và Dennis M. Ritchie. "Ngôn ngữ lập trình C." Prentice Hall, 1988.

Feedback