GNU/Linux >> Znalost Linux >  >> Linux

Jak zajistit, aby „datum“ vydalo čas z jiného časového pásma?

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.

Související:Excel – předpověď budoucího data na základě průměrného počtu dní mezi proměnným počtem dat v minulosti?

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 .


Linux
  1. Jak synchronizovat datum a čas z příkazového řádku v Ubuntu

  2. Jak nastavit proměnnou rovnou výstupu z příkazu v Grub2?

  3. Jak zabránit `ls` v třídění výstupu?

  1. Jak sledovat čas z příkazového řádku?

  2. Nastavte datum, čas a časové pásmo na serveru Linux

  3. CentOS / RHEL :Jak získat datum a čas provedeného příkazu ve výstupu příkazu historie

  1. Jak zkontrolovat časové pásmo v Linuxu

  2. Jak udělat Ls a pak seřadit výsledky podle data vytvoření?

  3. Jak získáte aktuální čas na serveru?