Як я можу "дата" виводити час з іншого часового поясу?


115

У мене працює сервер із встановленим часовим поясом UTC. Здавалося, що це взагалі добра практика (будь ласка, виправте мене, якщо я помиляюся).

Так чи інакше, один із серверів, до яких я підключаюсь, для scpфайлів працює EDTі зберігає файли, які мені потрібно скопіювати у формат/path/to/filename/data20120913

Я переглянув спробу rsyncфайлів, використовуючи щось на зразок знаходження пошуку -mtime -1для файлів, змінених за останній день, але мені не пощастило.

Я не проти просто scpскопіювати файл поточного дня, але на сьогоднішній день є 4-годинне вікно, де запуску date +%Y%m%dдасть інший день на кожному сервері, і це мене мало помиляє.

Переглядаючи, man dateя бачу, що я можу мати вихідний час як UTC, але я не бачу способу вивести його як інший часовий поясEDT

Я припускаю, що я міг би також скористатися чимось на зразок GNUпродовження дати, date -d 20100909 +%sщоб отримати дату в секундах від епохи, застосувати 4 * 60 * 60другий вручну обчислення і побачити, як відобразити це як дату, але тоді, коли денний час наступить у ній, все одно буде година відсутня .

Чи є більш простий спосіб вивести дату у YYYYMMDDформаті для EDTна встановленому сервері UTC?


EDT не є визнаним часовим поясом - принаймні в Linux. Дивіться мою "Будьте обережні!" відповідь нижче на всю негарну історію. Якщо EDT розпізнається у вашій марці * NIX, ви все одно повинні проявляти обережність і двічі перевірити рядок часового поясу.
Майк S

Відповіді:


175

Ви можете встановити часовий пояс для тривалості запиту, таким чином:

TZ=America/New_York date

Зауважте пробіл між TZналаштуваннями та dateкомандою. У rcоболонці Борна та-подібній оболонці, яка встановлює TZзмінну лише для командного рядка. В інших оболонках ( csh, tcsh, fish), ви завжди можете використовувати envкоманду замість:

env TZ=America/New_York date

тл; д-р

На системах Linux. часові пояси визначаються у файлах /usr/share/zoneinfoкаталогу. Ця структура часто називається "база даних Ольсона", щоб вшанувати свого засновника.

Правила для кожного часового поясу визначаються як рядки текстових файлів, які потім компілюються у двійковий файл. Рядки, складені так, визначають назву зони; діапазон даних та час, протягом яких застосовується зона; зміщення від UTC за стандартний час; і позначення для визначення того, як відбувається перехід на літній час і з нього, якщо це застосовно.

Наприклад, каталог "Америка" містить необхідну інформацію для Нью-Йорка у America/New_Yorkвикористаному вище файлі .

Будьте уважні, що специфікація неіснуючої зони (назва файлу) мовчки ігнорується і повідомляється час UTC. Наприклад, це повідомляє про неправильний час:

TZ="America/New York" date ### WRONG ###

Єдина специфікація UNIX, версія 3, відома як SUSv3 або POSIX-2001, зазначає, що для портативності символьна рядок, що ідентифікує опис часового поясу, повинна починатися з символу двокрапки. Таким чином, ми також можемо написати:

TZ=":America/New_York" date
TZ=":America/Los_Angeles" date

Як альтернативний метод специфікації часових поясів з використанням імені шляху до файлу опису, SUSv3 описує модель POSIX. У цьому форматі рядок визначається як:

std offset [dst[offset][,start-date[/time],end-date[/time]]]

де stdстандартна назва компонента і dstє літній час. Кожне ім’я складається з трьох і більше символів. offsetПозитивно для часових поясів до захід від меридіана і негативне для тих до схід від меридіана. Зсув додається до місцевого часу, щоб отримати UTC (раніше відомий як GMT). startІ endполя часу вказують , коли відбуваються стандарт / денного світла переходи.

Наприклад, у Східних Штатах стандартний час на 5 годин раніше, ніж UTC, і ми можемо вказати EST5EDTзамість цього America/New_York. Ці альтернативи не завжди визнаються, особливо для зон поза межами США і їх найкраще уникати.

HP-UX (UNIX), сумісний з SUSv3, використовує текстові правила /usr/lib/tztabта назви POSIX, такі як EST5EDT, CST6CDT, MST7MDT, PST8PDT. Цей файл містить усі історичні правила для кожного часового поясу, схожі на базу даних Олсона.

Примітка: Ви повинні бути в змозі знайти всі часові пояси, перевіривши наступний каталог: /usr/share/zoneinfo.


не впевнений, чи я помиляюся, але exportвиглядає краще за envкоманду
вставте

@JRFerguson - Якщо часовий пояс не включений до списку, наприклад, Лас-Вегас чи Невада, які існують альтернативи для перевірки часу?
Мотивовано

@ Мотивовано Якщо ваше місто чи штат не включені, виберіть той, який використовує ту саму інформацію про зону, що і ваша. Наприклад, я перебуваю у Флориді, де використовується той же часовий пояс, що й Нью-Йорк, тому мої машини синхронізуються з нью-йоркським часом.
JRFerguson

1
@JRFerguson - це передбачає, що людина знає про різні часові пояси і може використовувати альтернативу, наприклад, Нью-Йорк у вашому випадку. Це був би єдиний варіант? Наприклад, я не живу в Європі і не знаю часових поясів, що перетинаються.
Мотивовано

1
@ Мотивований Ви можете використовувати щось на зразок цього веб-сайту, щоб допомогти вам знайти інші точки у вашій зоні.
JRFerguson

33

Це можна зробити, маніпулюючи TZзмінною середовища. Нижче наведено місцевий час для США / Схід, який також буде досить розумним для обробки DST, коли він котиться навколо:

# all on one line
TZ=":US/Eastern" date +%Y%m%d

Назва зони походить від файлів і каталогів всередині /usr/share/zoneinfo.


17

Будь обережний! Дата з радістю випльовує час у поточному часовому поясі, якщо ви надаєте йому часовий пояс, який він не розпізнає.

Перевір це:

-bash-4.2$ env TZ=EDT date
Wed Feb 18 19:34:41 EDT 2015
-bash-4.2$ date
Wed Feb 18 19:34:43 UTC 2015

Зауважте, що немає часового поясу під назвою EDT. Власне кажучи,

-bash-4.2$ find /usr/share/zoneinfo -name "*EDT*"

повертає

/usr/share/zoneinfo/EST5EDT
/usr/share/zoneinfo/posix/EST5EDT
/usr/share/zoneinfo/right/EST5EDT

І це працює:

-bash-4.2$ TZ=EST5EDT date
Wed Feb 18 14:36:59 EST 2015
-bash-4.2$ date
Wed Feb 18 19:37:01 UTC 2015

Однак, якщо ваш друг живе в містичній землі Гобблдигука, і інформація про його зону збігається з вашою власною, ви можете мати дату виведення часу в зоні Гобблдигука, і він буде радий зробити це з значенням виходу, щоб повідомити, що зона йому не відома:

-bash-4.2$ TZ=Gobbledygook date
Wed Feb 18 19:37:36 Gobbledygook 2015
-bash-4.2$ echo $?
0

YMMV: у вікні MacOS / BSD неправильно сформована TZрядок повертає час UTC.
Марк Хадсон


6

Дата синтаксис аркана та схильні до помилок, що робить командний рядок виклик болю. Тому я написав невеликий сценарій (я назвав його worldtime ), який буде друкувати вказаний (або поточний) час із зом базового часу (ваш локальний) в деяких інших часових поясах і навпаки.

Ось. Відрегулюйте його відповідно до ваших потреб, поставте його на свій шлях і зробіть його виконуваним.

#! / бін / ш
#
# Друк заданого (або поточного) часу з базового часу в інших часових поясах
# і навпаки
#

# Базовий часовий пояс з / в який потрібно конвертувати
TZBASE = Європа / Афіни

# Часові пояси для відображення
# Див. / Usr / share / zoneinfo / для отримання додаткових імен
TZONES = 'UTC Америка / Лос-Анджелес Америка / Нью-Йорк Європа / Лондон Європа / Париж'

# Формат відображення
FORMAT = '% H:% M (% p)% Z% a% m% b% Y'

if ["$ 1"]; тоді
  час = "$ 1"
ще
  час = `дата +% T`
фі

# Показати час із вказаного вхідного часового поясу у вказаному виході
# часовий пояс
показ часу ()
{
  TZIN = 1 долар
  TZOUT = $ 2

  TZ = $ TZOUT дата --date = 'TZ = "' $ TZIN '" "" $ time "+" $ time $ TZIN - $ TZOUT $ FORMAT "
}

для тз в $ TZONES; робити
  showtime $ TZBASE $ tz
зроблено

відлуння

для тз в $ TZONES; робити
  показ часу $ tz $ TZBASE
зроблено


3

Часто у вас є мітка часу в локальному часовому поясі, і вам потрібно перетворити її у віддалений tz. Це можна зробити за допомогою:

TZ=America/Curacao date -d 'Tue Nov 28 00:07:05 MSK 2016'

де:

America/Curacao - remote timezone
MSK - local timezone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.