3

На моем компьютере с Windows XP установлена программа ls . Это пришло с msysgit. Я имел это некоторое время, и оказывается, что я использую это довольно часто, даже в приглашении DOS. Больше, чем dir .

Дело в том, что он дает мне метки времени со смещением в один час. Смотрите дату для gcc.exe, ls говорит 15:01, dir говорит 16:01:

C:\MinGW\bin>ls --full-time gcc.exe
-rwxr-xr-x    1 gaf      Administ    90112 Thu Apr 24 15:01:53 2008 gcc.exe

C:\MinGW\bin>dir gcc.exe
 Volymen i enhet C har ingen etikett.
 Volymens serienummer är 644A-83A3

 Innehåll i katalogen C:\MinGW\bin

2008-04-24  16:01            90 112 gcc.exe
               1 fil(er)              90 112 byte
           0 katalog(er)  104 458 203 136 byte ledigt

(простите за странный язык)

Я могу сказать, что это ls делает это неправильно, я проверил это с вновь созданными файлами.

Это довольно тревожно, есть какие-нибудь предложения о том, как я могу это решить?


РЕДАКТИРОВАТЬ: больше информации добавлено после ответа njd.

Изменение переменной env TZ имеет эффект. Я живу в Швеции, где время CET зимой, CEST летом. Я проверил UTC, CET и CEST и получил странные (для меня) результаты:

C:\Program\Git\bin>set TZ=UTC

C:\Program\Git\bin>.\date
Mon Feb 15 12:53:26 GMT 2010

C:\Program\Git\bin>set TZ=CET

C:\Program\Git\bin>.\date
Mon Feb 15 12:53:50 GMT 2010

C:\Program\Git\bin>set TZ=CEST

C:\Program\Git\bin>.\date
Mon Feb 15 12:53:59 GMT 2010

C:\Program\Git\bin>set TZ=CET+1

C:\Program\Git\bin>.\date
Mon Feb 15 11:54:27 CET 2010

C:\Program\Git\bin>set TZ=CET-1

C:\Program\Git\bin>.\date
Mon Feb 15 13:54:35 CET 2010

Установка TZ в CET или CEST не имеет никакого эффекта. Дата отображается по-прежнему GMT. Кажется, что строка CET сама по себе не имеет никакого эффекта. Является ли это только строкой для отображения, и учитывается только при наличии явного смещения.

C:\Program\Git\bin>set TZ=FOO-1

C:\Program\Git\bin>.\date
Mon Feb 15 14:00:29 FOO 2010

C:\Program\Git\bin>set TZ=BAR-1

C:\Program\Git\bin>.\date
Mon Feb 15 14:00:42 BAR 2010

Ну, это похоже.

-1 имеет правильный эффект. Но время Швеции - UTC+1:CET в Википедии

Есть ли несоответствие в соглашении, -1 в TZ - UTC+1?

Если я хочу позволить ОС решить, будет ли лето или зима, как указано в ответе njd, я могу опустить время начала и окончания. Я полагаю, правильная строка TZ=CET-1CEST-2 , это правильно?

Я не уверен, что окна делают летом. Если он обновляет сами часы, приведенная выше строка не будет работать. Если он обновляет только смещение, то это может сработать. Больше идей?

2 ответа2

4

Похоже, команда ls недостаточно знает о европейских часовых поясах и датах, когда действует CEST.

Я предполагаю, что 16:01, сообщенное DIR, было 16:01 CEST, но команда ls не применила дополнительный час для перехода на летнее время.

Я не уверен, как msysgit (или просто msys) хранит информацию о часовом поясе: в Solaris для этого есть файлы zoneinfo.

Если есть какой-то способ общения с вашими инструментами msysgit, когда летнее время начинается и заканчивается, тогда ваша команда ls может сделать это правильно.

Может быть, эта страница предлагает подсказку.
Попробуйте поиграть с настройками среды, такими как

SET TZ=CET+1CEST,M3.5.0/2,M10.5.0/2

в котором говорится, что CEST начинается в последнее воскресенье (день 0) марта в 2 часа ночи и заканчивается в последнее воскресенье октября в 2 часа ночи. Это должно дать вам кое-что для работы.

(Обычно достаточно указать только часовой пояс и часовой пояс летнего времени: «CET +1CEST» и полагаться на ОС, чтобы знать, какими должны быть соответствующие даты. Но здесь мы устанавливаем даты явно.)

Я вижу, что нечто подобное происходит в обратном порядке с MSys в моей системе:
Файл, сообщаемый командой DIR (и проводником Windows) как записанный 2008-04-18 в 12:19 (который должен был быть BST: GMT+1), отображается MSys ls как 13:19:06.

Если я поиграюсь с датами часового пояса и SET TZ как если бы DST не начинался до конца апреля, я могу изменить это, чтобы соответствовать выводу DIR.

Но, насколько мне известно, общеевропейское правило в отношении летнего времени заключается в том, что оно начинается в последнее воскресенье марта (M3.5.0/2) и заканчивается в последнее воскресенье октября (M10.5.0/2).

Поэтому, когда я печатаю (в оболочке MSys, или в Cygwin, или в Unix):

TZ=GMT0BST,M3.5.0/2,M10.5.0/2 ls --full-time foo

Я должен видеть правильное время с применением DST. Фактически я вижу 13:19, точно так же, как когда я вообще не устанавливаю часовой пояс.

Что заставляет меня задуматься, правильно ли MSys и msysgit понимают это, а Windows - неправильно.

0

Это раздражает, но да, в соглашении есть несоответствие, поэтому, например, если ваш часовой пояс равен -3, то вы хотите +3 в переменной среды TZ . Из документации библиотеки GNU C:

Смещение указывает значение времени, которое вы должны добавить к местному времени, чтобы получить значение всемирного координированного времени. Он имеет синтаксис вроде [+| -] чч [: мм [: сс]]. Это положительно, если местный часовой пояс находится к западу от премьер-меридиана, и отрицательно, если он восточнее.

Если вы не указали период DST в TZ , библиотека C предполагает, что DST вообще отсутствует. Я думаю, что было бы нецелесообразно полагаться на каждую отдельную операционную систему для обеспечения периода DST при отсутствии в TZ . На самом деле, было бы намного проще просто получить местное время напрямую. Таким образом, вы должны указать период DST при использовании этого конкретного формата настроек TZ .

Решение, которое сработало для меня, заключалось в написании сценария на Ruby, который предоставит мне период перехода на летнее время для моей страны, где он будет изменяться на протяжении многих лет. Затем он выводит это в правильном формате для TZ , который установлен в моем /etc/profile.d/ в MSYS. Это мое текущее значение TZ , отлично работает как для ls и для date:

BRT+3BRST,M10.3.0/0,M2.3.0/0

Однако обратите внимание, что среда выполнения Microsoft C также чувствительна к значению TZ, что может привести к конфликтам между приложениями MSYS и MSVCRT. При запуске приложений на основе MSVCRT (например, Python) вам нужно отключить TZ найти какое-нибудь лучшее решение. Поскольку ваши настройки не работают, попробуйте точное значение выше, изменив только период DST, чтобы соответствовать вашему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .