Unixový čas. Čas UNIX

Unixova epocha).

Celé číslo

Každý deň sa číslo predstavujúce unixový čas vypočítava podľa popisu v UTC (00: 00: 00Z) a od polnoci sa zvyšuje presne o 1 za sekundu. Preto 16-09-2004 17: 55: 43,54, 64543,54 sekundy od polnoci, z vyššie uvedeného príkladu, bude v čase UNIX reprezentované číslom 1095292800 + 64543.54 = 1095357343.54. Pri dátumoch pred vznikom sa zvyšuje aj počet, t.j. časom sa blíži k nule.

Použitý celočíselný systém je vhodný na porovnávanie a ukladanie dátumov (dátum a čas v tomto formáte trvá iba 4 alebo 8 bajtov). Ak potrebujete odkazovať na prvky dátumov (deň, mesiac, rok), sekundy je možné previesť do akéhokoľvek vhodného formátu (a naopak).

V programoch na ukladanie času UNIX sa používa typ celého čísla so znamienkom. Podpísané 32-bitové čísla môžu odkazovať na časy od piatku 13. decembra 1901, 20:45:52 do utorka 19. januára 2038, 03:14:07 vrátane.

Ak chcete nájsť aktuálny čas systému UNIX na väčšine systémov podobných systému UNIX, môžete použiť príkaz date +% s.

Významy „jubilea“

Čas Počet sekúnd
13. december 1901, 20:45:52 UTC

Minimálny dátum v podpísanom 32-bitovom zápise (0x80000000)

19. januára 2038 03:14:07 UTC

Maximálny dátum v podpísanom 32-bitovom zápise (0x7FFFFFFF)

9. september 2001 01:46:40 UTC 1 000 000 000 (1 gigabajt sekundy)
10. januára 2004, 13:37:04 UTC 1 073 741 824 = 2 30 (1 gibisekunda)
18. marca 2005 01:58:31 UTC 1 111 111 111
6. september 2008 12:12:05 UTC 1 220 703 125 = 5 13
13. februára 2009, 23:31:30 UTC 1 234 567 890

Problém roku 2038

Apple iOS ako problém so systémom UNIX

64-bitové zariadenia iOS od spoločnosti Apple majú problém ako systémy UNIX. Ak zmeníte čas na zariadení so 64-bitovým procesorom so systémom iOS na 1. hodinu 1970 1. januára 1970 a reštartujete zariadenie v časovom pásme od UTC +1: 30 alebo viac, potom po reštarte zariadenia nezapne sa, zostane svietiť stále „biele jablko“. Stáva sa to kvôli rozdielu v časových pásmach, to znamená: ak preložíte čas na 1:00 1. januára 1970 v časovom pásme UTC +1: 30 alebo viac, potom počítadlo času UNIX prejde do mínusu, pretože odpočítavanie je od času UTC, ktorému systém nedokáže porozumieť, v dôsledku čoho počítadlo zamrzne. Zariadenie sa ani neobnoví cez DFU, ale problém má tri riešenia inými spôsobmi. Prvý spôsob: ponechajte zariadenie zapnuté a počkajte, kým sa UNIX-time čítač nedostane do plusu (kým sa nepreukáže, že táto metóda funguje). Druhý spôsob: počkajte, kým sa batéria telefónu úplne nevybije a počítadlo sa sám vynuluje. Tretí spôsob: rozoberte zariadenie a na chvíľu odpojte batériu, potom zostavte zariadenie, počítadlo sa tiež vynuluje a zariadenie bude fungovať.

Problém je konečne vyriešený v systéme iOS 9.3.1 - teraz je zariadenie k dispozícii na nastavenie dátumu od 1. januára 2001.

Konverzia softvéru

Je uvedený príklad implementácie funkcií na prevod medzi časom UNIX a obvyklým zobrazením vo forme dátumu a času v jazyku C. Príklad je v štandardnom 32-bitovom podpísanom formáte. Ak však komentujete definíciu _XT_SIGNED, príklad bude zostavený v nepodpísanej verzii.

Prevod času, hlavičkový súbor

typedef nepodpísaný krátky u16_t; typedef nepodpísaný dlhý u32_t; typedef podpísaný krátky s16_t; typedef podpísaný dlhý s32_t; // DEF: štandardný podpísaný formát // UNDEF: neštandardný nepodpísaný formát #define _XT_SIGNED #ifdef _XT_SIGNED typedef s32_t xtime_t; #else typedef u32_t xtime_t; #endif struct tm ( / * komponenty dátumu a času * / BYTE tm_sec; BYTE tm_min; BYTE tm_hour; BYTE tm_mday; BYTE tm_mon; u16_t tm_year;); void xttotm (struct tm * t, xtime_t secs); xtime_t xtmtot (struct tm * t);

Konverzia času

#include "xtime.h" #define _TBIAS_DAYS ((70 * (u32_t) 365) + 17) #define _TBIAS_SECS (_TBIAS_DAYS * (xtime_t) 86400) #define _TBIAS_YEAR 1900 #define (MONTAB (year) 03 (rok) == 0))? Mos: lmos) const s16_t lmos = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335); const s16_t mos = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334); #define Daysto32 (rok, mon) (((rok - 1)/4) + MONTAB (rok)) ////////////////////////////// ///////////////////////////////////////////////xtime_t xtmtot (struct tm * t) ( / * previesť časovú štruktúru na skalárny čas * / s32_t dní; xtime_t s Daysto32 (rok, mon) - 1; dni + = 365 * rok; dni + = t-> tm_mday; dni - = _TBIAS_DAYS; / * Vypočítajte počet sekúnd. * / S = 3600 * t -> tm_hodina; s + 60 * t-> tm_min; s + = t-> tm_sec; s + = (dni * (xtime_t) 86400); návrat (s);) //////////////// // //////////////////////////////////////////////////////// void xttotm (struct tm * t, xtime_t secsarg) (u32_t secs; s32_t days; s32_t mon; s32_t year; s32_t i; const s16_t * pm; #ifdef _XT_SIGNED if (secsarg> = 0) (secs = (u32_t) secs days = _TBIAS_DAYS;) else (secs = (u32_t) secsarg + _TBIAS_SECS; days = 0;) #else secs = secsarg; days = _TBIAS_DAYS; #endif / * days, hour, min, s * / dni + = s / 86400; s = s% 86400; t-> tm_hour = s / 3600; s% = 3600; t-> tm_min = s / 60; t-> tm_sec = s% 60; / * určiť rok * / pre (rok = dni / 365; dni< (i = Daysto32(year, 0) + 365*year);) { --year; } days -= i; t->tm_year = rok + _TBIAS_YEAR; / * určiť mesiac * / pm = MONTAB (rok); po dobu (mon = 12; dní< pm[--mon];); t->tm_mon = mon + 1; t-> tm_mday = dni - pm + 1; )

Previesť čas z formátu Excel do formátu Unix

dvojité et; // dátum a čas vo formáte Excel (používa sa aj v OpenOffice, Sierra Chart) time_t ut = round ((et * 86400) - 2209161600); // dátum a čas vo formáte Unix

Napíšte recenziu na „UNIX Time“

Poznámky

vonkajšie odkazy

Úryvok charakterizujúci čas UNIX

Černyšev sedel s knihou francúzskeho románu pri okne prvej miestnosti. Táto miestnosť bola pravdepodobne predtým halou; stále v ňom bol organ, na ktorom boli nejaké koberce, a v jednom rohu stálo skladacie lôžko Bennigsenovho pobočníka. Tento pomocník tu bol. Očividne sužovaný hostinou alebo podnikaním sedel na vyhrnutej posteli a driemal. Z haly viedli dvoje dvere: jedny priamo do bývalej obývačky, druhé vpravo do pracovne. Od prvých dverí boli počuť hlasy hovoriace po nemecky a príležitostne aj po francúzsky. Tam, v bývalej spoločenskej miestnosti, neboli zhromaždení na žiadosť panovníka nie vojnová rada (panovník mal rád neistotu), ale niekoľko osôb, ktorých názor na nadchádzajúce ťažkosti chcel vedieť. Nebola to vojnová rada, ale ako rada vyvolených, ktorá mala panovníkovi osobne objasniť určité otázky. Na túto polovičnú radu boli pozvaní: švédsky generál Armfeld, generálny pobočník Wolzogen, Winzingerode, ktorého Napoleon nazýval utečeným francúzskym poddaným, Michaud, Toll, vôbec nie vojak - gróf Stein a napokon aj samotný Pful, ktorý ako princ Andrew počul, že je la cheville ouvriere [základ] celého podnikania. Princ Andrey mal možnosť ho dobre preskúmať, pretože Pful prišiel krátko po ňom, vošiel do salónu a na chvíľu sa zastavil, aby sa porozprával s Chernyshevom.
Na prvý pohľad puntičkársky v zle ušitej uniforme svojho ruského generála, ktorý na nej nešikovne sedel, akoby oblečený, pôsobil na princa Andreja ako známy, hoci ho nikdy nevidel. Patrili sem Weyrother, Mack a Schmidt a mnoho ďalších nemeckých teoretikov generálov, ktorých sa princovi Andrewovi podarilo vidieť v roku 1805; ale bol pre všetkých typickejší. Princ Andrew nikdy nevidel takého nemeckého teoretika, ktorý v sebe spájal všetko, čo v tých Nemcoch bolo.
Pful bol nízky, veľmi tenký, ale so širokými kosťami, hrubej, zdravej postavy, so širokou panvou a kostnatými lopatkami. Jeho tvár bola veľmi vráskavá, s hlboko vsadenými očami. Vlasy pred spánkami mal, evidentne, narýchlo uhladené štetcom, spoza nich naivne trčali strapce. Nepokojne a nahnevane sa rozhliadajúc vošiel do miestnosti, akoby sa bál všetkého vo veľkej miestnosti, do ktorej vošiel. Nešikovným pohybom držal meč a obrátil sa na Černyševa, pričom sa po nemecky pýtal, kde je suverén. Evidentne chcel čím skôr prejsť miestnosťami, dokončiť poklony a pozdravy a sadnúť si do práce pred mapu, kde sa cítil ako doma. Narýchlo prikývol hlavou na slová Černyševa a ironicky sa usmial, pričom počúval jeho slová, že panovník skúma opevnenia, ktoré podľa svojej teórie položil on, sám Pful. Je to niečo basgitarista a cool, ako si sebavedomí Nemci hovoria, reptal na seba: Dummkopf ... alebo: zu Grunde die ganze Geschichte ... alebo: s "wird was gescheites d" raus werden ... [nezmysel ... do čerta s celou vecou ... (nemčina)] Princ Andrey nepočul a chcel prejsť, ale Chernyshev predstavil princa Andreyho Pfulovi s tým, že princ Andrey prišiel z Turecka, kde sa vojna tak šťastne skončila. Pful mierne nepozrel ani tak na princa Andrewa, ako cez neho, a so smiechom povedal: „Da muss ein schoner taktischcr Krieg gewesen sein.“ [„To musela byť správna taktická vojna.“ (Nemčina)] - A pohŕdavo sa smejúc vošiel do miestnosti, z ktorej bolo počuť hlasy.
Je vidieť, že Pful, už vždy pripravený na ironické podráždenie, bol teraz obzvlášť vzrušený skutočnosťou, že sa odvážili skontrolovať jeho tábor a súdiť ho bez neho. Z jedného krátkeho stretnutia s Pfulom princ Andrew vďaka svojim slavkovským spomienkam zostavil jasnú charakteristiku tohto muža. Pful bol jedným z tých beznádejne nemenných pred mučeníctvom sebavedomých ľudí, akými sú iba Nemci, a práve preto, že iba Nemci sú sebavedomí na základe abstraktnej myšlienky-vedy, teda imaginárnej znalosti dokonalej pravdy . Francúz je sebavedomý, pretože si ctí osobne, v mysli i v tele, neodolateľne očarujúci pre mužov i ženy. Angličan je sebavedomý s odôvodnením, že je občanom najprosperujúcejšieho štátu na svete, a preto ako Angličan vždy vie, čo potrebuje urobiť, a vie, že všetko, čo ako Angličan robí, je nepochybne nepochybne dobre. Talian je sebavedomý, pretože je rozrušený a ľahko zabúda na seba aj na ostatných. Rus je sebavedomý práve preto, že nič nevie a ani vedieť nechce, pretože neverí, že by človek mohol úplne niečo vedieť. Nemec je zo všetkých najhoršie sebavedomý a zo všetkých najťažší a najhnusnejší, pretože si predstavuje, že pozná pravdu, vedu, ktorú sám vynašiel, ale ktorá je pre neho absolútnou pravdou. Taký bol očividne Pful. Mal vedu - teóriu šikmého pohybu, ktorú odvodil z histórie vojen Fridricha Veľkého a zo všetkého, s čím sa stretol v r. nedávna história vojny Fridricha Veľkého a všetko, s čím sa stretol v moderných vojenských dejinách, sa mu zdalo nezmyslom, barbarstvom, škaredým stretom, v ktorom bolo na oboch stranách urobených toľko chýb, že tieto vojny sa nedali nazvať vojnami: nehodili sa teória a nemohol slúžiť ako predmet vedy.
V roku 1806 bol Pful jedným z autorov plánu vojny, ktorá sa skončila Jenou a Auerstetom; ale vo výsledku tejto vojny nevidel ani najmenší dôkaz o nesprávnosti jeho teórie. Naopak, odchýlky od jeho teórie boli podľa jeho názoru jediným dôvodom celého zlyhania a so svojou charakteristickou radostnou iróniou povedal: „Ich sagte ja, daji die ganze Geschichte zum Teufel gehen wird“. [Napokon som povedal, že celá vec pôjde do pekla (nemčina)] Pful bol jedným z tých teoretikov, ktorí svoju teóriu tak milujú, že zabúdajú na cieľ teórie - jej aplikáciu v praxi; v láske k teórii nenávidel všetku prax a nechcel to vedieť. Dokonca sa radoval zo zlyhania, pretože zlyhanie, ktoré vyplynulo z odklonu od teórie v praxi, mu dokázalo iba platnosť jeho teórie.
S princom Andrejom a Černyševom povedal pár slov o skutočnej vojne s výrazom muža, ktorý vopred vie, že všetko bude zlé a že s tým nie je ani nespokojný. Zvlášť veľavravne to potvrdzovali neupravené strapce vlasov, ktoré trčali v zátylku a narýchlo zliezané spánky.
Vošiel do ďalšej miestnosti a odtiaľ sa okamžite ozvali basy a reptanie jeho hlasu.

Kým mal princ Andrey čas vidieť Pfula očami, gróf Bennigsen rýchlo vošiel do miestnosti a bez prerušenia prikývol Bolkonskému, vošiel do kancelárie a vydal niekoľko príkazov svojmu pobočníkovi. Panovník ho nasledoval a Bennigsen sa ponáhľal dopredu niečo pripraviť a stihnúť sa so suverénom stretnúť. Chernyshev a princ Andrey vyšli na verandu. Panovník, vyzerajúci unavene, zosadol z koňa. Markíz Paulucci povedal niečo cisárovi. Cisár sklonil hlavu doľava a s nevôľou počúval Paulucciho, ktorý hovoril obzvlášť horlivo. Cisár vykročil vpred, zrejme chcel ukončiť rozhovor, ale začervenaný, rozrušený Talian, zabúdajúc na slušnosť, ho nasledoval a pokračoval v rozprávaní:
- Quant a celui qui a conseille ce camp, le camp de Drissa, [Pokiaľ ide o toho, kto radil táboru Driss,] - povedal Paulucci, zatiaľ čo panovník, ktorý vstúpil na schody a všimol si princa Andrewa, nazrel do neznámej tváre. .

UNIX-time alebo POSIX-time (anglický unixový čas)-pohodlný spôsob kódovania času, ktorý je v systéme UNIX a ďalších kompatibilných s POSIX považovaný za hlavný operačné systémy.
Samotný čas sa zaznamenáva v uplynulých sekundách od začiatku Unixovej epochy, ktorá sa začala o polnoci (UTC) od 31. decembra 1969 do 1. januára 1970. Unixový čas je v súlade s UTC, najmä pri deklarovaní priestupných sekúnd UTC - zodpovedajúce druhé čísla sa opakujú.

Tento spôsob ukladania údajov podporuje mnoho systémov a je veľmi pohodlný, napríklad dátumy sa porovnávajú s najbližšou sekundou a úložisko je kompaktné a ľahko sa prevádza do akéhokoľvek čitateľného formátu. Samozrejme, existujú nevýhody, napríklad s častým odkazom na prvky dátumu, ako je číslo mesiaca atď. Vo väčšine prípadov je však účinnosť dosiahnutá uložením dátumu ako jednej hodnoty namiesto sady polí.

Získanie UnixTime v rôznych prostrediach:

Perlčas
PHPčas ()
RubyTime.now (alebo Time.new). Na výstup: Time.now.to_i
Pythonnajskôr importujte čas, potom time.time ()
Javadlhá epocha = System.currentTimeMillis () / 1000;
Microsoft .NET C #epocha = (DateTime.Now.ToUniversalTime (). Ticks - 621355968000000000) / 10000000;
VBScript / ASPDateDiff ("s", "01/01/1970 00:00:00", Teraz ())
Erlangkalendár: datetime_to_gregorian_seconds (kalendár: now_to_universal_time (now ())) - 719528 * 24 * 3600.
MySQLSELECT unix_timestamp (now ())
PostgreSQLSELECT extrakt (epocha FROM now ());
Server SQLVYBERTE DATEDIFF (s, „1970-01-01 00:00:00“, GETUTCDATE ())
JavaScriptMath.round (new Date (). GetTime () / 1000.0) getTime () vráti čas v milisekundách.
Unix / Linuxdátum +% s
Iný OSPríkazový riadok: perl -e „čas tlače“ (ak je vo vašom systéme nainštalovaný Perl)

Ako môžem previesť pravidelný dátum na UnixTime?

PHPmktime ( sledovať, minút, sekúnd, mesiac, deň, rok)
RubyTime.local ( rok, mesiac, deň, sledovať, minút, sekúnd, usec) (alebo Time.gm pre výstup GMT / UTC). Na zobrazenie pridajte .to_i
Pythonimportujte najskôr čas, potom int (time.mktime (time.strptime ("2000-01-01 12:34:00", "% Y-% m-% d% H:% M:% S")))
Javadlhá epocha = nová java.text.SimpleDateFormat ("dd / MM / rrrr HH: mm: ss"). analyzovať ("01/01/1970 01:00:00");
VBScript / ASPDateDiff („s“, „01/01/1970 00:00:00“, dátumové pole)
MySQLVYBRAŤ unix_timestamp ( čas) Formát času: RRRR-MM-DD HH: MM: SS alebo RRRMDD alebo RRRRMMDD
PostgreSQLSELECT extrakt (epocha OD dátumu ("2000-01-01 12:34"));
S časovou pečiatkou: VYBERTE VÝŤAH (EPOCH Z ČASOVÉHO PÍSMU S ČASOVOU ZÓNOU "2001-02-16 20: 38: 40-08"); S intervalom: VYBERTE VÝŤAH (EPOCH Z INTERVÁLU "5 dní 3 hodiny");
Server SQLVYBRAŤ DATEDIFF (s, „1970-01-01 00:00:00“, dátumové pole)
Unix / Linuxdátum +% s -d "1. januára 1980 00:00:01"

Previesť späť, sekundy UnixTime na dátum čitateľný pre ľudí:

PHPdátum ( Formát, unixový čas);
RubyTime.at ( unixový čas)
Pythonimportujte najskôr čas, potom time.strftime ("% a,% d% b% Y% H% H:% M:% S +0000", time.localtime ( unixový čas)) Za dátum GMT nahraďte time.localtime s time.gmtime.
JavaDátum reťazca = nový java.text.SimpleDateFormat ("dd / MM / rrrr HH: mm: ss"). Formát (nový java.util.Date ( unixový čas*1000));
VBScript / ASPDateAdd ("s", unixový čas, "01/01/1970 00:00:00")
PostgreSQLVYBERTE ČASOPIS S ČASOVOU ZÓNOU „epocha“ + unixový čas* INTERVAL „1 sekunda“;
MySQLfrom_unixtime ( unixový čas, voliteľný, výstupný formát) Štandardný výstupný formát RRRR-MM-DD HH: MM: SS
Server SQLDATEADD (s, unixový čas, "1970-01-01 00:00:00")
Microsoft Excel= (A1 / 86400) + 25569 Výsledok bude v časovom pásme GMT. Pre ostatné časové pásma: = ((A1 +/- časový rozdiel pre zónu) / 86400) + 25569.
Linuxdátum -d @ 1190000000
Iný OSPríkazový riadok: perl -e "skalárna tlač (miestny čas ( unixový čas)) "(Ak je nainštalovaný Perl) Nahraďte„ miestny čas “výrazom„ gmtime “pre časové pásmo GMT / UTC.

Väčšina informácií je ukradnutá z:
  • UTC: Čas na hlavnom poludníku sa nazýva univerzálny koordinovaný čas. Nesúlad skratky bol spôsobený potrebou jej univerzálnosti pre všetky jazyky.
  • GMT: Predtým sa namiesto UTC používal greenwichský čas (GMT), pretože hlavný poludník bol vybraný na prechod Kráľovským observatóriom v Greenwichi.
  • Ostatné časové pásma je možné zapísať ako ofset od UTC. Napríklad austrálsky východný štandardný čas (EST) sa píše ako UTC + 1000, čo znamená, že 10:00 UTC je 20:00 EST v ten istý deň.
  • Letný čas neovplyvňuje UTC. Toto je len politické rozhodnutie zmeniť časové pásmo (posunuté od UTC). GMT sa napríklad stále používa: v zime je britský národný čas. V lete sa stáva BST.
  • Skokové sekundy: Podľa medzinárodných dohovorov nie je UTC vzdialený viac ako 0,9 sekundy od fyzickej reality (UT1, ktorá sa meria v slnečnom čase) zavedením „skokovej sekundy“ na konci poslednej minúty roka v UTC alebo na poslednú minútu Jún.
  • Prestávky nie sú povinné (astronómovia) oznamovať viac ako 6 mesiacov pred ich zavedením. Je to problém, ak potrebujete akékoľvek plánovanie s jednosekundovou presnosťou na viac ako 6 mesiacov.
  • Unixový čas: Merané počtom sekúnd od „epochy“ (začiatok roku 1970 UTC). Na unixový čas nemajú vplyv časové pásma ani letný čas.
  • Podľa štandardu POSIX.1 má unixový čas zvládnuť priestupné sekundy opakovaním predchádzajúcej sekundy, napríklad: 59,00 59,25 59,50 59,75 59,00 ← opakovať 59,25 59,50 59,75 00,00 ← prírastok 00,25 Toto je kompromis: nemôžete vyjadriť žiadnu prestupnú sekundu vo vašich systémových hodinách a váš čas pôjde zaručene na opačná strana... Na druhej strane, každý deň má presne 86 400 sekúnd a nepotrebujete tabuľku všetkých minulých a budúcich priestupných sekúnd na premenu času v systéme Unix na hodiny, minúty a sekundy čitateľné pre ľudí.
  • Predpokladá sa, že ntpd sa bude pokúšať znova po prijatí skokových bitov z upstream časových serverov, ale tiež som videl, že to nič nerobí: systém ide jednu sekundu do budúcnosti a potom sa pomaly vkráda späť do správneho času.

Čo by mal každý programátor vedieť o čase

  • Časové pásma sa vzťahujú na úroveň prezentácie
    Väčšina vášho kódu by sa nemala zaoberať časovými pásmami alebo miestnym časom, mala by unixový čas míňať taký, aký je.
  • Pri meraní času zmerajte unixový čas. Toto je UTC. Je ľahké ho získať ( funkcie systému). Nemá žiadne časové pásma ani letný čas (a prestupné sekundy).
  • Keď ukladáte čas, ukladajte Unixový čas. Toto je jedno číslo.
  • Ak chcete zachovať ľudský čas čitateľný (napríklad v denníkoch), pokúste sa ho dodržať spolu s unixovým časom, nie namiesto.
  • Pri zobrazovaní času vždy zahrňte posunutie časového pásma. Formát času bez ofsetu je zbytočný.
  • Systémové hodiny nie sú presné.
  • Si online? Systémové hodiny každého iného počítača nie sú presné iným spôsobom.
  • Systémové hodiny môžu a budú skákať dopredu a dozadu v dôsledku vecí, ktoré nemôžete ovplyvniť. Váš program musí byť navrhnutý tak, aby to prežil.
  • Pomer počtu sekúnd systémové hodiny na množstvo reálny sekúnd nie je presný a môže sa líšiť. To závisí predovšetkým od teploty.
  • Nepoužívajte slepo gettimeofday (). Ak chcete monotónne (stále sa zvyšujúce) hodiny, pozrite sa na clock_gettime (). [Možnosť Java: použite System.nanoTime () namiesto System.currentTimeMillis ()]
  • ntpd môže zmeniť systémový čas dvoma spôsobmi:
    • Krok: hodinky okamžite skočia dopredu alebo dozadu na správny čas
    • Klika: Zmeňte frekvenciu systémových hodín tak, aby sa pomaly pohybovali smerom k správnemu času.
    Skrútenie je vhodnejšie, pretože je menej škodlivé, ale je užitočné iba na opravu malých rozdielov.

Špeciálne prípady

  • Čas plynie všetkým pozorovateľom rýchlosťou jednu sekundu za sekundu. Frekvencia vzdialených hodín vo vzťahu k pozorovateľovi závisí od rýchlosti a gravitácie. Hodiny vo vnútri satelitov GPS sú prispôsobené tak, aby prekonávali efekty relativity.
  • Server MySQL ukladá stĺpce DATETIME ako hodnoty zabalené v číslach „RRRRMMDD HHMMSS“ Ak vám záleží na ukladaní časových pečiatok, uložte ich ako celé číslo a na konverziu použite funkcie UNIX_TIMESTAMP () a FROM_UNIXTIME ().

Čo je to unixový čas alebo unixová epocha (unixová epocha alebo unixový čas alebo POSIX čas alebo unixová časová pečiatka)?

UNIX-time alebo POSIX-time (anglický unixový čas)-spôsob kódovania času, akceptovaný v systéme UNIX a ďalších operačných systémoch kompatibilných s POSIX.
Začiatok odpočítavania je považovaný za polnoc (UTC) od 31. decembra 1969 do 1. januára 1970, čas od tohto momentu sa nazýva „éra UNIX“ (anglická unixová epocha).
Čas UNIX je v súlade s UTC, najmä keď sú priestupné sekundy deklarované ako UTC, zodpovedajúce druhé čísla sa zopakujú.
Metóda ukladania času vo forme niekoľkých sekúnd je veľmi vhodná na použitie pri porovnávaní dátumov (presných s druhým), ako aj pri ukladaní dátumov: v prípade potreby je možné ich previesť do akéhokoľvek čitateľného formátu. Dátum a čas v tomto formáte tiež zaberajú veľmi málo miesta (4 alebo 8 bajtov, v závislosti od veľkosti strojového slova), takže je rozumné ho používať na ukladanie veľkého množstva dátumov. Nevýhody vo výkone sa môžu prejaviť veľmi častým odkazom na prvky dátumu, ako je číslo mesiaca atď. Ale vo väčšine prípadov je efektívnejšie uložiť čas ako jednu hodnotu, nie ako sadu polí.

Konvertovanie éry Unixu na dátum čitateľný pre ľudí


Dátum začiatku a konca Unixu v roku, mesiaci alebo dni


Prevod sekúnd na dni, hodiny a minúty


Ako získať unixový čas v ...

Perlčas
PHPčas ()
RubyTime.now (alebo Time.new). Na výstup: Time.now.to_i
Pythonnajskôr importujte čas, potom time.time ()
Javadlhá epocha = System.currentTimeMillis () / 1000;
Microsoft .NET C #epocha = (DateTime.Now.ToUniversalTime (). Ticks - 621355968000000000) / 10000000;
VBScript / ASPDateDiff ("s", "01/01/1970 00:00:00", Teraz ())
Erlangkalendár: datetime_to_gregorian_seconds (kalendár: now_to_universal_time (now ())) - 719528 * 24 * 3600.
MySQLSELECT unix_timestamp (now ())
PostgreSQLSELECT extrakt (epocha FROM now ());
Server SQLVYBERTE DATEDIFF (s, „1970-01-01 00:00:00“, GETUTCDATE ())
JavaScriptMath.round (new Date (). GetTime () / 1000.0) getTime () vráti čas v milisekundách.
Unix / Linuxdátum +% s
Iný OSPríkazový riadok: perl -e „čas tlače“ (ak je vo vašom systéme nainštalovaný Perl)

Konvertuje sa dátum na unixový čas na ...

PHPmktime ( sledovať, minút, sekúnd, mesiac, deň, rok)
RubyTime.local ( rok, mesiac, deň, sledovať, minút, sekúnd, usec) (alebo Time.gm pre výstup GMT / UTC). Na zobrazenie pridajte .to_i
Pythonimportujte najskôr čas, potom int (time.mktime (time.strptime ("2000-01-01 12:34:00", "% Y-% m-% d% H:% M:% S")))
Javadlhá epocha = nová java.text.SimpleDateFormat ("dd / MM / rrrr HH: mm: ss"). analyzovať ("01/01/1970 01:00:00");
VBScript / ASPDateDiff („s“, „01/01/1970 00:00:00“, dátumové pole)
MySQLVYBRAŤ unix_timestamp ( čas) Formát času: RRRR-MM-DD HH: MM: SS alebo RRRMDD alebo RRRRMMDD
PostgreSQLSELECT extrakt (epocha OD dátumu ("2000-01-01 12:34"));
S časovou pečiatkou: VYBERTE EXTRAKT (EPOCH Z ČASOVÉHO PÍSMU S ČASOVOU ZÓNOU "2001-02-16 20: 38: 40-08"); S intervalom: VYBERTE VÝŤAH (EPOCH Z INTERVALU „5 dní 3 hodiny“);
Server SQLVYBRAŤ DATEDIFF (s, „1970-01-01 00:00:00“, dátumové pole)
Unix / Linuxdátum +% s -d "1. januára 1980 00:00:01"

Konverzia unixového času na dátum čitateľný pre ľudí ...

PHPdátum ( Formát, unixový čas);
RubyTime.at ( unixový čas)
Pythonimportujte najskôr čas, potom time.strftime ("% a,% d% b% Y% H% H:% M:% S +0000", time.localtime ( unixový čas)) Za dátum GMT nahraďte time.localtime s time.gmtime.
JavaDátum reťazca = nový java.text.SimpleDateFormat ("dd / MM / rrrr HH: mm: ss"). Formát (nový java.util.Date ( unixový čas*1000));
VBScript / ASPDateAdd ("s", unixový čas, "01/01/1970 00:00:00")
PostgreSQLVYBERTE ČASOPIS S ČASOVOU ZÓNOU „epocha“ + unixový čas* INTERVAL „1 sekunda“;
MySQLfrom_unixtime ( unixový čas, voliteľný, výstupný formát) Štandardný výstupný formát RRRR-MM-DD HH: MM: SS
Server SQLDATEADD (s, unixový čas, "1970-01-01 00:00:00")
Microsoft Excel= (A1 / 86400) + 25569 Výsledok bude v časovom pásme GMT. Pre ostatné časové pásma: = ((A1 +/- časový rozdiel pre zónu) / 86400) + 25569.
Linuxdátum -d @ 1190000000
Iný OSPríkazový riadok: perl -e "skalárna tlač (miestny čas ( unixový čas)) "(Ak je nainštalovaný Perl) Nahraďte„ miestny čas “výrazom„ gmtime “pre časové pásmo GMT / UTC.

Na čo slúži nástroj „Unixtime Converter“?

Tento nástroj bude predovšetkým užitočný pre správcov webu, ktorí sa neustále zaoberajú veľkým počtom dátumov alebo vo svojej práci často odkazujú na svoje prvky. Pomocou nástroja „Unixtime Converter“ môžete jednoducho prevádzať unixový čas na užívateľsky príjemný dátum (a naopak), zistiť aktuálny epochový čas Unixu a získať unixový čas v rôznych programovacích jazykoch, DBMS a operačných systémoch.

Čo je to Unix Time?

Unixová éra (epocha Unixu) sa začala v noci z 31. decembra 1969 na 1. januára 1970. Práve tento dátum bol braný ako východiskový bod pre „počítačový“ čas, ktorý sa počíta v sekundách a zaberá veľmi málo miesta na disku - iba 4 alebo 8 bajtov. Vďaka tejto metóde kódovania môžu programátori „skryť“ ľubovoľný dátum na jedno číslo a ľahko ho previesť späť do formátu, ktorému užívatelia rozumejú.

Unixový čas (nazývaný tiež Unixový čas alebo POSIXový čas) je vhodné používať v rôznych operačných systémoch a programovacích jazykoch, pretože sa zobrazuje ako jedna hodnota a nie pre určitý počet polí, ktoré zaberajú miesto. Čas UNIX navyše plne vyhovuje štandardu UTC (vrátane priestupných rokov) - v tomto prípade sa zodpovedajúce sekundy jednoducho zopakujú.

Unixová terminológia

Niekoľko slov o podmienkach.

Takže, Unixový čas(alebo čas POSIX) je počet sekúnd, ktoré uplynuli od polnoci 1. januára 1970 do súčasnosti.

Unixová časová pečiatka(časová pečiatka) je „pevný“ čas, inými slovami konkrétny dátum označený číslom.

UTC(Univerzálny koordinovaný čas) je koordinovaný svetový čas, ktorý je "fixný" na hlavnom poludníku a z ktorého sa počítajú geografické časové pásma.

Ako „odolný“ je systém?

Za niekoľko desaťročí, konkrétne 19. januára 2038 o 03:14:08 UTC, dosiahne unixový čas hodnotu 2147483648 a počítačové systémy môže toto číslo interpretovať ako záporné. Kľúč k vyriešeniu tohto problému spočíva v použití 64-bitovej (namiesto 32-bitovej) premennej na ukladanie času. V tomto prípade bude zásoba číselných hodnôt unixového času ľudstvu stačiť na ďalších 292 miliárd rokov. Nie je to zlé, však?

Unixový čas je jeden pre všetkých

Ak žijete v Londýne alebo San Franciscu a vaši priatelia sú v Moskve, potom môžete „synchronizovať hodinky“ pomocou unixového času: tento systém je v tento momentčas je jeden pre celý svet. Prirodzene, ak je čas na serveroch nastavený správne. A s nástrojom "Prevodník Unixtime" táto konverzia vám zaberie zlomok sekundy.

Len pre čitateľov Lifeexample je možné otvoriť internetový obchod na Moguta.CMS so zľavou 15%

Unix Time a Unix Timestamp (MySQL, PHP, JavaScript)

Dobrý deň, milí čitatelia blogov, v tomto článku vám chcem povedať o tom, čo je Unixový čas a Unixová časová pečiatka... Programátori často spájajú tieto koncepty do jedného, ​​ale nie je to celkom pravda. Okrem toho článok obsahuje mnoho užitočných poznámok k téme práce s Unix Timestamp v PHP, MySQL a JavaScript.

Prečo sa Unix Time začína 1. januára 1970

Ide o to, že unixový čas začína počítať éru Unixu s vydaním prvého systému UNIX. Prvý systém tohto druhu bol vytvorený v roku 1969, takže vývojári vzali dátum od 1. januára 1970 o polnoci UTC ( UTC).

Poďme pochopiť, na čo slúžia Unix time a Unix Timestamp a dajte im jasné koncepty.

Unixová časová pečiatkaJe časová pečiatka, ktorá je sekvenciou znakov predstavujúcich počet sekúnd, ktoré uplynuli od 1. januára 1970.

Pokúsim sa uviesť príklad na objasnenie rozdielu medzi týmito dvoma pojmami.

V čase, keď som to písal, Unixový čas bolo to rovnocenné 1346765877 .

V čase čítania tejto informácie vami zaznamenaným časom ( 1346765877 ) je už štítok - Unixová časová pečiatka! Prevodom tejto časovej pečiatky do čitateľnej podoby získame dátum 04-09-2012 a čas 17:37:57.

Úprimne povedané, podľa mňa neexistuje osobitný zmysel pre oddelenie týchto dvoch pojmov, ale stále je užitočné mať predstavu o tom, čo predstavuje Unixový čas a je tiež užitočné pochopiť, že počet maximálnych možných sekúnd od roku 1970 má limit!

Koniec éry Unixu príde v roku 2038

Fakt: maximálne binárne číslo v 32 bitových systémoch je číslo 01111111 11111111 11111111 11111111 prepočtom na desatinnú sústavu dostaneme číslo 2147483647.

19. januára 2038 o 03:14:08 príde chvíľa, keď počet sekúnd, ktoré uplynuli od začiatku éry Unixu, prekročí maximum dostupné v 32-bitovom systéme, číslo = 2147483647. Ak bit pretečie, dátum bude resetovať.

Je veľmi jednoduché otestovať túto teóriu na názornom príklade:

  • Otvorte štandardnú kalkulačku systému Windows, stlačte kombináciu klávesov ALT + 3, čím sa prevedie na technické zobrazenie;
  • Nastavte režim 4 bajtov a typ desatinného vstupu;
  • Napíšte číslo 2147483647;

  • Všimnite si binárnej reprezentácie čísla;
  • Pridajte k číslu jednu;

  • Sčítanie bude mať za následok záporné číslo!

Ak budeme pokračovať v pridávaní jedného, ​​potom dostaneme cyklický uzáver.

K tomuto druhu vyzváňania dátumu dôjde od 19. januára 2038 na všetkých systémoch využívajúcich 32-bitovú architektúru.

V skutočnosti nie je potrebné smútiť, pretože vývojári výpočtové systémy stále viac a viac zavádza 64-bitové architektúry do širokého používania. Verme, že do roku 2038 budú včas.

Teraz sa porozprávajme o použití časovej značky unix v php, mysql a dokonca aj v javascript.

Práca s časovou pečiatkou Unixu

Veľmi dôležitým bodom pri práci s časovou pečiatkou Unixu v php alebo mysql je potreba jasne porozumieť výhodám a nevýhodám tohto formátu dátumu.

Napríklad, ČASOVÁ ZNAČKA nemožno použiť na špecifikovanie historických udalostí alebo udalostí vzdialenej budúcnosti. Celý súbor dátumov je obmedzený na obdobie od roku 1970 do začiatku roku 2038. Ak nastavíte dátum po roku 2038, nebude ho 32 -bitový systém interpretovať správne.

Po uvedomení si tohto obmedzenia vzniká logická otázka: „ Prečo sa namáhate so zobrazovaním dátumu v sekundách?"

Kedy používať časovú pečiatku Unixu

Na reprezentáciu času v našom obvyklom systéme merania je potrebných 8 bajtov a pre časovú pečiatku Unixu je to polovica - 4 bajty.

Úspora množstva údajov je podľa mňa hlavným a nespochybniteľným plusom pri používaní Unix Time.

Pri práci s nimi je navyše k dispozícii množstvo užitočných nuancií Časová pečiatka UNIX v mysql... A pretože všetky informácie musia byť uložené na databázovom serveri, a to má zase niekoľko výhod pri práci s časovými pečiatkami Unixu, výber smerom k časovej pečiatke Unixu možno správne odôvodniť nasledujúcimi ustanoveniami.

MySQL poskytuje vhodný dátový typ časovej pečiatky pre prácu s unixovým formátom, pričom nastavenie, ktoré okamžite získame užitočnú výhodu oproti štandardným formátom DÁTUM a DÁTUM ČAS... Výhodou je, že vykonaním operácie pridania nový vstup do tabuľky sa stĺpec s týmto typom údajov vyplní automaticky. To znamená, že môžeme ušetriť nielen na množstve dát, ale aj na procesorovom čase webového servera.

Aby sme slovo posilnili činmi, nastavili sme nasledujúcu úlohu: pri registrácii nového používateľa do systému musíte zadať dátum jeho pridania do databázy.

Ak je typ poľa uchovávajúceho dátum v tabuľke DÁTUM ČAS, potom žiadosť od Skript PHP bude vyzerať asi takto:

Výhody sú zrejmé!

Existuje aj mínus: ak existuje niekoľko polí TIMESTAMP, automaticky sa aktualizuje iba prvé.

Má zmysel používať INT namiesto časovej pečiatky

Mnoho programátorov používa pri práci s časovou značkou Unix celočíselný formát int (11). Toto je úplne nerozumný prístup k otázke, pretože MySQL poskytuje pre typ časovej pečiatky mnoho užitočných funkcií, ktoré ovplyvňujú rýchlosť práce s ňou. Uložením časovej pečiatky do INT sa preto pripravujeme o všetku podporu servera pre tento formát. To je zhruba rovnaké ako ukladanie id do typu varchar (11).

Existuje však jedna výhovorka na zachovanie časová pečiatka Unixu na INT... Pri prenose databázy medzi rôznymi DBMS môže dôjsť ku konfliktu typov, t.j. pre jeden z DBMS nemusí byť typ časovej pečiatky známy. V tomto prípade bude mať použitie int prednosť od tento formát je vo všetkých DBMS.

Stručná charakteristika typov kalendárov MySQL

ČASOVÁ ZNAČKA- typ údajov na ukladanie dátumu a času. Údaje sú uložené ako počet sekúnd od začiatku „éry Unixu“. Rozsah hodnôt je 1970-01-01 00:00:00-2038-12-31 00:00:00. Trvá to 4 bajty.

DÁTUM- typ údajov na uloženie dátumu. Rozsah hodnôt je 1000-01-01 až 9999-12-31. Trvá to 3 bajty.

DÁTUM ČAS- typ údajov na ukladanie dátumu a času. Rozsah hodnôt je 1000-01-01 00:00:00-9999-12-31 00:00:00. Zaberá 8 bytov a je uložené ako číslo RRRRMMDDHHMMSS./p>

ROK- typ údajov na uloženie roku. Rozsah hodnôt je 1901 - 2155. Zaberá 1 bajt.

ČAS- dátový typ na ukladanie času. Rozsah je −828: 59: 59 - 828: 59: 59. Trvá to 3 bajty.

Preklad dátumu v unixe

Je čas rozložiť niekoľko užitočných funkcií na preklad dátumu do časová pečiatka unixu a späť z unixový čas v čitateľnom termíne.

Ako získať aktuálny čas v systéme UNIX

  • PHP:

    čas ();

  • JavaScript:

    Math.round (nový dátum () .getTime () / 1000,0);

  • MySQL:

    VYBRAŤ unix_timestamp (now ());