Почему действительно TZ=UTC-8 производит даты, которые являются UTC+8?

cp не знает то, что другие программы могут иметь открытые файлы. Нет никакого волшебства в cp. Дизайн Unix целеустремленно старается не помещать любой вид, соединяет файлы, если нет неопровержимый довод (заставляющий значение, что ядру нужен он). По этой теме посмотрите, что перенаправление производит в файл, применяют блокировку на файл?

Такие ситуации, где файл производится производителем и, однажды завершенный, использованный потребителем, распространены. Обычный способ обработать это состоит в том, чтобы сделать, чтобы производитель записал временный файл, который потребитель не будет искать, затем после того как производитель закончен, перемещают файл в место, где потребитель найдет его. Перемещение файла (в той же файловой системе) является атомарной операцией: в какой-то момент, для потребителя, файл изменяется от того, чтобы не быть там к тому, чтобы быть там.

Поэтому примите меры, чтобы Ваше задание загрузки переместило файлы в другой каталог, когда оно закончит делать загрузку. Укажите на задание крона на этот другой каталог.

26
07.12.2013, 05:26
4 ответа

Причина - это TZ=UTC-8 интерпретируется как часовой пояс POSIX. В формате часового пояса POSIX 3 буквы являются сокращением часового пояса (который произволен), и число является числом часов, часовой пояс находится позади UTC. Так UTC-8 означает, что часовой пояс сократил "UTC", который является −8 часами позади реального UTC или UTC + 8 часов.

(Это прокладывает себе путь, потому что Unix был разработан в США, которые находятся позади UTC. Этот формат позволяет американским часовым поясам быть представленными как EST5, CST6, и т.д.),

Вы видите, что это - то, что происходит этими примерами:

$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800

ISO -0800 формат часового пояса проявляет противоположный подход, с - указание на зону находится позади UTC, и + указание на зону перед UTC.

33
27.01.2020, 19:40
  • 1
    поэтому, что я действительно хотел, был TZ=PST+8 date.Спасибо. Я также нашел это объяснение под man timezone: "Строка станд. указывает название часового пояса и должна быть тремя или больше буквенными символами. Строка смещения сразу следует за станд. и указывает временную стоимость, которая будет добавлена к местному времени для получения Всемирного координированного времени (UTC). Смещение положительно, если локальный часовой пояс к западу от Главного меридиана и отрицателен, если это - восток. Час должен быть между 0 и 24, и минуты и секунды 0 и 59". –  Alex Henrie 07.12.2013, 04:55
  • 2
    @Alex не, что Вы действительно хотите, TZ=America/Los_Angeles. Вы забываете, что тихоокеанское время-7 в течение летнего времени. –  Matt Johnson-Pint 07.12.2013, 10:13
  • 3
    @MattJohnson, Вы имеете в виду TZ=:America/Los_Angeles. Двоеточие указывает, что это - файл часового пояса Olson. И в другом комментарии, он упомянул, что хотел проигнорировать летнее время, которое это не сделает. –  cjm 07.12.2013, 13:32
  • 4
    @cjm, Спасибо, Вы правы относительно двоеточия, и я не видел тот комментарий. –  Matt Johnson-Pint 07.12.2013, 19:30
  • 5
    , причина f мир, если это означает, что мы должны быть EST-5 CST-6. –  Evan Carroll 27.12.2017, 23:04

Каждый раз, когда Вы указываете часовой пояс в формате +/-00:00, Вы указываете смещение, не фактический часовой пояс. От GNU libc документация (который следует стандарту POSIX):

Смещение указывает временную стоимость, которую необходимо добавить к местному времени для получения значения Всемирного координированного времени. Это имеет синтаксис как [+ |-] гд [: мм [: ss]]. Это положительно, если зона местного времени к западу от Главного меридиана и отрицательна, если это - восток. Час должен быть между 0 и 23, и минута и секунды между 0 и 59.

Поэтому это, кажется, реверс того, что Вы ожидаете.

7
27.01.2020, 19:40

Как альтернативный метод можно использовать команду zdump показать текущее время в других часовых поясах + смещения.

Zdump печатает текущее время в каждом имени зоны, названном на командной строке.

Те же правила применяются с часовыми поясами; к западу от главного меридиана, находящегося, "позади" в то время как на восток, являющийся "вперед".

Пример

$ zdump PST PST суббота 7 декабря 3:25:27 20:13 PST

Я сделал этот сценарий, чтобы показать несколько из часовых поясов + смещения, что мы интересуемся использованием zdump и date таким образом, мы могли сравнить их.

$ cat cmd.bash
#!/bin/bash

printf "\ndate: %s\n\n" "$(date)"

for tz in EST PST PST+8 PST-8 UTC UTC+8 UTC-8; do
  echo "-- timezone $tz"
  printf "zdump: %s\n" "$(zdump $tz)"
  printf "date:         %s\n" "$(TZ=$tz date +'%a %b %d %T %Y - (%Z %z)')"
  echo ""
done

Затем при выполнении его, Вы видите сравнение zdump кому: date:

$ ./cmd.bash 

date: Sat Dec  7 02:59:05 EST 2013

-- timezone EST
zdump: EST  Sat Dec  7 02:59:05 2013 EST
date:         Sat Dec 07 02:59:05 2013 - (EST -0500)

-- timezone PST
zdump: PST  Sat Dec  7 07:59:05 2013 PST
date:         Sat Dec 07 07:59:05 2013 - (PST +0000)

-- timezone PST+8
zdump: PST+8  Fri Dec  6 23:59:05 2013 PST
date:         Fri Dec 06 23:59:05 2013 - (PST -0800)

-- timezone PST-8
zdump: PST-8  Sat Dec  7 15:59:05 2013 PST
date:         Sat Dec 07 15:59:05 2013 - (PST +0800)

-- timezone UTC
zdump: UTC  Sat Dec  7 07:59:05 2013 UTC
date:         Sat Dec 07 07:59:05 2013 - (UTC +0000)

-- timezone UTC+8
zdump: UTC+8  Fri Dec  6 23:59:05 2013 UTC
date:         Fri Dec 06 23:59:05 2013 - (UTC -0800)

-- timezone UTC-8
zdump: UTC-8  Sat Dec  7 15:59:05 2013 UTC
date:         Sat Dec 07 15:59:05 2013 - (UTC +0800)
1
27.01.2020, 19:40
  • 1
    я на самом деле пытаюсь получить текущее время по Тихоокеанскому стандартному времени, игнорируя Переход на летнее время. –  Alex Henrie 07.12.2013, 04:41
  • 2
    у меня был к downvote этот, потому что Вы предполагаете, что "UTC-8" является неправильным. Это корректно, это просто не делает то, что ожидает пользователь. Я не чувствую, что это отвечает на вопрос относительно того, почему это прокладывает себе путь. –  jordanm 07.12.2013, 04:41
  • 3
    @jordanm - посмотрите уборку. –  slm♦ 07.12.2013, 04:50
  • 4
    Это все еще объясняет, что происходит, но не, почему и "почему" то, что спрашивает OP. Я удалю свой downvote, но я все еще не чувствую, что это - хороший ответ на вопрос. А-ч –  jordanm 07.12.2013, 04:53

Почему?

Потому что POSIX требует .

Если перед ним стоит знак «-», часовой пояс должен находиться к востоку от нулевого меридиана; в противном случае он должен быть западным (что может быть обозначено необязательным предшествующим знаком «+»).

Таким образом, это даст время около [1] Лос-Анджелеса (с любой трехбуквенной меткой для текста часового пояса):

$ TZ=ANY8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 ANY-0800

$ TZ=GMT+8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 GMT-0800

И это должно дать время около Шанхая, Китай или Перт, Австралия :

$ TZ=ANY-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-24 02:47:12 ANY+0800

$ TZ=CST-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 02:47:12 CST+0800

[1] Рядом, потому что может действовать летнее время (DST), которое сдвигает фактическое «местное время».

2
27.01.2020, 19:40

Теги

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