Unix võrgus. UNIX-i aeg. Mis on Unixi aeg

Seda tööriista on vaja kuupäeva teisendamiseks Unixi ajatempli vormingust inimesele loetavaks kuupäevaks ja vastupidi.

Mis on Unixi aeg ja milleks seda kasutatakse? Et mõista, miks seda kasutatakse, alustan üldisest kontseptsioonist, mis on Unixi aeg.

Unixi aeg (või TimeStamp, mis vene keelde tõlgituna tähendab "ajatemplit" ja millel on sama tähendus) on sekundite arv, mis on möödunud 1. jaanuarist 1970. See tähendab, et Unixi ajatempel ajal 01.01.1970 00:00:00 oli 0. 2 minuti pärast (120 sekundit) oli Unixi aeg juba 120. Näiteks päev hiljem (01.02. /1970 00:00:00) Unixi aeg oli juba võrdne 86400-ga, kuna möödunud on 60*60*24=86400 sekundit. Nüüd on Unixi ajatempel juba 1561815370 ja arv kasvab pidevalt, sest sekundid tiksuvad pidevalt.

Aga miks seda kasutada? Asi on selles, et Unixi ajatemplit on mugav kasutada programmeerimisel kuupäevade salvestamiseks ja manipuleerimiseks. Ma ei lasku detailidesse, kuid lühidalt öeldes on numbrit palju mugavam lugeda ja võrrelda kui "vasakpoolsete" tähemärkidega stringi. Seetõttu kasutab enamik arendajaid oma projektides kuupäevadega töötamiseks Unixi ajatemplit ja andmebaasis näeme sageli väljal "kuupäev" ühte väga suurt numbrit, mis ei näe üldse välja nagu kuupäev.

Siin on see tööriist kasulik. Selle abil saate hõlpsasti tõlkida selle "suure arvu andmebaasist" inimloetavaks kuupäevaks. Lisaks saate isegi teha vastupidist ja muuta mis tahes kuupäeva Unixi ajatempliks. Need on võimalused, mis sellel muunduril on.

2038. aasta probleem

Nagu ma juba ütlesin, number Unixi ajatempel iga sekundiga kasvab see 1. Varem või hiljem peab selle arvu piir saabuma ja see on 2038. aastal. Asi on selles, et 21. sajandi alguses levinud 32-bitistes operatsioonisüsteemides on maksimaalne arv 2 31. See on number, milleni Unixi ajatempel 2038. aastal jõuab.

→ Sellele probleemile on lahendus juba leitud. Tagamaks, et saidid ei lõpetaks 2038. aastal õiget aja jälgimist, piisab, kui kasutate hostimis-/VDS-/spetsiaalses serveris 64-bitist operatsioonisüsteemi, mitte 32-bitist. Arvutite kiirelt kasvava võimsuse ja nende maksumuse kahanemisega liigub kõik selle poole, et aastaks 2038 osutatakse valdav osa veebilehele ruumi andmise valdkonna teenuseid 64-bitise OS-i baasil. Muide, 64-bitises süsteemis ei mõjuta selline probleem meid vähemalt 292 miljardit aastat, mis on täiesti piisav, et arvestada. 2038 aasta probleem lahendatud.

Sest Diislikütusel pole sisseehitatud tööriistu, loome järgmise skripti: #!/bin/sh truss date 2>&1 |grep ^time |awk "(print $3;)" väljuda $? või nawk "BEGIN(print srand())" või Perlis: perl -e "print time, "\n";" saate teada faili muutmise kuupäeva: truss -v lstat -t lstat ls -l fail.txt 2>&1 1>/dev/null | grep "mt\ =\" | awk "(print 9 dollarit;)"

Kuidas Unixi aega sisse saada...

Perl aega
PHP aeg ()
Rubiin Time.now (või Time.new). Väljundiks: Time.now.to_i
Python importige kõigepealt aeg, seejärel aeg.aeg()
Java pikk epohh = System.currentTimeMillis()/1000;
Microsoft .NET C# epohh = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
VBScript/ASP DateDiff("s", "01/01/1970 00:00:00", Now())
Erlang kalender:kuupäevaaeg_gregori_sekunditeni(kalender:nüüd_universaalseni_kellaaeg(now()))-719528*24*3600.
MySQL SELECT unix_timestamp(now())
PostgreSQL SELECT väljavõte(epohh FROM now());
SQL Server SELECT DATEDIFF(s, "1970-01-01 00:00:00", GETUTCDATE())
JavaScript Math.round(new Date().getTime()/1000.0) getTime() tagastab aja millisekundites.
Unix/Linux kuupäev +%s
Muu OS Käsurida: perl -e "prindiaeg" (kui teie süsteemi on installitud Perl)

Kuupäeva teisendamine Unixi ajaks...
PHP mktime( vaata, minutit, sekundit, kuu, päeval, aastal)
Rubiin Time.local( aastal, kuu, päeval, vaata, minutit, sekundit, usec) (või Time.gm GMT/UTC väljundi jaoks). Add.to_i väljastamiseks
Python esmalt impordi aeg, seejärel int(time.mktime(time.strptime("2000-01-01 12:34:00", "%Y-%m-%d %H:%M:%S")))
Java pikk epohh = uus java.text.SimpleDateFormat("pp/KK/yyyy HH:mm:ss").parse("01/01/1970 01:00:00");
VBScript/ASP DateDiff("s", "01/01/1970 00:00:00", kuupäeva väli)
MySQL SELECT unix_timestamp( aega) Ajavorming: AAAA-KK-PP HH:MM:SS või AAKKPP või AAAAKKPP
PostgreSQL SELECT väljavõte(epohh FROM date("2000-01-01 12:34"));
Ajatempliga: SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE "2001-02-16 20:38:40-08"); Intervalliga: SELECT EXTRACT(EPOCH FROM INTERVAL "5 päeva 3 tundi");
SQL Server SELECT DATEDIFF(s, "1970-01-01 00:00:00", kuupäeva väli)
Unix/Linux kuupäev +%s -d"1. jaanuar 1980 00:00:01"

Unixi aegade teisendamine inimloetavateks kuupäevadeks...
PHP kuupäev ( Vorming, unixi aeg);
Rubiin Time.at( unixi aeg)
Python esmalt impordi aeg, seejärel time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime( unixi aeg)) Asendage GMT-kuupäeva aeg.localtime väärtusega time.gmtime.
Java Stringi kuupäev = uus java.text.SimpleDateFormat("pp/KK/yyyy HH:mm:ss").format(uus java.util.Date ( unixi aeg*1000));
VBScript/ASP DateAdd("s", unixi aeg, "01/01/1970 00:00:00")
PostgreSQL VALI AJAtempel AJAVÖÖNDIGA "epohh" + unixi aeg* INTERVALL "1 sekund";
MySQL from_unixtime( unixi aeg, valikuline, väljundvorming) Standardne väljundvorming AAA-KK-PP HH:MM:SS
SQL Server DATEADD(s, unixi aeg, "1970-01-01 00:00:00")
Microsoft Excel =(A1 / 86400) + 25569 Tulemus on GMT ajavööndis. Teiste ajavööndite jaoks: =((A1 +/- tsooni ajavahe) / 86400) + 25569.
Linux kuupäev -d @1190000000
Muu OS Käsurida: perl -e "print skalaar(localtime( unixi aeg))" (Kui Perl on installitud) GMT/UTC ajavööndi jaoks asendage "localtime" sõnaga "gmtime".

Mis on Unixi aeg või Unixi epohh (Unixi ajastu või Unixi aeg või POSIXi aeg või Unixi ajatempel)?

UNIX-i aeg või POSIX-aeg on UNIX-i ja teiste POSIX-iga ühilduvate operatsioonisüsteemide ajakodeerimise meetod.
Alguspunktiks loetakse keskööd (UTC) 31. detsembrist 1969 kuni 1. jaanuarini 1970, aega alates sellest hetkest nimetatakse “UNIXi ajastuks” (inglise Unix Epoch).
UNIX-i aeg on kooskõlas UTC-ga, eriti kui UTC hüpesekundid on deklareeritud, korratakse vastavaid sekundite numbreid.
Aja salvestamise meetodit sekundite arvu kujul on väga mugav kasutada nii kuupäevade (sekundi täpsusega) võrdlemisel kui ka kuupäevade salvestamisel: vajadusel saab need teisendada mis tahes inimloetavasse vormingusse. Ka kuupäev ja kellaaeg selles vormingus võtavad väga vähe ruumi (olenevalt masinasõna suurusest 4 või 8 baiti), mistõttu on mõistlik seda kasutada suure hulga kuupäevade salvestamiseks. Toimivus võib halveneda, kui kuupäevaelementidele, nagu kuunumbritele jne, pääseb juurde väga sageli. Kuid enamikul juhtudel on tõhusam salvestada aega ühe väärtusena, mitte väljade kogumina.

Unixi ajastu teisendamine inimloetavaks kuupäevaks


Unixi algus- ja lõppkuupäev aasta, kuu või päev


Sekundite teisendamine päevadeks, tundideks ja minutiteks


Kuidas Unixi aega sisse saada...

Perlaega
PHPaeg ()
RubiinTime.now (või Time.new). Väljundiks: Time.now.to_i
Pythonimportige kõigepealt aeg, seejärel aeg.aeg()
Javapikk epohh = System.currentTimeMillis()/1000;
Microsoft .NET C#epohh = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
VBScript/ASPDateDiff("s", "01/01/1970 00:00:00", Now())
Erlangkalender:kuupäevaaeg_gregori_sekunditeni(kalender:nüüd_universaalseni_kellaaeg(now()))-719528*24*3600.
MySQLSELECT unix_timestamp(now())
PostgreSQLSELECT väljavõte(epohh FROM now());
SQL ServerSELECT DATEDIFF(s, "1970-01-01 00:00:00", GETUTCDATE())
JavaScriptMath.round(new Date().getTime()/1000.0) getTime() tagastab aja millisekundites.
Unix/Linuxkuupäev +%s
Muu OSKäsurida: perl -e "prindiaeg" (kui teie süsteemi on installitud Perl)

Kuupäeva teisendamine Unixi ajaks...

PHPmktime( vaata, minutit, sekundit, kuu, päeval, aastal)
RubiinTime.local( aastal, kuu, päeval, vaata, minutit, sekundit, usec) (või Time.gm GMT/UTC väljundi jaoks). Add.to_i väljastamiseks
Pythonesmalt impordi aeg, seejärel int(time.mktime(time.strptime("2000-01-01 12:34:00", "%Y-%m-%d %H:%M:%S")))
Javapikk epohh = uus java.text.SimpleDateFormat("pp/KK/yyyy HH:mm:ss").parse("01/01/1970 01:00:00");
VBScript/ASPDateDiff("s", "01/01/1970 00:00:00", kuupäeva väli)
MySQLSELECT unix_timestamp( aega) Ajavorming: AAAA-KK-PP HH:MM:SS või AAKKPP või AAAAKKPP
PostgreSQLSELECT väljavõte(epohh FROM date("2000-01-01 12:34"));
Ajatempliga: SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE "2001-02-16 20:38:40-08"); Intervalliga: SELECT EXTRACT(EPOCH FROM INTERVAL "5 päeva 3 tundi");
SQL ServerSELECT DATEDIFF(s, "1970-01-01 00:00:00", kuupäeva väli)
Unix/Linuxkuupäev +%s -d"1. jaanuar 1980 00:00:01"

Unixi aegade teisendamine inimloetavateks kuupäevadeks...

PHPkuupäev ( Vorming, unixi aeg);
RubiinTime.at( unixi aeg)
Pythonesmalt impordi aeg, seejärel time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime( unixi aeg)) Asendage GMT-kuupäeva aeg.localtime väärtusega time.gmtime.
JavaStringi kuupäev = uus java.text.SimpleDateFormat("pp/KK/yyyy HH:mm:ss").format(uus java.util.Date ( unixi aeg*1000));
VBScript/ASPDateAdd("s", unixi aeg, "01/01/1970 00:00:00")
PostgreSQLVALI AJAtempel AJAVÖÖNDIGA "epohh" + unixi aeg* INTERVALL "1 sekund";
MySQLfrom_unixtime( unixi aeg, valikuline, väljundvorming) Standardne väljundvorming AAA-KK-PP HH:MM:SS
SQL ServerDATEADD(s, unixi aeg, "1970-01-01 00:00:00")
Microsoft Excel=(A1 / 86400) + 25569 Tulemus on GMT ajavööndis. Teiste ajavööndite jaoks: =((A1 +/- tsooni ajavahe) / 86400) + 25569.
Linuxkuupäev -d @1190000000
Muu OSKäsurida: perl -e "print skalaar(localtime( unixi aeg))" (Kui Perl on installitud) GMT/UTC ajavööndi jaoks asendage "localtime" sõnaga "gmtime".

Milleks tööriista "Unixtime Converter" kasutatakse?

See tööriist on eelkõige kasulik veebihalduritele, kes tegelevad pidevalt suure hulga kuupäevadega või viitavad sageli oma töös nende elementidele. Tööriista "Unixtime Converter" abil saate hõlpsasti teisendada Unixi aega kasutajasõbralikuks kuupäevaks (ja vastupidi), teada saada praeguse Unixi ajastu aja ning saada ka Unixi aega erinevates programmeerimiskeeltes, DBMS-ides ja operatsioonisüsteemides.

Mis on Unixi aeg?

Unixi ajastu (Unixi ajastu) algas öösel 31. detsembrist 1969 kuni 1. jaanuarini 1970. Just seda kuupäeva võeti "arvuti" aja alguspunktiks, mis arvutatakse sekundites ja võtab väga vähe kettaruumi - ainult 4 või 8 baiti. Selle kodeerimismeetodi abil saavad programmeerijad "peida" mis tahes kuupäeva üheks numbriks ja teisendada selle lihtsalt kasutajatele arusaadavasse vormingusse.

Unixi aega (nimetatakse ka Unixi ajaks või POSIX-i ajaks) on mugav kasutada erinevates operatsioonisüsteemides ja programmeerimiskeeltes, kuna seda kuvatakse pigem ühe väärtusena kui teatud arvu välju, mis võtavad ruumi. Lisaks vastab UNIX-i aeg täielikult UTC standardile (sh liigaaastatel) - sel juhul korratakse lihtsalt vastavaid teist väärtusi.

Unixi terminoloogia

Paar sõna terminite kohta.

Niisiis, Unixi aeg(või POSIX aeg) on ​​sekundite arv, mis on möödunud 1. jaanuari 1970 südaööst tänapäevani.

Unixi ajatempel(ajatempel) on "fikseeritud" aeg, teisisõnu konkreetne kuupäev, mis on trükitud numbrisse.

UTC(Universal Coordinated Time) on koordineeritud universaalaeg, mis on "fikseeritud" algmeridiaanile ja millest alates loendatakse geograafilisi ajavööndeid.

Kui "vastupidav" see süsteem on?

Vaid paarikümne aasta pärast, nimelt 19. jaanuaril 2038 kell 03:14:08 UTC, jõuab Unixi aeg väärtuseni 2147483648 ja arvutisüsteemid suudavad selle arvu tõlgendada negatiivsena. Selle probleemi lahendamise võti on aja salvestamiseks kasutada 64-bitist (32-bitise asemel) muutujat. Sel juhul jätkub Unixi aja numbriliste väärtuste pakkumisest inimkonnale veel 292 miljardit aastat. Pole paha, eks?

Unixi aeg on kõigile üks

Kui elate Londonis või San Franciscos ja teie sõbrad elavad Moskvas, saate Unixi aega kasutades "kellasid kontrollida": see süsteem on praegu kogu maailmas sama. Loomulikult, kui serverites on aeg õigesti seadistatud. Ja seda tööriista abil "Unixtime konverter" See teisendamine võtab teil sekundi murdosa.

Ainult Lifeexample'i lugejatel on võimalik Moguta.CMS-is veebipood avada 15% soodustusega

Unixi aeg ja Unixi ajatempel (MySQL, PHP, JavaScript)

Tere, kallid ajaveebi lugejad, selles artiklis tahan teile rääkida, mis see on Unixi aeg Ja Unixi ajatempel. Programmeerijad ühendavad need mõisted sageli üheks, kuid see pole täiesti tõsi. Lisaks sisaldab artikkel palju kasulikke märkmeid Unixi ajatempliga töötamise kohta PHP-s, MySQL-is ja JavaScriptis.

Miks Unixi aeg algab 1. jaanuaril 1970

Asi on selles, et Unixi aeg hakkab Unixi ajastut lugema esimese UNIX-süsteemi vabastamisega. Esimene sedalaadi süsteem loodi 1969. aastal, seega võtsid arendajad kuupäevaks 1. jaanuar 1970 keskööl UTC ( UTC).

Mõistame, milleks on Unixi aeg ja Unixi ajatempel, ning anname neile selged mõisted.

Unixi ajatempelon ajatempel, mis on tähemärkide jada, mis näitab sekundite arvu, mis on möödunud 1. jaanuarist 1970.

Püüan tuua näite, et selgitada nende kahe mõiste erinevust.

Selle postituse kirjutamise ajal Unixi aeg oli võrdne 1346765877 .

Selle teabe lugemise ajal salvestage aeg ( 1346765877 ) on juba silt - Unixi ajatempel! Teisendades selle ajatempli inimloetavasse vormi, saame kuupäevaks 04-09-2012 ja kellaajaks 17:37:57.

Ausalt öeldes pole minu arvates nende kahe mõiste eraldamisel erilist mõtet, kuid siiski on kasulik omada ettekujutust, mis see on Unixi aeg, ning samuti on kasulik mõista, et 1970. aastast möödunud maksimaalsete võimalike sekundite arvul on piir!

Unixi ajastu lõpp saabub 2038. aastal

Fakt: maksimaalne binaararv 32-bitistes süsteemides on arv 01111111 11111111 11111111 11111111 , teisendades selle kümnendsüsteemiks, saame numbri 2147483647.

19. jaanuar 2038 kell 03:14:08 saabub hetk, mil Unixi ajastu algusest möödunud sekundite arv ületab 32-bitises süsteemis saadaoleva maksimumi, number = 2147483647. Kui bitt läheb üle, on kuupäev lähtestada.

Seda teooriat on väga lihtne testida selge näitega:

  • Avage tavaline Windowsi kalkulaator, vajutage ALT+3, see teisendab selle insenerivaateks;
  • Määrake 4-baidine režiim ja kümnendkoha sisestustüüp;
  • Kirjutage number 2147483647;

  • Pöörake tähelepanu arvu esitamisele kahendkoodis;
  • Lisage numbrile üks;

  • Liitmise tulemuseks on negatiivne arv!

Kui jätkame ühe lisamist, saame tsüklilise sulgemise.

Just see kuupäeva helisemine toimub alates 19. jaanuarist 2038 kõigis 32-bitist arhitektuuri kasutavates süsteemides.

Tegelikult pole vaja kurvastada, sest arvutisüsteemide arendajad toovad üha enam laialdasse kasutusse 64-bitiseid arhitektuure. Uskugem, et nad jõuavad 2038. aastaks.

Räägime nüüd Unixi ajatempli kasutamisest php, mysql ja isegi sisse javascript.

Unixi ajatempliga töötamine

Väga oluline punkt unixi ajatempliga töötamisel php-s või mysqlis on vajadus selgelt mõista selle kuupäevavormingu plusse ja miinuseid.

Näiteks, TIMESTAMP ei saa kasutada ajaloosündmuste või kaugema tuleviku sündmuste täpsustamiseks. Kogu kuupäevade komplekt on piiratud ajavahemikuga 1970. aastast kuni 2038. aasta alguseni. Kui määrate kuupäeva, mis on pikem kui 2038, ei tõlgenda 32-bitine süsteem seda õigesti.

Sellest piirangust aru saades tekib loogiline küsimus: " Miks on vaja kuupäevi sekundites esitada?"

Millal kasutada Unixi ajatemplit

Aja esitamiseks meie tavapärases mõõtmissüsteemis on vaja 8 baiti ja unixi ajatempli jaoks on see poole väiksem - 4 baiti.

Andmemahu säästmine on minu arvates Unixi aja kasutamise peamine ja vaieldamatu eelis.

Lisaks on töötamisel saadaval mitmeid kasulikke nüansse UNIX-i ajatempel mysql-is. Ja kuna kogu teave tuleb salvestada andmebaasiserverisse ja sellel on omakorda Unixi ajatemplitega töötamisel mitmeid eeliseid, saab unixi ajatempli kasuks valikut õigesti põhjendada järgmiste sätetega.

MySQL pakub Unixi ajavorminguga töötamiseks vastavat Timestamp andmetüüpi, mille installimisel saame kohe kasuliku eelise standardvormingute ees KUUPÄEV Ja KUUPÄEV KELLAAEG. Eeliseks on see, et kui lisate tabelisse uue kirje, täidetakse selle andmetüübiga veerg automaatselt. See tähendab, et saame säästa mitte ainult andmemahu pealt, vaid ka veebiserveri protsessori aja pealt.

Sõna varundamiseks tegevusega seame järgmise ülesande: süsteemis uue kasutaja registreerimisel tuleb sisestada selle andmebaasi lisamise kuupäev.

Kui kuupäeva salvestava välja tüüp tabelis on KUUPÄEV KELLAAEG, siis näeb PHP-skripti päring välja umbes selline:

Kasu on ilmselge!

On ka miinus: kui TIMESTAMP tüüpi väljasid on mitu, värskendatakse automaatselt ainult esimest.

Kas ajatempli asemel on mõtet kasutada INT

Paljud programmeerijad kasutavad unixi ajatempliga töötamisel täisarvu vormingut int(11) . See on probleemile täiesti irratsionaalne lähenemine, kuna MySQL pakub ajatempli tüübi jaoks palju kasulikke funktsioone, mis mõjutavad sellega töötamise kiirust. Seega, kui salvestame ajatempli INT-s, jätame end ilma igasugusest selle vormingu serveri toest. See on ligikaudu sama, mis ID salvestamine varchar(11) tüüpi.

Siiski on üks õigustus hoidmiseks unixi ajatempel INT. Andmebaasi ülekandmisel erinevate DBMS-ide vahel võib tekkida tüübikonflikt, s.t. Ühe DBMS-i ajatempli tüüp võib olla võõras. Sel juhul on int kasutamisel eelis, kuna see vorming on saadaval kõigis DBMS-ides.

MySQL-i kalendritüüpide lühikirjeldus

TIMESTAMP- andmetüüp kuupäeva ja kellaaja salvestamiseks. Andmed salvestatakse sekundite arvuna, mis on möödunud Unixi ajastu algusest. Väärtuste vahemik: 1970-01-01 00:00:00 - 2038-12-31 00:00:00. Mahutab 4 baiti.

KUUPÄEV- andmetüüp kuupäevade salvestamiseks. Väärtuste vahemik: 1000-01-01 - 9999-12-31. Mahutab 3 baiti.

KUUPÄEV KELLAAEG- andmetüüp kuupäeva ja kellaaja salvestamiseks. Väärtuste vahemik: 1000-01-01 00:00:00 - 9999-12-31 00:00:00. See võtab 8 baiti ja salvestatakse numbrina YYYYMMDDHHMMSS./p>

AASTA- andmetüüp aasta salvestamiseks. Väärtuste vahemik: 1901–2155. Mahutab 1 baiti.

AEG- andmetüüp aja salvestamiseks. Väärtuste vahemik: −828:59:59 - 828:59:59. Mahutab 3 baiti.

Kuupäeva teisendamine unixis

On aeg postitada mõned kasulikud funktsioonid kuupäevade teisendamiseks unixi ajatempel ja tagasi unix-aeg loetaval kuupäeval.

Kuidas saada praegust UNIX-i aega

  • PHP:

    aeg ();

  • JavaScript:

    Math.round(new Date().getTime()/1000.0);

  • MySQL:

    SELECT unix_timestamp(now() ) ;