What time(zone) it is? (TZ enviro)

Egyszerűbben mondva, egy kis kompatibilitási kérdés: ha van egy fájlunk, aminek a dátuma 2016-10-30 00:30:00 UTC, akkor milyen időt ír a 'ls' a 'TZ' függvényében (no meg persze az OS(pl AIX) verzió függvényében). Annyit előrebocsátok, hogy 01:00 UTC-kor kellene legyen az átállítás, tehát az a dátum még nyáriidő-beli.


$ TZ=CET-1CEST,M3.5.0,M10.5.0 ls -l ~/tmp/utc30-00:30
Oct 30 01:30 /home/projects/tmp/utc30-00:30

$ TZ=CET-1CEST,M3.5.0/2,M10.5.0/3 ls -l ~/tmp/utc30-00:30
Oct 30 02:30 /home/projects/tmp/utc30-00:30

$ TZ=Europe/Budapest ls -l ~/tmp/utc30-00:30
Oct 30 02:30 /home/projects/tmp/utc30-00:30

Hozzászólások

A `man timezone` szerint ez alapjaraton jo igy mert a /time erteke alapertelmezesben 2. Azaz a legelso peldad az TZ=CET-1CEST,M3.5.0,M10.5.0/2-vel egyenerteku. Azaz ebben az olvasatban a visszaallitas 2 ora helyi idoben tortenik:

The time fields specify when, in the local time currently in effect, the change to the other time occurs

Ami 02:00 CEST (00:00 UTC).

Köszi, így már értem, akkor minden oké.

Mondjuk minden, kivéve az AIX-aink beállításait, crond-t is ideértve. (Vagyis amit 01:59-re tettem, nehogy kétszer fusson, azt kétszer futtatta.)

6-ostól jó lesz az Europe/Budapest, 5-ösre meg a POSIX-os hosszabbik forma.

Na persze az igazi az lenne, hogy ha összevissza is lépegetek ssh-val mindenféle rendszerek között, végig vihessem magammal a kliensen (pl Putty) beállított TZ-met.

Magyarul mondva utána kellene néznem, hogy lehet Olson(timezone/zoneinfo)-adatbázist telepíteni AIX5.3-ra. (Illetve bővíteni a meglévő Budapest-telent.)

Belefutottál abba a kis anomáliába, hogy nálunk UTC 1:00 az átállás ideje. (második példa)
Ha nem specifikálod, akkor az USA szabálya lép érvénybe: Az átállás ideje localtime szerint megy.
Ez van, amikor nem magyar, hanem amerikai oprendszert használsz. :D

A kétféle TZ beállítást tesztelheted az alábbi programmal:

/* filename ttest.c */
#include <stdio.h>
#include <time.h>
#define WStart 1256427000
/* tavaszi */
/* #define WStart 1269732600 */
 
main()
{
    char DBuf[100];
    int ix;
    int Time;
    int i=0;
    while ( i<26 )
    {
        Time=WStart+300*i++;
        DBuf[ix=strftime(DBuf,30,"%Y.%m.%d %T",gmtime(&Time))]='-';
        strftime(DBuf+ix+1,30,"%Y.%m.%d %T",localtime(&Time));
        puts(DBuf);
    }
}

Köszi, én is ilyesféléket tákoltam-bákoltam, hogy pl.


$ TZ=Europe/Budapest istat -lt -utc ~projects/tmp/utc30-00:30 
stat /home/projects/tmp/utc30-00:30:
...
        acc:   20161030.003000.000000000 UTC
        acc:   20161030.003000.000000000 LT
...

Na ez pl egy AIX 5.3, ami nem használ Olson adatbázist, tehát felesleges is odatenni egy Europe/Budapest file-t, nem segít semmit.


$ TZ=CET-1CEST,M3.5.0/2,M10.5.0/3 istat -lt -utc ~projects/tmp/utc30-00:30 
stat /home/projects/tmp/utc30-00:30:
...
        acc:   20161030.003000.000000000 UTC
        acc:   20161030.023000.000000000 LT
...

Na ez jobb. Persze ettől még nem fogja tudni, hogy Magyarországon 1916-ban mi volt... De jobb, mint a semmi.

A crontab-gondomra meg a következő "elegáns" megoldást találtam:


00 00 * * * sleep 7140; /home/projects/somedir/bin/someproc.sh

Ez az Europe/Budapest valamilyen desktopos úri huncutság lehet.
Amíg meg nem változtatják, addig az NFT-1DST is ugyanúgy helyes. Ismerve az "amerikai szabályt" a /2 is felesleges, mivel az lt-kor van.

Ha elfogadsz egy jótanácsot (halmazt): A crontab a gyengék végső menedéke. ;)
Ha egy programnak fontos az idő, akkor dolgozzon vele és ne bízza a crontabra. A gép összeroskadását elkerülendő nem indítunk mindent 0 órakor és gondosan kikerűljük az óraállítás környékét! Ha ezek után még mindig megoldhatatlan a feladat, akkor utc-t kell használni. Az utóbbit néha alkalmaztam pl. hívásadat gyűjtésekor.

Az 1916-os kérdés még költőinek is rossz. Egy alkalmazás soha nem használ TZ-t, mert az idő az adatok között van. Ugyanúgy LANG-ot sem használ, mert az meg az alkalmazás env része. És külöben is AIX alatt a lang mindig C!

Nem is tréfából írtam le a véleményemet a crontabról. Ezeket a köröket már több mint 20 éve lefutottam. Méghozzá számlázó és tarifáló rendszereknél. A crond env volt a kezdet, a végeredmény meg annyi, hogy igazából a cron pl. a munkaidőn kívüli tmp takarításra megfelel. Ráadásul akkoriban cserélték AIX alatt a cron-t.
Ennek ellenére a programjaim használnak crontabot. Minden esetben maga a program szerkeszti meg az új sor(oka)t, de nem használom kritikus és/vagy pontos idő megjelölésére.
Elolvastam a linket. Nem is értem. A crond egy program, ami indításkor a rendszeridőt használja. Minden ettől eltérő rafináltságot számítani kell egy saját/másik programmal. A TZ továbbra is a login env része. Ezt kell helyesen beállítani. A többi meg adat és számolni kell vele, de az adatoknak meg nincs köze a környezethez.

Ha egy programnak fontos az idő, akkor dolgozzon vele és ne bízza a crontabra.
+1

Raadasul a sima ido kezeles (gettimeofday() et al.) sem egyszeru a szokomasodpercek miatt... nem egyszeru az elet :)

Egy alkalmazás soha nem használ TZ-t, mert az idő az adatok között van.
+1. Najo, +0.98, mert vegulis irathatsz ki idopontokat barmilyen zonaban... amennyiben annak az ertelmezese a juzerre van bizva :]

Kieg: az AIX nem Olsont használ, hanem saját adatbázisformátumot, tehát nem segít, ha akár a legújabb Olsont is feltelepítem.