2010-09-16 5 views
6

Próbuję zapisać daty jako najnowszy znacznik modyfikacji w pliku ZIP. Wygląda na to, że obsługa formatu ZIP ma miejsce tylko po 1980-01-01 jako czas ostatniej modyfikacji (przynajmniej za pomocą Java API java.util.zip.ZipEntry)Jaka jest najwcześniejsza wartość znacznika czasu obsługiwana w formacie pliku ZIP?

Czy to prawda? Czy najwcześniejszy obsługiwany znacznik modyfikacji jest naprawdę 1980-01-01 00:00:00? Próbowałem znaleźć odniesienia do tej weryfikacji, ale nie mogłem znaleźć żadnych.

Odpowiedz

15

Znaczniki czasu wejścia na taśmę są zapisywane tylko jako na dwie 2 sekundy precyzji. Ten numer odzwierciedla dokładność oznaczeń czasowych DOS używanych podczas tworzenia PKZIP . Ta liczba zarejestrowana w Zip będzie skrócona o znacznik czasu, , nie przez najbliższe 2 sekundy.

Po zarchiwizowaniu i przywróceniu pliku, , nie będzie już miał znacznika czasu precyzyjnie dopasowanego do oryginału. Ten wykracza poza podobny problem, jak z Javą, używając dokładności 1 milisekundy i systemu Microsoft Windows z przyrostami co 100 nanosekund. Format PKZIP wywodzi się z dni MS DOS i dlatego używa tylko 16 bitów na czas i 16 bitów na datę. W zmienionym formacie PKZIP zdefiniowano przedłużony znacznik czasu , ale Java nie używa go w postaci .

wewnętrzne pliki zip, daty i czasy są przechowywane w czasu lokalnego w 16 bitach, nie UTC jak konwencjonalny, stosując starożytną formacie MS DOS. Bit 0 jest najmniej znaczącym bitem . Format to little-endian. Nie było miejsca w 16-bitowym, aby dokładnie odwzorować czas nawet do sekundy, więc drugie pole zawiera sekundy podzielone przez dwa, podając dokładność tylko do równej sekundy.

Oznacza to czas pozorny plików wewnątrz zamek nagle różnić od godziny w porównaniu z ich odpowiednikami nieskompresowanych każdym razem masz letni zmian. To oznacza również, że narzędzie zip będzie wyodrębnić inny czas UTC z Data członu Zip, w zależności od tego, które obliczenie strefy zostało wykonane. To jest niedorzeczne. Format PKZIP potrzebuje nowoczesnego znacznika czasu opartego na UTC, aby uniknąć anomalii w postaci .

Co gorsza, standardowe narzędzia jak WinZip czy PKZIP będzie zawsze okrągły czas do następnego nawet sekundy kiedy przywrócić, co ewentualnie co plik jedną sekundę, aby dwa sekund młodszy. JDK (tj javaToDosTime w ZipEntry zaokrągla czas w dół, dzięki czemu plik jeden do dwóch sekund starsza.

format nie obsługuje daty przed 01.01.1980 00:00 UTC. Unikaj data pliku 1980-01-01 lub wcześniej (czas lokalny lub UTC).

Czekaj! Jest jeszcze gorzej. Phil Katz, , gdy dokumentował format Zip, nie zadał sobie trudu, aby określić, czy czas lokalny użyty w archiwum powinien być , czy powinien być ustawiony na czas letni czy standardowy.

I cap go ... Info-ZIP, JSE i TrueZIP zastosowanie harmonogram DST (dni gdzie DST rozpoczęcia i zakończenia w danym rok) dla dowolnej daty przy konwersji razy między czasem systemowym i DOS data /czas. Tak właśnie powinno być. Vista's Explorer, 7-Zip i WinZip stosują tylko oszczędność czasu letniego, ale nie stosuj harmonogramu w przypadku . Wykorzystują one bieżące oszczędności czasu letniego dla dowolnej daty, kiedy przeliczają czasy między czasem systemowym a DOS/czasem. To tylko niechlujstwo.

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

tar pliki są tak znacznie lepiej.

Powiązane problemy