Whiz Tools

Unix laiko žymės konverteris

ইউনিক্স টাইমস্ট্যাম্প হল 1 জানুয়ারী, 1970 (UTC) থেকে পেরিয়ে যাওয়া সেকেন্ডের সংখ্যা

Konvertuota data ir laikas

Unix laiko žymės konverteris

Įvadas

Unix laiko žymė (dar žinoma kaip POSIX laikas arba Epoch laikas) yra sistema, skirta apibūdinti tam tikrą laiko momentą. Tai yra sekundžių skaičius, kuris praėjo nuo 1970 m. sausio 1 d. (vidurnaktis UTC/GMT), neįskaitant šuolio sekundžių. Unix laiko žymės plačiai naudojamos kompiuterių sistemose ir programavimo kalbose, nes jos suteikia kompaktišką, kalbos nepriklausomą tam tikro momento laiko atvaizdavimą.

Šis konverteris leidžia jums paversti Unix laiko žymę į žmogaus skaitomą datą ir laiką. Jis palaiko tiek 12 valandų (AM/PM), tiek 24 valandų laiką, kad atitiktų skirtingus regioninius ir asmeninius pageidavimus.

Kaip veikia Unix laiko žymės

Unix laiko žymės skaičiuojamos kaip sekundžių skaičius nuo Unix Epoch (1970 m. sausio 1 d., 00:00:00 UTC). Tai daro jas ypač naudingas skaičiuojant laiko skirtumus ir saugant datas kompaktišku formatu.

Matematinis konvertavimas iš Unix laiko žymės į kalendoriaus datą apima kelis etapus:

  1. Pradėkite nuo Unix Epoch (1970 m. sausio 1 d., 00:00:00 UTC)
  2. Pridėkite laiko žymės sekundžių skaičių
  3. Atsižvelkite į šuolio metus, skirtingus mėnesių ilgius ir kitas kalendoriaus sudėtingas problemas
  4. Jei reikia, taikykite laiko zonos koregavimus

Pavyzdžiui, Unix laiko žymė 1609459200 atitinka penktadienį, 2021 m. sausio 1 d., 00:00:00 UTC.

Konversijos formulė gali būti išreikšta taip:

Data=Unix Epoch+Laiko zˇyme˙ (sekunde˙mis)\text{Data} = \text{Unix Epoch} + \text{Laiko žymė (sekundėmis)}

Dauguma programavimo kalbų ir operacinių sistemų teikia įmontuotas funkcijas, kad apdorotų šią konversiją, paslėpdamos sudėtingus kalendoriaus skaičiavimus.

Laiko formato parinktys

Šis konverteris siūlo dvi laiko formato parinktis:

  1. 24 valandų formatas (kartais vadinamas "kariniu laiku"): Valandos svyruoja nuo 0 iki 23, ir nėra AM/PM žymėjimo. Pavyzdžiui, 15:00 yra atvaizduojama kaip 15:00.

  2. 12 valandų formatas: Valandos svyruoja nuo 1 iki 12, su AM (ante meridiem) laikui nuo vidurnakčio iki vidurdienio, ir PM (post meridiem) laikui nuo vidurdienio iki vidurnakčio. Pavyzdžiui, 15:00 24 valandų formatu yra atvaizduojama kaip 3:00 PM.

Pasirinkimas tarp šių formatų daugiausia priklauso nuo regioninės konvencijos ir asmeninio pageidavimo:

  • 24 valandų formatas dažniausiai naudojamas daugumoje Europos, Lotynų Amerikos ir Azijos šalių, taip pat mokslo, kariuomenės ir medicinos kontekstuose visame pasaulyje.
  • 12 valandų formatas yra paplitęs JAV, Kanadoje, Australijoje ir kai kuriose kitose anglakalbėse šalyse kasdieniame naudojime.

Kraštutiniai atvejai ir apribojimai

Dirbant su Unix laiko žymėmis, svarbu būti informuotam apie kelis kraštutinius atvejus ir apribojimus:

  1. Neigiamos laiko žymės: Jos atspindi datas prieš Unix Epoch (1970 m. sausio 1 d.). Nors matematiškai tai yra galiojantis, kai kurios sistemos gali neteisingai apdoroti neigiamas laiko žymes.

  2. 2038 m. problema: Unix laiko žymės dažnai saugomos kaip 32 bitų pasirašyti sveikieji skaičiai, kurie perpildys 2038 m. sausio 19 d. Po šio taško 32 bitų sistemos negalės teisingai atvaizduoti laikų, nebent bus pakeistos, kad naudotų didesnį sveikąjį tipą.

  3. Labai didelės laiko žymės: Labai tolimos ateities datos gali būti nesugebamos atvaizduoti kai kuriose sistemose arba gali būti apdorojamos nesuderinamai.

  4. Šuolio sekundės: Unix laikas neatsižvelgia į šuolio sekundes, kurios kartais pridedamos prie UTC, kad kompensuotų Žemės nereguliarų sukimąsi. Tai reiškia, kad Unix laikas nėra tiksliai sinchronizuotas su astronominiu laiku.

  5. Laiko zonos apsvarstymai: Unix laiko žymės atspindi momentus UTC. Konvertavimas į vietinį laiką reikalauja papildomos laiko zonos informacijos.

  6. Vasaros laiko: Konvertuojant laiko žymes į vietinį laiką, reikia atsižvelgti į Vasaros laiko perėjimo sudėtingumus.

Naudojimo atvejai

Unix laiko žymės naudojamos daugybėje programų kompiuterijoje ir duomenų valdyme:

  1. Duomenų bazės įrašai: Laiko žymės dažnai naudojamos įrašams, kada jie buvo sukurti ar modifikuoti.

  2. Žiniatinklio kūrimas: HTTP antraštės, slapukai ir talpinimo mechanizmai dažnai naudoja Unix laiko žymes.

  3. Žurnalo failai: Sistemos žurnalai paprastai registruoja įvykius su Unix laiko žymėmis, kad būtų užtikrintas tikslus chronologinis tvarkymas.

  4. Versijų kontrolės sistemos: Git ir kitos VCS naudoja laiko žymes, kad užregistruotų, kada buvo atlikti įsipareigojimai.

  5. API atsakymai: Daugelis žiniatinklio API įtraukia laiko žymes savo atsakymuose, kad nurodytų, kada duomenys buvo sugeneruoti arba kada ištekliai buvo paskutinį kartą modifikuoti.

  6. Failų sistemos: Failų sukūrimo ir modifikavimo laikai dažnai saugomi kaip Unix laiko žymės.

  7. Sesijų valdymas: Žiniatinklio programos naudoja laiko žymes, kad nustatytų, kada vartotojo sesijos turi pasibaigti.

  8. Duomenų analizė: Laiko žymės suteikia standartizuotą būdą dirbti su laiko duomenimis analizės programose.

Alternatyvos

Nors Unix laiko žymės yra plačiai naudojamos, yra alternatyvių laiko atvaizdavimo formatų, kurie tam tikrose kontekstuose gali būti tinkamesni:

  1. ISO 8601: Standartizuotas eilutės formatas (pvz., "2021-01-01T00:00:00Z"), kuris yra žmogaus skaitomas, išlaikant rūšiavimo galimybes. Jis dažnai teikiamas pirmenybė duomenų mainams ir vartotojams.

  2. RFC 3339: ISO 8601 profiliavimas, naudojamas interneto protokoluose, su griežtesniais formatavimo reikalavimais.

  3. Žmogaus skaitomi formatai: Lokalizuotos datos eilutės (pvz., "2021 m. sausio 1 d.") labiau tinka tiesioginiam vartotojo sąveikai, tačiau mažiau tinkamos skaičiavimams.

  4. Microsoft FILETIME: 64 bitų vertė, atspindinti 100 nanosekundžių intervalų skaičių nuo 1601 m. sausio 1 d., naudojama Windows sistemose.

  5. Juliano dienos numeris: Naudojamas astronomijoje ir kai kuriose mokslinėse programose, skaičiuojant dienas nuo 4713 m. pr. m. e. sausio 1 d.

Laiko formato pasirinkimas priklauso nuo tokių veiksnių kaip:

  • Reikalingas tikslumas
  • Žmogaus skaitomumo poreikiai
  • Saugojimo apribojimai
  • Suderinamumas su esamomis sistemomis
  • Atstumas, kurį reikia atvaizduoti

Istorija

Unix laiko sąvoka kilo iš Unix operacinės sistemos kūrimo Bell Labs vėlyvuoju 1960-ųjų ir ankstyvuoju 1970-ųjų laikotarpiu. Sprendimas naudoti 1970 m. sausio 1 d. kaip epochą buvo šiek tiek savavališkas, tačiau praktinis tuo metu – jis buvo pakankamai neseniai, kad sumažintų saugojimo reikalavimus svarbioms datoms, tačiau pakankamai toli praeityje, kad būtų naudingas istoriniams duomenims.

Pradinė įgyvendinimas naudojo 32 bitų pasirašytą sveikąjį skaičių, kad saugotų sekundžių skaičių, kuris tuo metu buvo pakankamas numatomam Unix sistemų gyvavimo laikui. Tačiau šis sprendimas sukėlė 2038 m. problemą (kartais vadinamą "Y2K38" arba "Unix tūkstantmečio klaida"), nes 32 bitų pasirašyti sveikieji skaičiai gali atspindėti datas tik iki 2038 m. sausio 19 d. (03:14:07 UTC).

Kai Unix ir Unix tipo operacinės sistemos tapo populiarios, Unix laiko žymė tapo de facto standartu laiko atvaizdavimui kompiuterijoje. Ji buvo priimta daugelio programavimo kalbų, duomenų bazių ir programų, išplėsdama savo taikymą toli už pradinės Unix aplinkos.

Šiuolaikinės sistemos vis dažniau naudoja 64 bitų sveikuosius skaičius laiko žymėms, kas išplečia atvaizduojamą diapazoną iki maždaug 292 milijardų metų abiem kryptimis nuo epochos, efektyviai išsprendžiant 2038 m. problemą. Tačiau senosios sistemos ir programos gali vis dar būti pažeidžiamos.

Unix laiko žymės paprastumas ir naudingumas užtikrino jos tęstinį aktualumą nepaisant sudėtingesnių laiko atvaizdavimo formatų kūrimo. Ji išlieka pagrindine sąvoka kompiuterijoje, sudarančia mūsų skaitmeninės infrastruktūros pagrindą.

Kodo pavyzdžiai

Štai pavyzdžiai, kaip konvertuoti Unix laiko žymes į žmogaus skaitomas datas įvairiose programavimo kalbose:

// JavaScript laiko žymės konvertavimas
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Sukurkite naują Date objektą (JavaScript naudoja milisekundes)
  const date = new Date(timestamp * 1000);
  
  // Formatavimo parinktys
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Paverskite į eilutę naudojant lokalizuotą formatavimą
  return date.toLocaleString(undefined, options);
}

// Pavyzdžio naudojimas
const timestamp = 1609459200; // 2021 m. sausio 1 d. 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24 valandų formatas
console.log(convertUnixTimestamp(timestamp, true));  // 12 valandų formatas
# Python laiko žymės konvertavimas
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Konvertuoti Unix laiko žymę į datetime objektą
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Formatavimo datos eilutė
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # 12 valandų formatas su AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # 24 valandų formatas
    
    return date.strftime(format_string)

# Pavyzdžio naudojimas
timestamp = 1609459200  # 2021 m. sausio 1 d. 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # 24 valandų formatas
print(convert_unix_timestamp(timestamp, True))   # 12 valandų formatas
<?php
// PHP laiko žymės konvertavimas
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Formatavimo eilutė
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // 12 valandų formatas su AM/PM
        : 'l, F j, Y H:i:s';   // 24 valandų formatas
    
    // Konvertuoti ir formatuoti datą
    return date($formatString, $timestamp);
}

// Pavyzdžio naudojimas
$timestamp = 1609459200; // 2021 m. sausio 1 d. 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // 24 valandų formatas
echo convertUnixTimestamp($timestamp, true) . "\n";  // 12 valandų formatas
?>
// Java laiko žymės konvertavimas
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) {
        // Konvertuoti Unix laiko žymę į Instant, tada į LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Sukurti formatavimo objektą pagal pageidaujamą formatą
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Formatuoti datą
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 2021 m. sausio 1 d. 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // 24 valandų formatas
        System.out.println(convertUnixTimestamp(timestamp, true));  // 12 valandų formatas
    }
}
// C# laiko žymės konvertavimas
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Konvertuoti Unix laiko žymę į DateTime
        // Unix laiko žymės yra sekundės nuo 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Formatavimo eilutė pagal 12 valandų ar 24 valandų pageidavimą
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // 12 valandų formatas su AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // 24 valandų formatas
        
        // Grąžinti suformatuotą datos eilutę
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 2021 m. sausio 1 d. 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // 24 valandų formatas
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // 12 valandų formatas
    }
}
# Ruby laiko žymės konvertavimas
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Konvertuoti Unix laiko žymę į Time objektą
  time = Time.at(timestamp)
  
  # Formatavimo pagal 12 valandų ar 24 valandų pageidavimą
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # 12 valandų formatas su AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # 24 valandų formatas
  end
end

# Pavyzdžio naudojimas
timestamp = 1609459200  # 2021 m. sausio 1 d. 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # 24 valandų formatas
puts convert_unix_timestamp(timestamp, true)   # 12 valandų formatas
// Go laiko žymės konvertavimas
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Konvertuoti Unix laiko žymę į Time
    t := time.Unix(timestamp, 0)
    
    // Formatavimo eilutė pagal 12 valandų ar 24 valandų pageidavimą
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // 12 valandų formatas su AM/PM
    } else {
        formatString += "15:04:05"    // 24 valandų formatas
    }
    
    // Grąžinti suformatuotą laiką
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 2021 m. sausio 1 d. 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // 24 valandų formatas
    fmt.Println(convertUnixTimestamp(timestamp, true))  // 12 valandų formatas
}
// Swift laiko žymės konvertavimas
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Sukurti Date iš Unix laiko žymės
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Sukurti DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Nustatyti laiko stilių pagal 12 valandų ar 24 valandų pageidavimą
    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")
    }
    
    // Grąžinti suformatuotą datą
    return formatter.string(from: date)
}

// Pavyzdžio naudojimas
let timestamp = 1609459200 // 2021 m. sausio 1 d. 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // 24 valandų formatas
print(convertUnixTimestamp(timestamp, use12Hour: true))  // 12 valandų formatas
# R laiko žymės konvertavimas
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Konvertuoti Unix laiko žymę į POSIXct datą/ laiką
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Formatavimo pagal 12 valandų ar 24 valandų pageidavimą
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # 12 valandų formatas su AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # 24 valandų formatas
  }
  
  # Grąžinti suformatuotą datos eilutę
  format(date_time, format_string)
}

# Pavyzdžio naudojimas
timestamp <- 1609459200  # 2021 m. sausio 1 d. 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # 24 valandų formatas
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # 12 valandų formatas
% MATLAB laiko žymės konvertavimas
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Konvertuoti Unix laiko žymę į MATLAB datetime
    % MATLAB datos yra dienos nuo 1900-01-01, su 1 = 1900-01-01
    % Unix laiko žymės yra sekundės nuo 1970-01-01
    
    % Pirmiausia konvertuoti į Excel datos formatą
    % 25569 yra dienų skaičius tarp 1900-01-01 ir 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Formatavimo pagal 12 valandų ar 24 valandų pageidavimą
    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

% Pavyzdžio naudojimas
timestamp = 1609459200;  % 2021 m. sausio 1 d. 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % 24 valandų formatas
disp(convertUnixTimestamp(timestamp, true))   % 12 valandų formatas
' Excel VBA laiko žymės konvertavimas
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Konvertuoti Unix laiko žymę į Excel datą/ laiką
    ' Excel datos yra dienos nuo 1900-01-01, su 1 = 1900-01-01
    ' Unix laiko žymės yra sekundės nuo 1970-01-01
    
    ' Pirmiausia konvertuoti į Excel datos formatą
    ' 25569 yra dienų skaičius tarp 1900-01-01 ir 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Formatavimo pagal 12 valandų ar 24 valandų pageidavimą
    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

' Naudojimas darbalapyje:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' 12 valandų formatas
' =ConvertUnixTimestamp(1609459200, FALSE) ' 24 valandų formatas

Kraštutinių atvejų tvarkymas

Dirbant su Unix laiko žymėmis, svarbu teisingai tvarkyti kraštutinius atvejus. Štai pavyzdžiai, kaip tvarkyti kai kuriuos dažniausiai pasitaikančius kraštutinius atvejus:

// JavaScript kraštutinių atvejų tvarkymas
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Patikrinkite, ar laiko žymė yra galiojanti
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Neteisinga laiko žymė";
  }
  
  // Patikrinkite neigiamas laiko žymes (datas prieš 1970)
  if (timestamp < 0) {
    // Kai kurie naršyklės gali neteisingai tvarkyti neigiamas laiko žymes
    // Naudokite patikimesnį požiūrį į datas prieš 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Neteisinga data (prieš 1970)";
    }
  }
  
  // Patikrinkite Y2K38 problemą (32 bitų sistemoms)
  const maxInt32 = 2147483647; // Maksimalus 32 bitų pasirašyto sveiko skaičiaus vertė
  if (timestamp > maxInt32) {
    // Apsvarstykite galimybę naudoti BigInt labai didelėms laiko žymėms modernioje JavaScript
    console.warn("Laiko žymė viršija 32 bitų sveiko skaičiaus ribą (Y2K38 problema)");
  }
  
  // Tęsti normalų konvertavimą
  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 "Klaida konvertuojant laiko žymę: " + error.message;
  }
}

Nuorodos

  1. "Unix laikas." Vikipedija, Vikipedijos fondas, https://en.wikipedia.org/wiki/Unix_time

  2. "2038 m. problema." Vikipedija, Vikipedijos fondas, https://en.wikipedia.org/wiki/Year_2038_problem

  3. Olson, Arthur David. "Kalendrinio laiko sudėtingumai." Atvira grupė, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf

  4. "ISO 8601." Vikipedija, Vikipedijos fondas, https://en.wikipedia.org/wiki/ISO_8601

  5. "RFC 3339: Datos ir laikas internete: laiko žymės." Interneto inžinerijos darbo grupė (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., ir Dennis M. Ritchie. "C programavimo kalba." Prentice Hall, 1988.

Feedback