Whiz Tools

Unix-aikaleiman muunnin

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

Muunnettu päivämäärä ja aika

Unix-aikaleiman muunnin

Johdanto

Unix-aikaleima (tunnetaan myös nimellä POSIX-aika tai Epoch-aika) on järjestelmä ajan kuvaamiseen. Se on sekuntien määrä, joka on kulunut tammikuun 1. päivästä 1970 (keskiyöllä UTC/GMT), huomioimatta karkaussekunteja. Unix-aikaleimoja käytetään laajalti tietokonejärjestelmissä ja ohjelmointikielissä, koska ne tarjoavat kompaktin, kieliriippumattoman esityksen tietystä hetkestä ajassa.

Tämä muunnin mahdollistaa Unix-aikaleiman muuttamisen ihmisen luettavaksi päivämäärä- ja aikamuodoksi. Se tukee sekä 12 tunnin (AM/PM) että 24 tunnin aikamuotoja eri alueellisten ja henkilökohtaisten mieltymysten mukaisesti.

Kuinka Unix-aikaleimat toimivat

Unix-aikaleimat lasketaan sekuntien määrästä Unix-epookista (1. tammikuuta 1970, 00:00:00 UTC). Tämä tekee niistä erityisen hyödyllisiä aikavälin laskemiseen ja päivämäärien tallentamiseen kompaktissa muodossa.

Matemaattinen muunnos Unix-aikaleimasta kalenteripäivämääräksi sisältää useita vaiheita:

  1. Aloita Unix-epookista (1. tammikuuta 1970, 00:00:00 UTC)
  2. Lisää aikaleimassa oleva sekuntimäärä
  3. Ota huomioon karkausvuodet, vaihteleva kuukausien pituus ja muut kalenterin monimutkaisuudet
  4. Tee aikavyöhykemuutoksia tarvittaessa

Esimerkiksi Unix-aikaleima 1609459200 edustaa perjantaita, 1. tammikuuta 2021, 00:00:00 UTC.

Muunna kaava voidaan ilmaista seuraavasti:

Pa¨iva¨ma¨a¨ra¨=Unix-epookki+Aikaleima (sekunteina)\text{Päivämäärä} = \text{Unix-epookki} + \text{Aikaleima (sekunteina)}

Useimmat ohjelmointikielet ja käyttöjärjestelmät tarjoavat sisäänrakennettuja toimintoja tämän muunnoksen käsittelemiseksi, piilottaen monimutkaiset kalenterilaskelmat.

Aikamuoto- vaihtoehdot

Tämä muunnin tarjoaa kaksi aikamuoto vaihtoehtoa:

  1. 24 tunnin muoto (jota joskus kutsutaan "sotilasaikamuodoksi"): Tunnit vaihtelevat 0:sta 23:een, eikä AM/PM-merkintää ole. Esimerkiksi kello 15:00 esitetään muodossa 15:00.

  2. 12 tunnin muoto: Tunnit vaihtelevat 1:stä 12:een, AM (ante meridiem) tarkoittaa aikaa keskiyöstä keskipäivään, ja PM (post meridiem) tarkoittaa aikaa keskipäivästä keskiyöhön. Esimerkiksi 15:00 24 tunnin muodossa esitetään kello 3:00 PM.

Valinta näiden muotojen välillä on pääasiassa alueellisten käytäntöjen ja henkilökohtaisten mieltymysten kysymys:

  • 24 tunnin muotoa käytetään yleisesti suurimmassa osassa Eurooppaa, Latinalaisessa Amerikassa ja Aasiassa, sekä tieteellisissä, sotilaallisissa ja lääketieteellisissä yhteyksissä ympäri maailmaa.
  • 12 tunnin muoto on yleinen Yhdysvalloissa, Kanadassa, Australiassa ja joissakin muissa englanninkielisissä maissa jokapäiväisessä käytössä.

Rajatapaukset ja rajoitukset

Työskennellessäsi Unix-aikaleimojen kanssa on tärkeää olla tietoinen useista rajatapauksista ja rajoituksista:

  1. Negatiiviset aikaleimat: Nämä edustavat päivämääriä ennen Unix-epookkia (1. tammikuuta 1970). Vaikka ne ovat matemaattisesti päteviä, jotkut järjestelmät eivät välttämättä käsittele negatiivisia aikaleimoja oikein.

  2. Vuoden 2038 ongelma: Unix-aikaleimat tallennetaan usein 32-bittisinä allekirjoitettuina kokonaislukuina, mikä ylittyy 19. tammikuuta 2038. Tämän jälkeen 32-bittiset järjestelmät eivät pysty esittämään aikoja oikein, ellei niitä muuteta käyttämään suurempaa kokonaislukutyyppiä.

  3. Erittäin suuret aikaleimat: Erittäin kaukaiset tulevaisuuden päivämäärät eivät ehkä ole esitettävissä joissakin järjestelmissä tai niitä saatetaan käsitellä epäjohdonmukaisesti.

  4. Karkaussekunnit: Unix-aika ei ota huomioon karkaussekunteja, joita lisätään satunnaisesti UTC:hen maapallon epäsäännöllisen pyörimisen kompensoimiseksi. Tämä tarkoittaa, että Unix-aika ei ole tarkasti synkronoitu astronomiseen aikaan.

  5. Aikavyöhykkeen huomioiminen: Unix-aikaleimat edustavat hetkiä UTC:ssä. Paikalliseen aikaan muuntaminen vaatii lisätietoa aikavyöhykkeistä.

  6. Kesäaika: Kun aikaleimoja muunnetaan paikalliseen aikaan, on otettava huomioon kesäajan siirtymien monimutkaisuudet.

Käyttötapaukset

Unix-aikaleimoja käytetään monissa sovelluksissa tietojenkäsittelyssä ja tietojen hallinnassa:

  1. Tietokantarekisterit: Aikaleimoja käytetään yleisesti tallentamaan, milloin merkinnät on luotu tai muutettu.

  2. Verkkokehitys: HTTP-otsikot, evästeet ja välimuistimekanismit käyttävät usein Unix-aikaleimoja.

  3. Lokitiedostot: Järjestelmän lokit tallentavat yleensä tapahtumat Unix-aikaleimoilla tarkan aikajärjestyksen saavuttamiseksi.

  4. Versionhallintajärjestelmät: Git ja muut VCS:t käyttävät aikaleimoja tallentaakseen, milloin sitoumukset on tehty.

  5. API-vastaukset: Monet verkkosovellusrajapinnat sisältävät aikaleimoja vastauksissaan osoittaakseen, milloin tiedot on luotu tai milloin resursseja on viimeksi muutettu.

  6. Tiedostojärjestelmät: Tiedostojen luonti- ja muokkausaikoja tallennetaan usein Unix-aikaleimoina.

  7. Istunnon hallinta: Verkkosovellukset käyttävät aikaleimoja määrittääkseen, milloin käyttäjäistunnot tulisi päättää.

  8. Tietoanalyysi: Aikaleimat tarjoavat standardoidun tavan työskennellä aikaperusteisten tietojen kanssa analytiikkasovelluksissa.

Vaihtoehdot

Vaikka Unix-aikaleimat ovat laajalti käytössä, on olemassa vaihtoehtoisia aikamuotoja, jotka voivat olla sopivampia tietyissä konteksteissa:

  1. ISO 8601: Standardoitu merkkijonomuoto (esim. "2021-01-01T00:00:00Z"), joka on ihmisen luettavissa mutta säilyttää lajittelun. Sitä käytetään usein tietojen vaihdossa ja käyttäjäystävällisissä sovelluksissa.

  2. RFC 3339: ISO 8601:n profiili, jota käytetään internetprotokollissa, tiukemmilla muotoiluvaatimuksilla.

  3. Ihmisen luettavat muodot: Paikalliset päivämäärämerkit (esim. "1. tammikuuta 2021") ovat sopivampia suoraan käyttäjävuorovaikutukseen, mutta vähemmän soveltuvia laskentaan.

  4. Microsoft FILETIME: 64-bittinen arvo, joka edustaa 100 nanosekunnin välejä tammikuun 1. päivästä 1601, jota käytetään Windows-järjestelmissä.

  5. Julian Day Number: Käytetään tähtitieteessä ja joissakin tieteellisissä sovelluksissa, lasketaan päiviä tammikuun 1. päivästä 4713 eaa.

Aikamuodon valinta riippuu tekijöistä, kuten:

  • Tarvittava tarkkuus
  • Ihmisen luettavuuden tarpeet
  • Tallennusrajoitukset
  • Yhteensopivuus olemassa olevien järjestelmien kanssa
  • Päivämäärien alue, joka on esitettävä

Historia

Unix-aikakäsitteen alkuperä juontaa juurensa Unix-käyttöjärjestelmän kehittämiseen Bell Labsissa 1960- ja 1970-luvuilla. Päätös käyttää tammikuun 1. päivää 1970 epookkina oli jossain määrin satunnainen, mutta käytännöllinen tuolloin – se oli riittävän lähellä vähentämään tallennustarpeita kiinnostavista päivämääristä, mutta tarpeeksi kaukana menneisyydessä ollakseen hyödyllinen historiallisten tietojen kannalta.

Alkuperäinen toteutus käytti 32-bittistä allekirjoitettua kokonaislukua sekuntien tallentamiseen, mikä oli riittävä Unix-järjestelmien odotetulle elinkaarelle tuolloin. Tämä päätös johti kuitenkin vuoden 2038 ongelmaan (jota joskus kutsutaan "Y2K38" tai "Unixin vuosituhatbugi"), sillä 32-bittiset allekirjoitetut kokonaisluvut voivat edustaa vain päivämääriä tammikuun 19. päivään 2038 asti (03:14:07 UTC).

Kun Unix ja Unix-tyyppiset käyttöjärjestelmät saivat suosiota, Unix-aikaleimasta tuli de facto -standardi ajan esittämiseen tietojenkäsittelyssä. Sitä käyttivät lukuisat ohjelmointikielet, tietokannat ja sovellukset, laajentuen kauas alkuperäisestä Unix-ympäristöstään.

Nykyiset järjestelmät käyttävät yhä enemmän 64-bittisiä kokonaislukuja aikaleimoissa, mikä laajentaa esitettävän alueen noin 292 miljardiin vuoteen molempiin suuntiin epookista, ratkaisten käytännössä vuoden 2038 ongelman. Kuitenkin vanhat järjestelmät ja sovellukset voivat silti olla alttiita.

Unix-aikaleiman yksinkertaisuus ja hyödyllisyys ovat varmistaneet sen jatkuvan merkityksen huolimatta kehittyneistä aikamuotojen esityksistä. Se pysyy keskeisenä käsitteenä tietojenkäsittelyssä, joka on perustana suurelle osalle digitaalista infrastruktuuria.

Koodiesimerkit

Tässä on esimerkkejä siitä, kuinka Unix-aikaleimoja muunnetaan ihmisen luettaviksi päivämääriksi eri ohjelmointikielissä:

// JavaScript aikaleiman muunnos
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Luo uusi Date-objekti (JavaScript käyttää millisekunteja)
  const date = new Date(timestamp * 1000);
  
  // Muotoiluvaihtoehdot
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Muunna merkkijonoksi paikallisen muotoilun avulla
  return date.toLocaleString(undefined, options);
}

// Esimerkkikäyttö
const timestamp = 1609459200; // 1. tammikuuta 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24 tunnin muoto
console.log(convertUnixTimestamp(timestamp, true));  // 12 tunnin muoto
# Python aikaleiman muunnos
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Muunna Unix-aikaleima datetime-objektiksi
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Muotoile päivämäärämerkkijono
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # 12 tunnin muoto AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # 24 tunnin muoto
    
    return date.strftime(format_string)

# Esimerkkikäyttö
timestamp = 1609459200  # 1. tammikuuta 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # 24 tunnin muoto
print(convert_unix_timestamp(timestamp, True))   # 12 tunnin muoto
<?php
// PHP aikaleiman muunnos
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Muotoilumerkkijono
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // 12 tunnin muoto AM/PM
        : 'l, F j, Y H:i:s';   // 24 tunnin muoto
    
    // Muunna ja muotoile päivämäärä
    return date($formatString, $timestamp);
}

// Esimerkkikäyttö
$timestamp = 1609459200; // 1. tammikuuta 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // 24 tunnin muoto
echo convertUnixTimestamp($timestamp, true) . "\n";  // 12 tunnin muoto
?>
// Java aikaleiman muunnos
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) {
        // Muunna Unix-aikaleima Instant-muotoon, sitten LocalDateTime-muotoon
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Luo muotoilija halutun muodon mukaan
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Muotoile päivämäärä
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 1. tammikuuta 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // 24 tunnin muoto
        System.out.println(convertUnixTimestamp(timestamp, true));  // 12 tunnin muoto
    }
}
// C# aikaleiman muunnos
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Muunna Unix-aikaleima DateTime-muotoon
        // Unix-aikaleima on sekunteja 1. tammikuuta 1970 jälkeen
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Muotoilumerkkijono 12 tunnin tai 24 tunnin mieltymyksen mukaan
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // 12 tunnin muoto AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // 24 tunnin muoto
        
        // Palauta muotoiltu päivämäärämerkkijono
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1. tammikuuta 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // 24 tunnin muoto
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // 12 tunnin muoto
    }
}
# Ruby aikaleiman muunnos
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Muunna Unix-aikaleima Time-objektiksi
  time = Time.at(timestamp)
  
  # Muotoile 12 tunnin tai 24 tunnin mieltymyksen mukaan
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # 12 tunnin muoto AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # 24 tunnin muoto
  end
end

# Esimerkkikäyttö
timestamp = 1609459200  # 1. tammikuuta 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # 24 tunnin muoto
puts convert_unix_timestamp(timestamp, true)   # 12 tunnin muoto
// Go aikaleiman muunnos
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Muunna Unix-aikaleima Time-muotoon
    t := time.Unix(timestamp, 0)
    
    // Muotoilumerkkijono 12 tunnin tai 24 tunnin mieltymyksen mukaan
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // 12 tunnin muoto AM/PM
    } else {
        formatString += "15:04:05"    // 24 tunnin muoto
    }
    
    // Palauta muotoiltu aika
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1. tammikuuta 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // 24 tunnin muoto
    fmt.Println(convertUnixTimestamp(timestamp, true))  // 12 tunnin muoto
}
// Swift aikaleiman muunnos
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Luo Date Unix-aikaleimasta
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Luo DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Aseta aika tyyli 12 tunnin tai 24 tunnin mieltymyksen mukaan
    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")
    }
    
    // Palauta muotoiltu päivämäärä
    return formatter.string(from: date)
}

// Esimerkkikäyttö
let timestamp = 1609459200 // 1. tammikuuta 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // 24 tunnin muoto
print(convertUnixTimestamp(timestamp, use12Hour: true))  // 12 tunnin muoto
# R aikaleiman muunnos
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Muunna Unix-aikaleima POSIXct-datetimeksi
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Muotoile 12 tunnin tai 24 tunnin mieltymyksen mukaan
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # 12 tunnin muoto AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # 24 tunnin muoto
  }
  
  # Palauta muotoiltu päivämäärämerkkijono
  format(date_time, format_string)
}

# Esimerkkikäyttö
timestamp <- 1609459200  # 1. tammikuuta 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # 24 tunnin muoto
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # 12 tunnin muoto
% MATLAB aikaleiman muunnos
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Muunna Unix-aikaleima MATLAB datetimeksi
    % MATLAB-päivämäärät ovat päiviä vuodesta 1900-01-01, 1 = 1900-01-01
    % Unix-aikaleimat ovat sekunteja vuodesta 1970-01-01
    
    % Muunna Excel-päivämäärämuotoon
    % 25569 on päivien määrä 1900-01-01 ja 1970-01-01 välillä
    excelDate = (timestamp / 86400) + 25569;
    
    % Muotoile 12 tunnin tai 24 tunnin mieltymyksen mukaan
    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

% Esimerkkikäyttö
timestamp = 1609459200;  % 1. tammikuuta 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % 24 tunnin muoto
disp(convertUnixTimestamp(timestamp, true))   % 12 tunnin muoto
' Excel VBA aikaleiman muunnos
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Muunna Unix-aikaleima Excel-päivämääräksi
    ' Excel-päivämäärät ovat päiviä vuodesta 1900-01-01, 1 = 1900-01-01
    ' Unix-aikaleimat ovat sekunteja vuodesta 1970-01-01
    
    ' Muunna Excel-päivämäärämuotoon
    ' 25569 on päivien määrä 1900-01-01 ja 1970-01-01 välillä
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Muotoile 12 tunnin tai 24 tunnin mieltymyksen mukaan
    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

' Käyttö taulukossa:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' 12 tunnin muoto
' =ConvertUnixTimestamp(1609459200, FALSE) ' 24 tunnin muoto

Rajatapauksien käsittely

Työskennellessäsi Unix-aikaleimojen kanssa on tärkeää käsitellä rajatapauksia oikein. Tässä on esimerkkejä joidenkin yleisten rajatapauksien käsittelystä:

// JavaScript rajatapauksien käsittely
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Tarkista, onko aikaleima voimassa
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Virheellinen aikaleima";
  }
  
  // Tarkista negatiiviset aikaleimat (päivät ennen 1970)
  if (timestamp < 0) {
    // Jotkut selaimet eivät ehkä käsittele negatiivisia aikaleimoja oikein
    // Käytä luotettavampaa lähestymistapaa päiville ennen 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Virheellinen päivämäärä (ennen 1970)";
    }
  }
  
  // Tarkista Y2K38-ongelma (32-bittisille järjestelmille)
  const maxInt32 = 2147483647; // 32-bittisen allekirjoitetun kokonaisluvun maksimiarvo
  if (timestamp > maxInt32) {
    // Harkitse BigIntin käyttöä erittäin suurille aikaleimoille nykyaikaisessa JavaScriptissä
    console.warn("Aikaleima ylittää 32-bittisen kokonaisluvun rajan (Y2K38-ongelma)");
  }
  
  // Jatka normaalia muunnosta
  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 "Virhe aikaleiman muunnossa: " + error.message;
  }
}

Viitteet

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

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

  3. Olson, Arthur David. "Kalenteriajan monimutkaisuudet." 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: Päivämäärä ja aika internetissä: Aikaleimat." Internet Engineering Task Force (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., ja Dennis M. Ritchie. "C-ohjelmointikieli." Prentice Hall, 1988.

Feedback