Mám server spuštěný s časovým pásmem nastaveným na UTC
. Zdálo se, že to byl obecně dobrý postup (pokud se mýlím, opravte mě).
Každopádně jeden ze serverů, ke kterým se připojuji, za účelem scp
soubory, běží na EDT
a ukládá soubory, které potřebuji zkopírovat, ve formátu /path/to/filename/data20120913
Podíval jsem se na pokus o rsync
soubory pomocí něčeho jako find -mtime -1
příznak pro soubory upravené za poslední den, ale neměl jsem štěstí.
Nevadí mi používat scp
zkopírovat soubor aktuálního dne, ale právě teď je k dispozici 4hodinové okno, ve kterém běží date +%Y%m%d
na každém serveru dá jiný den a to mě trochu štve.
Podívejte se na man date
Vidím, že mohu mít výstup času jako UTC
, ale nevidím způsob, jak to nechat vystupovat jako jiné časové pásmo, jako je EDT
Předpokládám, že bych také mohl použít něco jako GNU
přípona data date -d 20100909 +%s
chcete-li získat datum v sekundách od epochy, použijte ruční 4 * 60 * 60
druhý výpočet a podívejte se na to, jak to vykreslit jako datum – ale až nastane letní čas, bude to ještě hodinu pryč.
Existuje jednodušší způsob, jak vydat datum ve formátu YYYYMMDD
formát pro EDT
na serveru, který je nastaven na UTC
?
Přijatá odpověď:
Můžete nastavit časové pásmo pro dobu trvání dotazu, takto:
TZ=America/New_York date
Všimněte si mezery mezi TZ
nastavení a date
příkaz. Ve stylu Bourne a rc
-jako shell, který nastavuje TZ
proměnná pouze pro příkazový řádek. V jiných shellech (csh
, tcsh
, fish
), můžete vždy použít env
místo toho příkaz:
env TZ=America/New_York date
tl;dr
Na systémech Linux. časová pásma jsou definována v souborech v /usr/share/zoneinfo
adresář. Tato struktura je často označována jako „databáze Olson“ na počest jejího zakládajícího přispěvatele.
Pravidla pro každé časové pásmo jsou definována jako řádky textového souboru, které jsou poté zkompilovány do binárního souboru. Takto zkompilované řádky definují název zóny; rozsah dat a čas, během kterého zóna platí; offset od UTC pro standardní čas; a označení pro definování způsobu přechodu na letní čas az něj, je-li to vhodné.
Například adresář „Amerika“ obsahuje požadované informace pro New York v souboru America/New_York
jak se používá výše.
Pozor, specifikace neexistující zóny (název souboru) je tiše ignorována a jsou hlášeny časy UTC. Například toto hlásí nesprávný čas:
TZ="America/New York" date ### WRONG ###
Jednotná specifikace UNIX, verze 3, známá jako SUSv3 nebo POSIX-2001, uvádí, že pro přenositelnost by řetězec znaků, který identifikuje popis časového pásma, měl začínat dvojtečkou. Můžeme tedy také psát:
TZ=":America/New_York" date
TZ=":America/Los_Angeles" date
Jako alternativní metodu ke specifikaci časových pásem pomocí názvu cesty k souboru popisu popisuje SUSv3 model POSIX. V tomto formátu je řetězec definován jako:
std offset [dst[offset][,start-date[/time],end-date[/time]]]
kde std
je standardní název komponenty a dst
je letní čas. Každé jméno se skládá ze tří nebo více znaků. offset
je kladná pro časová pásma západně od nultého poledníku a záporná pro časová pásma na východ od poledníku. Posun je přidán k místnímu času, aby se získal UTC (dříve známý jako GMT). start
a end
časová pole označují, kdy nastanou přechody mezi standardním a denním světlem.
Například ve východních Spojených státech je standardní čas o 5 hodin dříve než UTC a můžeme zadat EST5EDT
místo America/New_York
. Tyto alternativy však nejsou vždy uznávány, zejména pro zóny mimo Spojené státy, a je lepší se jim vyhnout.
HP-UX (SUSv3 kompatibilní UNIX) používá textová pravidla v /usr/lib/tztab
a názvy POSIX jako EST5EDT, CST6CDT, MST7MDT, PST8PDT. Soubor obsahuje všechna historická pravidla pro každé časové pásmo, podobně jako Olsonova databáze.
POZNÁMKA: Měli byste být schopni najít všechna časová pásma prohlédnutím následujícího adresáře:/usr/share/zoneinfo
.