Whiz Tools

Konwerter znacznika czasu Unix

El timestamp Unix és el nombre de segons des de l'1 de gener de 1970 (UTC)

Przekonwertowana data i czas

Konwerter znaczników czasu Unix

Wprowadzenie

Znacznik czasu Unix (znany również jako czas POSIX lub czas Epoki) to system opisywania punktu w czasie. Jest to liczba sekund, która upłynęła od 1 stycznia 1970 roku (północ UTC/GMT), nie licząc sekund przestępnych. Znaczniki czasu Unix są powszechnie używane w systemach komputerowych i językach programowania, ponieważ zapewniają kompaktową, niezależną od języka reprezentację konkretnego momentu w czasie.

Ten konwerter pozwala na przekształcenie znacznika czasu Unix na datę i czas w formacie czytelnym dla ludzi. Obsługuje zarówno format czasu 12-godzinny (AM/PM), jak i 24-godzinny, aby dostosować się do różnych regionalnych i osobistych preferencji.

Jak działają znaczniki czasu Unix

Znaczniki czasu Unix są obliczane jako liczba sekund od Epoki Unix (1 stycznia 1970 roku, 00:00:00 UTC). Czyni to je szczególnie użytecznymi do obliczania różnic czasowych i do przechowywania dat w kompaktowym formacie.

Matematyczna konwersja ze znacznika czasu Unix na datę kalendarzową obejmuje kilka kroków:

  1. Rozpocznij od Epoki Unix (1 stycznia 1970 roku, 00:00:00 UTC)
  2. Dodaj liczbę sekund w znaczniku czasu
  3. Uwzględnij lata przestępne, różne długości miesięcy i inne złożoności kalendarza
  4. Zastosuj korekty strefy czasowej, jeśli to konieczne

Na przykład znacznik czasu Unix 1609459200 reprezentuje piątek, 1 stycznia 2021 roku, 00:00:00 UTC.

Formuła konwersji może być wyrażona jako:

Data=Epoka Unix+Znacznik czasu (w sekundach)\text{Data} = \text{Epoka Unix} + \text{Znacznik czasu (w sekundach)}

Większość języków programowania i systemów operacyjnych zapewnia wbudowane funkcje do obsługi tej konwersji, abstrahując złożone obliczenia kalendarzowe.

Opcje formatu czasu

Ten konwerter oferuje dwie opcje formatu czasu:

  1. Format 24-godzinny (czasami nazywany "czasem wojskowym"): Godziny wahają się od 0 do 23, a oznaczenie AM/PM nie występuje. Na przykład, 15:00 w formacie 24-godzinnym to 3:00 PM.

  2. Format 12-godzinny: Godziny wahają się od 1 do 12, z AM (ante meridiem) dla czasów od północy do południa i PM (post meridiem) dla czasów od południa do północy. Na przykład, 15:00 w formacie 24-godzinnym to 3:00 PM.

Wybór między tymi formatami jest w dużej mierze kwestią konwencji regionalnych i osobistych preferencji:

  • Format 24-godzinny jest powszechnie używany w większości Europy, Ameryki Łacińskiej i Azji, a także w kontekstach naukowych, wojskowych i medycznych na całym świecie.
  • Format 12-godzinny jest powszechny w Stanach Zjednoczonych, Kanadzie, Australii i niektórych innych krajach anglojęzycznych w codziennym użyciu.

Przypadki brzegowe i ograniczenia

Pracując ze znacznikami czasu Unix, ważne jest, aby być świadomym kilku przypadków brzegowych i ograniczeń:

  1. Ujemne znaczniki czasu: Reprezentują daty przed Epoką Unix (1 stycznia 1970 roku). Chociaż matematycznie są poprawne, niektóre systemy mogą nie obsługiwać ujemnych znaczników czasu poprawnie.

  2. Problem roku 2038: Znaczniki czasu Unix są często przechowywane jako 32-bitowe liczby całkowite ze znakiem, które przepełnią się 19 stycznia 2038 roku. Po tym punkcie systemy 32-bitowe nie będą w stanie poprawnie reprezentować czasów, chyba że zostaną zmodyfikowane do używania większego typu całkowitego.

  3. Ekstremalnie duże znaczniki czasu: Bardzo odległe daty mogą być nieprzedstawialne w niektórych systemach lub mogą być obsługiwane niespójnie.

  4. Sekundy przestępne: Czas Unix nie uwzględnia sekund przestępnych, które są czasami dodawane do UTC, aby skompensować nieregularny ruch Ziemi. Oznacza to, że czas Unix nie jest precyzyjnie zsynchronizowany z czasem astronomicznym.

  5. Rozważania dotyczące stref czasowych: Znaczniki czasu Unix reprezentują momenty w UTC. Konwersja na czas lokalny wymaga dodatkowych informacji o strefie czasowej.

  6. Czas letni: Przy konwersji znaczników czasu na czas lokalny należy uwzględnić złożoności związane z przejściami na czas letni.

Zastosowania

Znaczniki czasu Unix są używane w licznych aplikacjach w zakresie informatyki i zarządzania danymi:

  1. Rekordy baz danych: Znaczniki czasu są powszechnie używane do rejestrowania, kiedy wpisy zostały utworzone lub zmodyfikowane.

  2. Rozwój stron internetowych: Nagłówki HTTP, pliki cookie i mechanizmy pamięci podręcznej często używają znaczników czasu Unix.

  3. Pliki dzienników: Dzienniki systemowe zazwyczaj rejestrują zdarzenia z znacznikami czasu Unix w celu precyzyjnego uporządkowania chronologicznego.

  4. Systemy kontroli wersji: Git i inne systemy VCS używają znaczników czasu do rejestrowania, kiedy dokonano commitów.

  5. Odpowiedzi API: Wiele interfejsów API zawiera znaczniki czasu w swoich odpowiedziach, aby wskazać, kiedy dane zostały wygenerowane lub kiedy zasoby zostały ostatnio zmodyfikowane.

  6. Systemy plików: Czas utworzenia i modyfikacji plików jest często przechowywany jako znaczniki czasu Unix.

  7. Zarządzanie sesjami: Aplikacje internetowe używają znaczników czasu do określenia, kiedy sesje użytkowników powinny wygasnąć.

  8. Analiza danych: Znaczniki czasu zapewniają ustandaryzowany sposób pracy z danymi czasowymi w aplikacjach analitycznych.

Alternatywy

Chociaż znaczniki czasu Unix są powszechnie używane, istnieją alternatywne formaty reprezentacji czasu, które mogą być bardziej odpowiednie w niektórych kontekstach:

  1. ISO 8601: Ustandaryzowany format ciągu (np. "2021-01-01T00:00:00Z"), który jest czytelny dla ludzi, jednocześnie zachowując możliwość sortowania. Często preferowany do wymiany danych i aplikacji skierowanych do użytkowników.

  2. RFC 3339: Profil ISO 8601 używany w protokołach internetowych, z surowszymi wymaganiami dotyczącymi formatowania.

  3. Formaty czytelne dla ludzi: Zlokalizowane ciągi dat (np. "1 stycznia 2021") są bardziej odpowiednie do bezpośredniej interakcji z użytkownikami, ale są mniej odpowiednie do obliczeń.

  4. Microsoft FILETIME: 64-bitowa wartość reprezentująca liczbę interwałów 100-nanosekundowych od 1 stycznia 1601 roku, używana w systemach Windows.

  5. Numer dnia juliańskiego: Używany w astronomii i niektórych zastosowaniach naukowych, liczący dni od 1 stycznia 4713 roku p.n.e.

Wybór formatu czasu zależy od takich czynników jak:

  • Wymagana precyzja
  • Potrzeby dotyczące czytelności dla ludzi
  • Ograniczenia przechowywania
  • Zgodność z istniejącymi systemami
  • Zakres dat, które muszą być reprezentowane

Historia

Koncepcja czasu Unix powstała wraz z rozwojem systemu operacyjnego Unix w laboratoriach Bell w późnych latach 60. i wczesnych 70. XX wieku. Decyzja o użyciu 1 stycznia 1970 roku jako epoki była w pewnym sensie arbitralna, ale praktyczna w tamtym czasie — była wystarczająco bliska, aby zminimalizować wymagania dotyczące przechowywania dat istotnych, ale wystarczająco daleka w przeszłości, aby być użyteczną dla danych historycznych.

Oryginalna implementacja używała 32-bitowej liczby całkowitej ze znakiem do przechowywania liczby sekund, co było wystarczające dla oczekiwanej długości życia systemów Unix w tamtym czasie. Jednak ta decyzja doprowadziła do problemu roku 2038 (czasami nazywanego "Y2K38" lub "Unix Millennium Bug"), ponieważ 32-bitowe liczby całkowite ze znakiem mogą reprezentować tylko daty do 19 stycznia 2038 roku (03:14:07 UTC).

W miarę jak Unix i systemy podobne do Unixa zyskiwały na popularności, znacznik czasu Unix stał się de facto standardem reprezentacji czasu w informatyce. Został przyjęty przez liczne języki programowania, bazy danych i aplikacje, wykraczając daleko poza swoje pierwotne środowisko Unix.

Nowoczesne systemy coraz częściej używają 64-bitowych liczb całkowitych do znaczników czasu, co wydłuża reprezentowalny zakres do około 292 miliardów lat w obu kierunkach od epoki, skutecznie rozwiązując problem roku 2038. Jednak starsze systemy i aplikacje mogą nadal być narażone.

Prostota i użyteczność znacznika czasu Unix zapewniły jego ciągłą aktualność, pomimo rozwoju bardziej zaawansowanych formatów reprezentacji czasu. Pozostaje on fundamentalną koncepcją w informatyce, stanowiąc podstawę naszej cyfrowej infrastruktury.

Przykłady kodu

Oto przykłady konwersji znaczników czasu Unix na daty czytelne dla ludzi w różnych językach programowania:

// Konwersja znaczników czasu w JavaScript
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Utwórz nowy obiekt Date (JavaScript używa milisekund)
  const date = new Date(timestamp * 1000);
  
  // Opcje formatowania
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Konwertuj na ciąg za pomocą formatowania lokalnego
  return date.toLocaleString(undefined, options);
}

// Przykład użycia
const timestamp = 1609459200; // 1 stycznia 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // Format 24-godzinny
console.log(convertUnixTimestamp(timestamp, true));  // Format 12-godzinny
# Konwersja znaczników czasu w Pythonie
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Konwertuj znacznik czasu Unix na obiekt datetime
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Format ciągu daty
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # Format 12-godzinny z AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # Format 24-godzinny
    
    return date.strftime(format_string)

# Przykład użycia
timestamp = 1609459200  # 1 stycznia 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # Format 24-godzinny
print(convert_unix_timestamp(timestamp, True))   # Format 12-godzinny
<?php
// Konwersja znaczników czasu w PHP
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Format ciągu
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // Format 12-godzinny z AM/PM
        : 'l, F j, Y H:i:s';   // Format 24-godzinny
    
    // Konwertuj i formatuj datę
    return date($formatString, $timestamp);
}

// Przykład użycia
$timestamp = 1609459200; // 1 stycznia 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // Format 24-godzinny
echo convertUnixTimestamp($timestamp, true) . "\n";  // Format 12-godzinny
?>
// Konwersja znaczników czasu w Javie
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) {
        // Konwertuj znacznik czasu Unix na Instant, a następnie na LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Utwórz formatowanie na podstawie żądanego formatu
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Formatuj datę
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 1 stycznia 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // Format 24-godzinny
        System.out.println(convertUnixTimestamp(timestamp, true));  // Format 12-godzinny
    }
}
// Konwersja znaczników czasu w C#
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Konwertuj znacznik czasu Unix na DateTime
        // Znaczniki czasu Unix to sekundy od 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Format ciągu na podstawie preferencji 12-godzinnej lub 24-godzinnej
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // Format 12-godzinny z AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // Format 24-godzinny
        
        // Zwróć sformatowany ciąg daty
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1 stycznia 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // Format 24-godzinny
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // Format 12-godzinny
    }
}
# Konwersja znaczników czasu w Rubym
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Konwertuj znacznik czasu Unix na obiekt Time
  time = Time.at(timestamp)
  
  # Format na podstawie preferencji 12-godzinnej lub 24-godzinnej
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # Format 12-godzinny z AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # Format 24-godzinny
  end
end

# Przykład użycia
timestamp = 1609459200  # 1 stycznia 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # Format 24-godzinny
puts convert_unix_timestamp(timestamp, true)   # Format 12-godzinny
// Konwersja znaczników czasu w Go
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Konwertuj znacznik czasu Unix na Time
    t := time.Unix(timestamp, 0)
    
    // Format ciągu na podstawie preferencji 12-godzinnej lub 24-godzinnej
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // Format 12-godzinny z AM/PM
    } else {
        formatString += "15:04:05"    // Format 24-godzinny
    }
    
    // Zwróć sformatowany czas
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1 stycznia 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // Format 24-godzinny
    fmt.Println(convertUnixTimestamp(timestamp, true))  // Format 12-godzinny
}
// Konwersja znaczników czasu w Swift
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Utwórz Date z znacznika czasu Unix
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Utwórz DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Ustaw styl czasu na podstawie preferencji 12-godzinnej lub 24-godzinnej
    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")
    }
    
    // Zwróć sformatowaną datę
    return formatter.string(from: date)
}

// Przykład użycia
let timestamp = 1609459200 // 1 stycznia 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // Format 24-godzinny
print(convertUnixTimestamp(timestamp, use12Hour: true))  // Format 12-godzinny
# Konwersja znaczników czasu w R
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Konwertuj znacznik czasu Unix na datetime POSIXct
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Format na podstawie preferencji 12-godzinnej lub 24-godzinnej
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # Format 12-godzinny z AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # Format 24-godzinny
  }
  
  # Zwróć sformatowany ciąg daty
  format(date_time, format_string)
}

# Przykład użycia
timestamp <- 1609459200  # 1 stycznia 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # Format 24-godzinny
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # Format 12-godzinny
% Konwersja znaczników czasu w MATLAB
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Konwertuj znacznik czasu Unix na datę/godzinę MATLAB
    % Daty MATLAB to dni od 1900-01-01, z 1 = 1900-01-01
    % Znaczniki czasu Unix to sekundy od 1970-01-01
    
    % Najpierw konwertuj na format daty MATLAB
    % 25569 to liczba dni między 1900-01-01 a 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Format na podstawie preferencji 12-godzinnej lub 24-godzinnej
    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

% Przykład użycia
timestamp = 1609459200;  % 1 stycznia 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % Format 24-godzinny
disp(convertUnixTimestamp(timestamp, true))   % Format 12-godzinny
' Konwersja znaczników czasu w Excel VBA
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Konwertuj znacznik czasu Unix na datę/czas w Excelu
    ' Daty Excel to dni od 1900-01-01, z 1 = 1900-01-01
    ' Znaczniki czasu Unix to sekundy od 1970-01-01
    
    ' Najpierw konwertuj na format daty Excel
    ' 25569 to liczba dni między 1900-01-01 a 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Format ciągu na podstawie preferencji 12-godzinnej lub 24-godzinnej
    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

' Użycie w arkuszu kalkulacyjnym:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' Format 12-godzinny
' =ConvertUnixTimestamp(1609459200, FALSE) ' Format 24-godzinny

Obsługa przypadków brzegowych

Pracując ze znacznikami czasu Unix, ważne jest, aby poprawnie obsługiwać przypadki brzegowe. Oto przykłady obsługi niektórych powszechnych przypadków brzegowych:

// Obsługa przypadków brzegowych w JavaScript
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Sprawdź, czy znacznik czasu jest ważny
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Nieprawidłowy znacznik czasu";
  }
  
  // Sprawdź ujemne znaczniki czasu (daty przed 1970)
  if (timestamp < 0) {
    // Niektóre przeglądarki mogą nie obsługiwać ujemnych znaczników czasu poprawnie
    // Użyj bardziej solidnego podejścia dla dat przed 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Nieprawidłowa data (przed 1970)";
    }
  }
  
  // Sprawdź problem Y2K38 (dla systemów 32-bitowych)
  const maxInt32 = 2147483647; // Maksymalna wartość dla 32-bitowej liczby całkowitej ze znakiem
  if (timestamp > maxInt32) {
    // Rozważ użycie BigInt dla bardzo dużych znaczników czasu w nowoczesnym JavaScript
    console.warn("Znacznik czasu przekracza limit 32-bitowej liczby całkowitej (problem Y2K38)");
  }
  
  // Kontynuuj normalną konwersję
  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 "Błąd konwersji znacznika czasu: " + error.message;
  }
}

Źródła

  1. "Czas Unix." Wikipedia, Fundacja Wikimedia, https://pl.wikipedia.org/wiki/Czas_Unix

  2. "Problem roku 2038." Wikipedia, Fundacja Wikimedia, https://pl.wikipedia.org/wiki/Problem_roku_2038

  3. Olson, Arthur David. "Złożoności czasów kalendarzowych." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf

  4. "ISO 8601." Wikipedia, Fundacja Wikimedia, https://pl.wikipedia.org/wiki/ISO_8601

  5. "RFC 3339: Data i czas w Internecie: Znaczniki czasowe." Internet Engineering Task Force (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., i Dennis M. Ritchie. "Język programowania C." Prentice Hall, 1988.

Feedback