Какое самое раннее значение метки времени поддерживается в формате ZIP? - PullRequest
6 голосов
/ 16 сентября 2010

Я пытаюсь сохранить даты как отметку времени последней модификации в ZIP-файле. Похоже, что поддержка формата ZIP только после 1980-01-01 датируется как время последнего изменения (по крайней мере, через Java API java.util.zip.ZipEntry )

Это правильно? Является ли самая ранняя поддерживаемая временная метка модификации действительно 1980-01-01 00:00:00? Я пытался найти некоторые ссылки, чтобы проверить это, но я не смог их найти.

1 Ответ

15 голосов
/ 16 сентября 2010

Метки времени записи Zip записываются только с точностью до двух секунд.Это отражает точность меток времени DOS, используемых при создании PKZIP.Это число, записанное в Zip, будет усеченной временной меткой, а не ближайшими 2 секундами.

Когда вы архивируете и восстанавливаете файл, у него больше не будет временной метки, точно совпадающей с оригиналом.Эта проблема выходит за рамки аналогичной проблемы с Java, использующим точность в 1 миллисекунду, и Microsoft Windows, использующим шаг с шагом 100 наносекунд.Формат PKZIP происходит от дней MS DOS и, следовательно, использует только 16 бит для времени и 16 бит для даты.В пересмотренном формате PKZIP определена расширенная временная метка, но Java ее не использует.

Внутри zip-файлов даты и время хранятся по местному времени в 16 битах, а не в формате UTC, как это принято, используяДревний формат MS DOS.Бит 0 является наименее значимым битом.Формат с прямым порядком байтов.В 16 битах не было места для точного представления времени даже для секунды, поэтому поле секунд содержит секунды, разделенные на две, что дает точность только четной секунде.

Это означает видимое время файлов внутриzip внезапно будет отличаться на час по сравнению со своими несжатыми аналогами каждый раз, когда у вас есть переход на летнее время.Это также означает, что утилита zip будет извлекать различное время UTC из даты члена Zip в зависимости от того, в каком часовом поясе был выполнен расчет.Это нелепо.Формату PKZIP требуется современная временная метка на основе UTC, чтобы избежать этих аномалий.

Что еще хуже, стандартные инструменты, такие как WinZip или PKZIP, всегда будут округлять время до следующей четной секунды, когда они восстанавливаются, тем самым, возможно, делаяподать на одну-две секунды моложе.JDK (т. Е. JavaToDosTime в ZipEntry округляет время, что делает файл старше на одну-две секунды.

Формат не поддерживает даты до 1980-01-01 0:00 UTC. Избегайте дат файлов 1980-01-01 или ранее (местное время или время UTC).

Подождите! Становится еще хуже. Фил Кац, документируя формат Zip, не удосужился указать, должно ли местное время, используемое в архиве,быть дневным или стандартным временем.

И чтобы завершить это… Info-ZIP, JSE и TrueZIP применяют расписание DST (дни, когда DST начинался и заканчивался в любом конкретном году) для любой даты при преобразовании времени между системным временеми дата / время DOS. Так и должно быть. Vista, 7-Zip и WinZip применяют только сбережения DST, но не применяют расписание. Поэтому они используют текущие сбережения DST для любой даты при преобразовании времени между системным временем.и дата / время DOS. Это просто небрежно.

http://mindprod.com/jgloss/zip.html

tar файлы , поэтому намного лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...