Для чего полезен %z в дате GNU?

Это не имеет ничего общего с sftp. Вам просто нужны определенные разрешения, установленные для нужного каталога. Вы можете использовать atдля постановки в очередь действия ожидания, например. чтобы снова изменить разрешения через некоторое время.

1
11.02.2021, 23:03
1 ответ

Команда date довольно проста (на первый взгляд ). Но может стать более сложным, если вы немного глубже заглянете в его структуру значений.

Простейшая команда даты требует ввода «момент времени» и печатает значение «момент времени» (с дополнительными изменениями в соответствии с запрошенным форматом ). Если бы мы полагались на формат вывода по умолчанию, мы могли бы сделать:

$ from='2020-08-11T03:02'

$ date -d "$from"

Tue 11 Aug 2020 03:02:00 AM EDT

Это предполагает, что локальный набор в компьютере находится в New_York. И эта дата будет использовать TZ по умолчанию, установленную как для ввода, так и для вывода.

Или явно:

TZ="America/New_York" date -d "$from"
Tue 11 Aug 2020 03:02:00 AM EDT

Это та же дата, что и для ввода from='2020-08-11T03:02', поскольку дата применяет установленную TZ как к вводу, так и к выводу, если нет дополнительной информации.

Но входная строка может быть (также ), записанной как:

from='2020-08-11T07:02 +0000' # Please note the 7 (instead of 3).

Тот же самый момент времени, как если бы пользователь смотрел на время в формате UTC.

$ TZ="America/New_York" date -d "$from"
Tue 11 Aug 2020 03:02:00 AM EDT

И та же команда выдает то же значение времени в Нью-Йорке, что и раньше, но входное значение было другим. Это могло быть местное время кого-то в Индии :

.
$ from='2020-08-11T12:32+0530'

$ TZ="America/New_York" date -d "$from"

Tue 11 Aug 2020 03:02:00 AM EDT

Что приводит к тому же значению и «моменту времени» в Нью-Йорке.

Чтобы получить локальную строку , использованную выше, вам нужен формат %z:

.
from='2020-08-11T12:32+0530';TZ="Asia/Kolkata" date -d "$from"
Tue 11 Aug 2020 12:32:00 PM IST

from='2020-08-11T12:32+0530';TZ="Asia/Kolkata" date -d "$from" +'%c %z'
Tue 11 Aug 2020 12:32:00 PM IST +0530

Который все тот же "момент времени" в Нью-Йорке:

from='2020-08-11T12:32+0530';TZ="America/New_York" date -d "$from" +'%c %z'
Tue 11 Aug 2020 03:02:00 AM EDT -0400

Это одно из применений формата %z.

Дело в том,:что строка времени не уникальна, если она также не содержит значение «часового пояса», используемого для генерации такой строки времени.

База данных Олсона

Я использовал числовые значения выше для часового пояса :from='2020 -08 -11T12 :32+0530'

Но также возможно (и рекомендуется )использовать базу данных Олсона значения:

from='TZ="Asia/Kolkata" 2020-08-11T12:32'; 

TZ="America/New_York" date -d "$from" +'%c %z'

Tue 11 Aug 2020 03:02:00 AM EDT -0400

Значения в базе данных Olsen не меняются в зависимости от «летнего времени». Он не меняется с EST на EDT в «Нью-Йорке» в какую-то (, вероятно, неизвестную пользователям из других стран дату )года. Это стабильно.

TZ="America/New_York" date -d 'TZ="America/New_York" 01/01/20 03:30'
Wed 01 Jan 2020 03:30:00 AM EST

TZ="America/New_York" date -d 'TZ="America/New_York" 07/01/20 03:30'
Wed 01 Jul 2020 03:30:00 AM EDT

Используя эту концепцию, преобразования строк местного времени возможны (и просты )для городов как на севере, так и на юге:

$ ddate(){ TZ="$toTZ" date -d 'TZ="'"$fromTZ"'" '"$1" +'%c %z'; }

$ toTZ='America/New_York'
$ fromTZ='Africa/Johannesburg'    # Which is in the south but has no DST.

$ ddate '1/1/20';ddate '4/1/20'; ddate '7/1/20'

Tue 31 Dec 2019 05:00:00 PM EST -0500
Tue 31 Mar 2020 06:00:00 PM EDT -0400
Tue 30 Jun 2020 06:00:00 PM EDT -0400 


$ fromTZ='Pacific/Auckland'                   # Which has a DST set.

$ ddate '1/1/20';ddate '4/1/20'; ddate '7/1/20'

Tue 31 Dec 2019 06:00:00 AM EST -0500
Tue 31 Mar 2020 07:00:00 AM EDT -0400
Tue 30 Jun 2020 08:00:00 AM EDT -0400

Note the three **different** times 6, 7 and 8.
0
18.03.2021, 22:30

Теги

Похожие вопросы