Whiz Tools

Unix laika zīmju pārveidotājs

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

Pārveidotā datums un laiks

Unix laika pārvēršana

Ievads

Unix laiks (pazīstams arī kā POSIX laiks vai Epoch laiks) ir sistēma, kas apraksta laika punktu. Tas ir sekunžu skaits, kas pagājis kopš 1970. gada 1. janvāra (pusstundā UTC/GMT), neiekļaujot lēciena sekundes. Unix laiki plaši tiek izmantoti datoru sistēmās un programmēšanas valodās, jo tie nodrošina kompakta, valodu neatkarīgu laika brīža attēlojumu.

Šis pārvēršanas rīks ļauj jums pārvērst Unix laiku cilvēkam lasāmā datuma un laika formātā. Tas atbalsta gan 12 stundu (AM/PM), gan 24 stundu laika formātus, lai apmierinātu dažādas reģionālās un personiskās preferences.

Kā darbojas Unix laiki

Unix laiki tiek aprēķināti kā sekunžu skaits kopš Unix Epoch (1970. gada 1. janvāra, 00:00:00 UTC). Tas padara tos īpaši noderīgus laika atšķirību aprēķināšanai un datu glabāšanai kompakta formātā.

Matemātiskā pārvēršana no Unix laika uz kalendāra datumu ietver vairākus soļus:

  1. Sākt ar Unix Epoch (1970. gada 1. janvāra, 00:00:00 UTC)
  2. Pievienot laika zīmē esošo sekunžu skaitu
  3. Ņemt vērā lēciena gadus, mainīgus mēnešu garumus un citas kalendāra sarežģītības
  4. Ja nepieciešams, piemērot laika joslas pielāgojumus

Piemēram, Unix laiks 1609459200 attēlo piektdienu, 2021. gada 1. janvāri, 00:00:00 UTC.

Pārvēršanas formulu var izteikt kā:

Datums=Unix Epoch+Laiks (sekundeˉs)\text{Datums} = \text{Unix Epoch} + \text{Laiks (sekundēs)}

Lielākā daļa programmēšanas valodu un operētājsistēmu nodrošina iebūvētas funkcijas, lai apstrādātu šo pārvēršanu, slēpjot sarežģītās kalendāra aprēķinus.

Laika formātu opcijas

Šis pārvēršanas rīks piedāvā divas laika formāta opcijas:

  1. 24 stundu formāts (dažreiz saukts par "militāro laiku"): Stundas svārstās no 0 līdz 23, un nav AM/PM apzīmējuma. Piemēram, 15:00 tiek attēlots kā 15:00.

  2. 12 stundu formāts: Stundas svārstās no 1 līdz 12, ar AM (ante meridiem) laikiem no pusnakts līdz pusdienlaikam un PM (post meridiem) laikiem no pusdienlaika līdz pusnaktij. Piemēram, 15:00 24 stundu formātā tiek attēlots kā 3:00 PM.

Izvēle starp šiem formātiem galvenokārt ir reģionāla konvencija un personiska preference:

  • 24 stundu formāts ir plaši izmantots lielākajā daļā Eiropas, Latīņamerikas un Āzijas, kā arī zinātniskos, militāros un medicīnas kontekstos visā pasaulē.
  • 12 stundu formāts ir izplatīts Amerikas Savienotajās Valstīs, Kanādā, Austrālijā un dažās citās angliski runājošās valstīs ikdienas lietošanai.

Malu gadījumi un ierobežojumi

Strādājot ar Unix laikiem, ir svarīgi būt uzmanīgam pret vairākiem malu gadījumiem un ierobežojumiem:

  1. Negatīvi laiki: Šie attēlo datumus pirms Unix Epoch (1970. gada 1. janvāra). Lai gan matemātiski tie ir derīgi, dažas sistēmas var nepareizi apstrādāt negatīvus laikus.

  2. 2038. gada problēma: Unix laiki bieži tiek glabāti kā 32 bitu parakstīti veseli skaitļi, kas pārsniegs 19. janvāra 2038. gadu. Pēc šī brīža 32 bitu sistēmas nespēs pareizi attēlot laikus, ja vien tās netiks modificētas, lai izmantotu lielāku veselu skaitļu tipu.

  3. Ļoti lieli laiki: Ļoti tālu nākotnes datumi var nebūt attēlojami dažās sistēmās vai var tikt apstrādāti nesakritīgi.

  4. Lēciena sekundes: Unix laiks neņem vērā lēciena sekundes, kas reizēm tiek pievienotas UTC, lai kompensētu Zemes neregulāro rotāciju. Tas nozīmē, ka Unix laiks nav precīzi sinhronizēts ar astronomisko laiku.

  5. Laika joslas apsvērumi: Unix laiki attēlo mirkļus UTC. Pārvēršana uz vietējo laiku prasa papildu laika joslas informāciju.

  6. Vasaras laiks: Pārvēršot laikus uz vietējo laiku, jāņem vērā Vasaras laika pārejas sarežģītības.

Lietošanas gadījumi

Unix laiki tiek izmantoti daudzās lietojumprogrammās datoru un datu pārvaldībā:

  1. Datu bāzes ieraksti: Laiki parasti tiek izmantoti, lai reģistrētu, kad ieraksti tika izveidoti vai mainīti.

  2. Tīmekļa izstrāde: HTTP galvenes, sīkfaili un kešatmiņas mehānismi bieži izmanto Unix laikus.

  3. Žurnālu faili: Sistēmas žurnāli parasti reģistrē notikumus ar Unix laikiem precīzai hronoloģiskai secībai.

  4. Versiju kontroles sistēmas: Git un citas VCS izmanto laikus, lai reģistrētu, kad tika veikti komitejas.

  5. API atbildes: Daudzi tīmekļa API iekļauj laikus savās atbildēs, lai norādītu, kad dati tika ģenerēti vai kad resursi tika pēdējo reizi modificēti.

  6. Failu sistēmas: Failu izveides un modificēšanas laiki bieži tiek glabāti kā Unix laiki.

  7. Sesiju pārvaldība: Tīmekļa lietojumprogrammas izmanto laikus, lai noteiktu, kad lietotāja sesijas jābeidz.

  8. Datu analīze: Laiki nodrošina standartizētu veidu, kā strādāt ar laika datiem analītikas lietojumprogrammās.

Alternatīvas

Lai gan Unix laiki ir plaši izmantoti, ir alternatīvi laika attēlojuma formāti, kas var būt piemērotāki noteiktos kontekstos:

  1. ISO 8601: Standartizēts virknes formāts (piemēram, "2021-01-01T00:00:00Z"), kas ir cilvēkam lasāms, saglabājot kārtību. Tas bieži tiek izvēlēts datu apmaiņai un lietotāja saskarnēm.

  2. RFC 3339: ISO 8601 profils, ko izmanto interneta protokolos, ar stingrākām formatēšanas prasībām.

  3. Cilvēkam lasāmi formāti: Lokalizēti datuma virknējumi (piemēram, "2021. gada 1. janvāris") ir piemērotāki tiešai lietotāju mijiedarbībai, bet ir mazāk piemēroti aprēķiniem.

  4. Microsoft FILETIME: 64 bitu vērtība, kas attēlo 100 nanosekundi intervālus kopš 1601. gada 1. janvāra, ko izmanto Windows sistēmās.

  5. Jūlija dienas numurs: Izmanto astronomijā un dažās zinātniskās lietojumprogrammās, skaitot dienas kopš 4713. gada p.m.ē. 1. janvāra.

Laika formāta izvēle ir atkarīga no tādiem faktoriem kā:

  • Nepieciešamā precizitāte
  • Cilvēku lasāmības vajadzības
  • Glabāšanas ierobežojumi
  • Saderība ar esošajām sistēmām
  • Datumu diapazons, kas jāattēlo

Vēsture

Unix laika koncepts radās, izstrādājot Unix operētājsistēmu Bell Labs 1960. gadu beigās un 1970. gadu sākumā. Lēmums izmantot 1970. gada 1. janvāri kā epoch bija nedaudz patvaļīgs, bet praktisks tajā laikā - tas bija pietiekami nesens, lai samazinātu datu glabāšanas prasības interesējošiem datumiem, bet pietiekami tālu pagātnē, lai būtu noderīgs vēsturiskajiem datiem.

Sākotnējā īstenošana izmantoja 32 bitu parakstītu veselu skaitli, lai glabātu sekunžu skaitu, kas bija pietiekams gaidāmajam Unix sistēmu mūža ilgumam tajā laikā. Tomēr šis lēmums noveda pie 2038. gada problēmas (dažreiz sauktas par "Y2K38" vai "Unix milēnija kļūda"), jo 32 bitu parakstīti veseli skaitļi var attēlot laikus tikai līdz 1970. gada 1. janvāra 19. janvārim (03:14:07 UTC).

Kad Unix un Unix līdzīgas operētājsistēmas ieguva popularitāti, Unix laiks kļuva par de facto standartu laika attēlošanai datoru jomā. To pieņēma daudzas programmēšanas valodas, datu bāzes un lietojumprogrammas, paplašinot tā pielietojumu tālu ārpus sākotnējās Unix vides.

Mūsdienu sistēmas arvien biežāk izmanto 64 bitu veselos skaitļus laikiem, kas paplašina attēlojamā diapazona robežas līdz aptuveni 292 miljardiem gadu abos virzienos no epoch, efektīvi atrisinot 2038. gada problēmu. Tomēr mantojuma sistēmas un lietojumprogrammas var joprojām būt neaizsargātas.

Unix laika vienkāršība un lietderība ir nodrošinājusi tā turpmāku nozīmīgumu, neskatoties uz sarežģītāku laika attēlojuma formātu izstrādi. Tas joprojām ir pamatjēdziens datorzinātnēs, kas veido pamatu lielākajai daļai mūsu digitālās infrastruktūras.

Koda piemēri

Šeit ir piemēri, kā pārvērst Unix laikus cilvēkam lasāmā datumā dažādās programmēšanas valodās:

// JavaScript laika pārvēršana
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Izveido jaunu Date objektu (JavaScript izmanto milisekundes)
  const date = new Date(timestamp * 1000);
  
  // Formatēšanas opcijas
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Pārvērš uz virkni, izmantojot lokalizētu formatēšanu
  return date.toLocaleString(undefined, options);
}

// Piemēra izmantošana
const timestamp = 1609459200; // 2021. gada 1. janvāris 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24 stundu formāts
console.log(convertUnixTimestamp(timestamp, true));  // 12 stundu formāts
# Python laika pārvēršana
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Pārvērš Unix laiku uz datetime objektu
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Formatē datuma virkni
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # 12 stundu formāts ar AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # 24 stundu formāts
    
    return date.strftime(format_string)

# Piemēra izmantošana
timestamp = 1609459200  # 2021. gada 1. janvāris 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # 24 stundu formāts
print(convert_unix_timestamp(timestamp, True))   # 12 stundu formāts
<?php
// PHP laika pārvēršana
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Formatēšanas virkne
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // 12 stundu formāts ar AM/PM
        : 'l, F j, Y H:i:s';   // 24 stundu formāts
    
    // Pārvērš un formatē datumu
    return date($formatString, $timestamp);
}

// Piemēra izmantošana
$timestamp = 1609459200; // 2021. gada 1. janvāris 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // 24 stundu formāts
echo convertUnixTimestamp($timestamp, true) . "\n";  // 12 stundu formāts
?>
// Java laika pārvēršana
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) {
        // Pārvērš Unix laiku uz Instant, tad uz LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Izveido formatētāju atkarībā no vēlamā formāta
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Formatē datumu
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 2021. gada 1. janvāris 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // 24 stundu formāts
        System.out.println(convertUnixTimestamp(timestamp, true));  // 12 stundu formāts
    }
}
// C# laika pārvēršana
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Pārvērš Unix laiku uz DateTime
        // Unix laiks ir sekundes kopš 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Formatēšanas virkne atkarībā no 12 stundu vai 24 stundu preferences
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // 12 stundu formāts ar AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // 24 stundu formāts
        
        // Atgriež formatētu datumu
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 2021. gada 1. janvāris 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // 24 stundu formāts
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // 12 stundu formāts
    }
}
# Ruby laika pārvēršana
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Pārvērš Unix laiku uz Time objektu
  time = Time.at(timestamp)
  
  # Formatē atkarībā no 12 stundu vai 24 stundu preferences
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # 12 stundu formāts ar AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # 24 stundu formāts
  end
end

# Piemēra izmantošana
timestamp = 1609459200  # 2021. gada 1. janvāris 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # 24 stundu formāts
puts convert_unix_timestamp(timestamp, true)   # 12 stundu formāts
// Go laika pārvēršana
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Pārvērš Unix laiku uz Time
    t := time.Unix(timestamp, 0)
    
    // Formatēšanas virkne atkarībā no 12 stundu vai 24 stundu preferences
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // 12 stundu formāts ar AM/PM
    } else {
        formatString += "15:04:05"    // 24 stundu formāts
    }
    
    // Atgriež formatētu laiku
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 2021. gada 1. janvāris 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // 24 stundu formāts
    fmt.Println(convertUnixTimestamp(timestamp, true))  // 12 stundu formāts
}
// Swift laika pārvēršana
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Izveido Date no Unix laika
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Izveido DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Iestata laika stilu atkarībā no 12 stundu vai 24 stundu preferences
    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")
    }
    
    // Atgriež formatētu datumu
    return formatter.string(from: date)
}

// Piemēra izmantošana
let timestamp = 1609459200 // 2021. gada 1. janvāris 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // 24 stundu formāts
print(convertUnixTimestamp(timestamp, use12Hour: true))  // 12 stundu formāts
# R laika pārvēršana
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Pārvērš Unix laiku uz POSIXct datumu
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Formatē atkarībā no 12 stundu vai 24 stundu preferences
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # 12 stundu formāts ar AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # 24 stundu formāts
  }
  
  # Atgriež formatētu datumu
  format(date_time, format_string)
}

# Piemēra izmantošana
timestamp <- 1609459200  # 2021. gada 1. janvāris 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # 24 stundu formāts
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # 12 stundu formāts
% MATLAB laika pārvēršana
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Pārvērš Unix laiku uz MATLAB datetime
    % MATLAB datumi ir dienas kopš 1900-01-01, ar 1 = 1900-01-01
    % Unix laiki ir sekundes kopš 1970-01-01
    
    % Vispirms pārvērš uz Excel datuma formātu
    % 25569 ir dienu skaits starp 1900-01-01 un 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Formatē atkarībā no 12 stundu vai 24 stundu preferences
    if use12Hour
        formattedDate = datestr(excelDate, 'dddd, mmmm d, yyyy h:mm:ss AM/PM');
    else
        formattedDate = datestr(excelDate, 'dddd, mmmm d, yyyy hh:mm:ss');
    end
end

% Piemēra izmantošana
timestamp = 1609459200;  % 2021. gada 1. janvāris 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % 24 stundu formāts
disp(convertUnixTimestamp(timestamp, true))   % 12 stundu formāts
' Excel VBA laika pārvēršana
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Pārvērš Unix laiku uz Excel datumu/laiku
    ' Excel datumi ir dienas kopš 1900-01-01, ar 1 = 1900-01-01
    ' Unix laiki ir sekundes kopš 1970-01-01
    
    ' Vispirms pārvērš uz Excel datuma formātu
    ' 25569 ir dienu skaits starp 1900-01-01 un 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Formatēšanas virkne atkarībā no 12 stundu vai 24 stundu preferences
    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

' Lietošana darba lapā:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' 12 stundu formāts
' =ConvertUnixTimestamp(1609459200, FALSE) ' 24 stundu formāts

Malu gadījumu apstrāde

Strādājot ar Unix laikiem, ir svarīgi pareizi apstrādāt malu gadījumus. Šeit ir piemēri, kā apstrādāt dažus kopīgus malu gadījumus:

// JavaScript malu gadījumu apstrāde
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Pārbauda, vai laiks ir derīgs
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Nederīgs laiks";
  }
  
  // Pārbauda negatīvus laikus (datumus pirms 1970)
  if (timestamp < 0) {
    // Dažas pārlūkprogrammas var nepareizi apstrādāt negatīvus laikus
    // Izmanto robustāku pieeju datumiem pirms 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Nederīgs datums (pirms 1970)";
    }
  }
  
  // Pārbauda Y2K38 problēmu (32 bitu sistēmām)
  const maxInt32 = 2147483647; // Maksimālā vērtība 32 bitu parakstītam veselam skaitlim
  if (timestamp > maxInt32) {
    // Apsver iespēju izmantot BigInt ļoti lieliem laikiem modernajā JavaScript
    console.warn("Laiks pārsniedz 32 bitu veselā skaitļa robežu (Y2K38 problēma)");
  }
  
  // Turpina ar parasto pārvēršanu
  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 "Kļūda, pārvēršot laiku: " + error.message;
  }
}

Atsauces

  1. "Unix laiks." Vikipēdija, Wikimedia Foundation, https://en.wikipedia.org/wiki/Unix_time

  2. "2038. gada problēma." Vikipēdija, Wikimedia Foundation, https://en.wikipedia.org/wiki/Year_2038_problem

  3. Olson, Arthur David. "Kalendāra laika sarežģītības." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf

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

  5. "RFC 3339: Datums un laiks internetā: Laiki." Interneta inženierijas darba grupa (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., un Dennis M. Ritchie. "C programmēšanas valoda." Prentice Hall, 1988.

Feedback