Whiz Tools

Unix vremenski pečat

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

Pretvoreni datum i vreme

Konverter Unix vremenskih oznaka

Uvod

Unix vremenska oznaka (poznata i kao POSIX vreme ili Epoch vreme) je sistem za opisivanje tačke u vremenu. To je broj sekundi koje su prošle od 1. januara 1970. (ponoć UTC/GMT), ne računajući prestupne sekunde. Unix vremenske oznake se široko koriste u računarstvu i programskim jezicima jer pružaju kompaktan, jezikom nezavistan prikaz određenog trenutka u vremenu.

Ovaj konverter vam omogućava da transformišete Unix vremensku oznaku u ljudski čitljiv format datuma i vremena. Podržava kako 12-časovni (AM/PM) tako i 24-časovni format vremena kako bi se prilagodili različitim regionalnim i ličnim preferencama.

Kako funkcionišu Unix vremenske oznake

Unix vremenske oznake se računaju kao broj sekundi od Unix epohe (1. januar 1970, 00:00:00 UTC). Ovo ih čini posebno korisnim za izračunavanje vremenskih razlika i za skladištenje datuma u kompaktom formatu.

Matematička konverzija iz Unix vremenske oznake u kalendarski datum uključuje nekoliko koraka:

  1. Počnite sa Unix epohom (1. januar 1970, 00:00:00 UTC)
  2. Dodajte broj sekundi u vremenskoj oznaci
  3. Uzmite u obzir prestupne godine, varijabilne dužine meseci i druge kalendarske složenosti
  4. Primijenite prilagođavanja vremenskoj zoni ako je potrebno

Na primer, Unix vremenska oznaka 1609459200 predstavlja petak, 1. januar 2021, 00:00:00 UTC.

Formula za konverziju može se izraziti kao:

Datum=Unix epoha+Vremenska oznaka (u sekundama)\text{Datum} = \text{Unix epoha} + \text{Vremenska oznaka (u sekundama)}

Većina programskih jezika i operativnih sistema pruža ugrađene funkcije za rukovanje ovom konverzijom, apstrahujući složene kalendarske proračune.

Opcije formata vremena

Ovaj konverter nudi dve opcije formata vremena:

  1. 24-časovni format (ponekad nazvan "vojni vreme"): Sati se kreću od 0 do 23, i nema AM/PM oznake. Na primer, 3:00 PM se prikazuje kao 15:00.

  2. 12-časovni format: Sati se kreću od 1 do 12, sa AM (ante meridiem) za vreme od ponoći do podneva, i PM (post meridiem) za vreme od podneva do ponoći. Na primer, 15:00 u 24-časovnom formatu se prikazuje kao 3:00 PM.

Izbor između ovih formata je uglavnom pitanje regionalne konvencije i ličnih preferencija:

  • 24-časovni format se obično koristi u većini Evrope, Latinske Amerike i Azije, kao i u naučnim, vojnim i medicinskim kontekstima širom sveta.
  • 12-časovni format je prisutan u Sjedinjenim Američkim Državama, Kanadi, Australiji i nekim drugim englesko govornim zemljama za svakodnevnu upotrebu.

Izdvojeni slučajevi i ograničenja

Kada radite sa Unix vremenskim oznakama, važno je biti svestan nekoliko izdvojenih slučajeva i ograničenja:

  1. Negativne vremenske oznake: Ove predstavljaju datume pre Unix epohe (1. januar 1970). Iako su matematički validne, neki sistemi možda neće pravilno obraditi negativne vremenske oznake.

  2. Problem godine 2038: Unix vremenske oznake se često čuvaju kao 32-bitni potpisani celobrojni tipovi, koji će preplaviti 19. januara 2038. Nakon ovog datuma, 32-bitni sistemi neće moći pravilno predstavljati vremena osim ako se ne modifikuju da koriste veći celobrojni tip.

  3. Ekstremno velike vremenske oznake: Veoma daleki budući datumi možda neće biti reprezentabilni u nekim sistemima, ili će se možda obraditi nekonzistentno.

  4. Prestupne sekunde: Unix vreme ne uzima u obzir prestupne sekunde, koje se povremeno dodaju UTC-u da bi se nadoknadila nepravilna rotacija Zemlje. To znači da Unix vreme nije precizno usklađeno sa astronomskim vremenom.

  5. Razmatranja vremenskih zona: Unix vremenske oznake predstavljaju trenutke u UTC-u. Konvertovanje u lokalno vreme zahteva dodatne informacije o vremenskoj zoni.

  6. Letnje računanje vremena: Kada se vremenske oznake konvertuju u lokalno vreme, moraju se uzeti u obzir složenosti prelaza na letnje računanje vremena.

Upotrebe

Unix vremenske oznake se koriste u brojnim aplikacijama širom računarstva i upravljanja podacima:

  1. Baze podataka: Vremenske oznake se obično koriste za beleženje kada su unosi kreirani ili izmenjeni.

  2. Web razvoj: HTTP zaglavlja, kolačići i mehanizmi keširanja često koriste Unix vremenske oznake.

  3. Log datoteke: Sistemski logovi obično beleže događaje sa Unix vremenskim oznakama radi preciznog hronološkog redosleda.

  4. Sistemi za kontrolu verzija: Git i drugi VCS koriste vremenske oznake za beleženje kada su izvršene promene.

  5. API odgovori: Mnogi web API-ji uključuju vremenske oznake u svojim odgovorima kako bi naznačili kada su podaci generisani ili kada su resursi poslednji put izmenjeni.

  6. Datotečni sistemi: Vremena kreiranja i izmene datoteka se često čuvaju kao Unix vremenske oznake.

  7. Upravljanje sesijama: Web aplikacije koriste vremenske oznake da odrede kada bi korisničke sesije trebalo da isteknu.

  8. Analiza podataka: Vremenske oznake pružaju standardizovani način za rad sa vremenskim podacima u analitičkim aplikacijama.

Alternativne opcije

Iako su Unix vremenske oznake široko korišćene, postoje alternativni formati vremenskog predstavljanja koji mogu biti prikladniji u određenim kontekstima:

  1. ISO 8601: Standardizovani string format (npr., "2021-01-01T00:00:00Z") koji je ljudski čitljiv dok zadržava mogućnost sortiranja. Često se preferira za razmenu podataka i aplikacije usmerene na korisnike.

  2. RFC 3339: Profil ISO 8601 koji se koristi u internet protokolima, sa strožim zahtevima za formatiranje.

  3. Ljudski čitljivi formati: Lokalizovani datumski stringovi (npr., "1. januar 2021") su prikladniji za direktnu interakciju sa korisnicima, ali su manje pogodni za računanje.

  4. Microsoft FILETIME: 64-bitna vrednost koja predstavlja broj intervala od 100 nanosekundi od 1. januara 1601, koja se koristi u Windows sistemima.

  5. Julijanski dan: Koristi se u astronomiji i nekim naučnim aplikacijama, brojeći dane od 1. januara 4713. pre nove ere.

Izbor formata vremena zavisi od faktora kao što su:

  • Potrebna preciznost
  • Potrebe za ljudskom čitljivošću
  • Ograničenja skladištenja
  • Kompatibilnost sa postojećim sistemima
  • Opseg datuma koji treba da bude predstavljen

Istorija

Koncept Unix vremena potiče od razvoja Unix operativnog sistema u Bell Labs-u krajem 1960-ih i početkom 1970-ih. Odluka da se 1. januar 1970. uzme kao epoha bila je donekle arbitrarna, ali praktična za to vreme—bila je dovoljno blizu da minimizira zahteve za skladištenjem datuma od interesa, ali dovoljno daleko u prošlosti da bude korisna za istorijske podatke.

Originalna implementacija koristila je 32-bitni potpisani celobrojni tip za skladištenje broja sekundi, što je bilo adekvatno za očekivani vek Unix sistema u to vreme. Međutim, ova odluka dovela je do problema godine 2038 (ponekad nazvanog "Y2K38" ili "Unix Millennium Bug"), jer 32-bitni potpisani celobrojni tipovi mogu predstavljati datume samo do 19. januara 2038. (03:14:07 UTC).

Kako su Unix i Unix-slični operativni sistemi stekli popularnost, Unix vremenska oznaka postala je de facto standard za predstavljanje vremena u računarstvu. Usvojili su je brojni programski jezici, baze podataka i aplikacije, proširujući se daleko izvan svog originalnog Unix okruženja.

Moderni sistemi sve više koriste 64-bitne celobrojne tipove za vremenske oznake, što produžava reprezentativni opseg na približno 292 milijarde godina u obe strane od epohe, efikasno rešavajući problem godine 2038. Međutim, nasleđeni sistemi i aplikacije mogu biti ranjivi.

Jednostavnost i korisnost Unix vremenske oznake osigurale su njenu kontinuiranu relevantnost uprkos razvoju sofisticiranijih formata vremenskog predstavljanja. Ona ostaje fundamentalni koncept u računarstvu, koji je osnova naše digitalne infrastrukture.

Primeri koda

Evo primera kako konvertovati Unix vremenske oznake u ljudski čitljive datume u različitim programskim jezicima:

// JavaScript konverzija vremenskih oznaka
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Kreirajte novi Date objekat (JavaScript koristi milisekunde)
  const date = new Date(timestamp * 1000);
  
  // Opcije formatiranja
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Konvertujte u string koristeći lokalno formatiranje
  return date.toLocaleString(undefined, options);
}

// Primer korišćenja
const timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24-časovni format
console.log(convertUnixTimestamp(timestamp, true));  // 12-časovni format
# Python konverzija vremenskih oznaka
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Konvertujte Unix vremensku oznaku u datetime objekat
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Formatirajte string datuma
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # 12-časovni format sa AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # 24-časovni format
    
    return date.strftime(format_string)

# Primer korišćenja
timestamp = 1609459200  # 1. januar 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # 24-časovni format
print(convert_unix_timestamp(timestamp, True))   # 12-časovni format
<?php
// PHP konverzija vremenskih oznaka
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Format string
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // 12-časovni format sa AM/PM
        : 'l, F j, Y H:i:s';   // 24-časovni format
    
    // Konvertujte i formatirajte datum
    return date($formatString, $timestamp);
}

// Primer korišćenja
$timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // 24-časovni format
echo convertUnixTimestamp($timestamp, true) . "\n";  // 12-časovni format
?>
// Java konverzija vremenskih oznaka
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) {
        // Konvertujte Unix vremensku oznaku u Instant, zatim u LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Kreirajte formatirac na osnovu željenog formata
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Formatirajte datum
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // 24-časovni format
        System.out.println(convertUnixTimestamp(timestamp, true));  // 12-časovni format
    }
}
// C# konverzija vremenskih oznaka
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Konvertujte Unix vremensku oznaku u DateTime
        // Unix vremenska oznaka je sekunde od 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Format string na osnovu 12-časovnog ili 24-časovnog izbora
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // 12-časovni format sa AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // 24-časovni format
        
        // Vratite formatirani string datuma
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // 24-časovni format
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // 12-časovni format
    }
}
# Ruby konverzija vremenskih oznaka
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Konvertujte Unix vremensku oznaku u Time objekat
  time = Time.at(timestamp)
  
  # Formatirajte na osnovu 12-časovnog ili 24-časovnog izbora
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # 12-časovni format sa AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # 24-časovni format
  end
end

# Primer korišćenja
timestamp = 1609459200  # 1. januar 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # 24-časovni format
puts convert_unix_timestamp(timestamp, true)   # 12-časovni format
// Go konverzija vremenskih oznaka
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Konvertujte Unix vremensku oznaku u vreme
    t := time.Unix(timestamp, 0)
    
    // Format string na osnovu 12-časovnog ili 24-časovnog izbora
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // 12-časovni format sa AM/PM
    } else {
        formatString += "15:04:05"    // 24-časovni format
    }
    
    // Vratite formatirano vreme
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1. januar 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // 24-časovni format
    fmt.Println(convertUnixTimestamp(timestamp, true))  // 12-časovni format
}
// Swift konverzija vremenskih oznaka
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Kreirajte Date iz Unix vremenske oznake
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Kreirajte DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Postavite stil vremena na osnovu 12-časovnog ili 24-časovnog izbora
    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")
    }
    
    // Vratite formatirani datum
    return formatter.string(from: date)
}

// Primer korišćenja
let timestamp = 1609459200 // 1. januar 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // 24-časovni format
print(convertUnixTimestamp(timestamp, use12Hour: true))  // 12-časovni format
# R konverzija vremenskih oznaka
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Konvertujte Unix vremensku oznaku u POSIXct datetime
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Formatirajte na osnovu 12-časovnog ili 24-časovnog izbora
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # 12-časovni format sa AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # 24-časovni format
  }
  
  # Vratite formatirani string datuma
  format(date_time, format_string)
}

# Primer korišćenja
timestamp <- 1609459200  # 1. januar 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # 24-časovni format
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # 12-časovni format
% MATLAB konverzija vremenskih oznaka
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Konvertujte Unix vremensku oznaku u MATLAB datetime
    % MATLAB datumi su dani od 1900-01-01, gde je 1 = 1900-01-01
    % Unix vremenske oznake su sekunde od 1970-01-01
    
    % Prvo konvertujte u Excel format datuma
    % 25569 je broj dana između 1900-01-01 i 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Formatirajte datum na osnovu 12-časovnog ili 24-časovnog izbora
    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

% Primer korišćenja
timestamp = 1609459200;  % 1. januar 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % 24-časovni format
disp(convertUnixTimestamp(timestamp, true))   % 12-časovni format
' Excel VBA konverzija vremenskih oznaka
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Konvertujte Unix vremensku oznaku u Excel datum/vreme
    ' Excel datumi su dani od 1900-01-01, gde je 1 = 1900-01-01
    ' Unix vremenske oznake su sekunde od 1970-01-01
    
    ' Prvo konvertujte u Excel format datuma
    ' 25569 je broj dana između 1900-01-01 i 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Formatirajte datum na osnovu 12-časovnog ili 24-časovnog izbora
    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

' Korišćenje u radnom listu:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' 12-časovni format
' =ConvertUnixTimestamp(1609459200, FALSE) ' 24-časovni format

Rukovanje izdvojenim slučajevima

Kada radite sa Unix vremenskim oznakama, važno je pravilno obraditi izdvojene slučajeve. Evo primera kako obraditi neke uobičajene izdvojene slučajeve:

// JavaScript rukovanje izdvojenim slučajevima
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Proverite da li je vremenska oznaka validna
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Nevalidna vremenska oznaka";
  }
  
  // Proverite negativne vremenske oznake (datumi pre 1970)
  if (timestamp < 0) {
    // Neki pregledači možda neće pravilno obraditi negativne vremenske oznake
    // Koristite robusniji pristup za datume pre 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Nevalidan datum (pre 1970)";
    }
  }
  
  // Proverite problem Y2K38 (za 32-bitne sisteme)
  const maxInt32 = 2147483647; // Maksimalna vrednost za 32-bitni potpisani celobrojni tip
  if (timestamp > maxInt32) {
    // Razmotrite korišćenje BigInt za veoma velike vremenske oznake u modernom JavaScript-u
    console.warn("Vremenska oznaka premašuje limit 32-bitnog celobroja (Y2K38 problem)");
  }
  
  // Nastavite sa normalnom konverzijom
  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 "Greška prilikom konvertovanja vremenske oznake: " + error.message;
  }
}

Reference

  1. "Unix vreme." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Unix_time

  2. "Problem godine 2038." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Year_2038_problem

  3. Olson, Arthur David. "Složenosti kalendarskog vremena." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf

  4. "ISO 8601." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/ISO_8601

  5. "RFC 3339: Datum i vreme na internetu: Vremenske oznake." Internet Engineering Task Force (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., i Dennis M. Ritchie. "C programski jezik." Prentice Hall, 1988.

Feedback