2010-09-16 14 views
6

Sto tentando di memorizzare le date come data/ora di modifica più recente in un file ZIP. Sembra che il supporto di formato ZIP supporti solo le date successive al 1980-01-01 come ultima modifica (almeno tramite Java API java.util.zip.ZipEntry)Qual è il primo valore di timestamp supportato nel formato di file ZIP?

È corretto? Il primo timestamp di modifica supportato è davvero 1980-01-01 00:00:00? Ho provato a trovare alcuni riferimenti per verificarlo ma non sono riuscito a trovarne.

risposta

15

I timestamp di inserimento zip sono registrati solo a con una precisione di 2 secondi. Questo riflette la precisione dei timestamp DOS in uso quando PKZIP è stato creato . Quel numero registrato nello Zip sarà il timestamp troncato, non più vicino 2 secondi.

Quando si archivia e si ripristina un file, non sarà più disponibile una data/ora corrispondente esattamente all'originale. Questo è al di sopra e al di là egli problema simile con Java utilizzando 1 millisecondo precisione e Microsoft Windows utilizzando 100 incrementi nanosecondo. Il formato PKZIP deriva dai giorni MS DOS e quindi utilizza solo 16 bit per il tempo e 16 bit per la data. È stato definito un timestamp esteso nel formato PKZIP modificato, ma Java non utilizza lo .

interna con cerniera file, le date e gli orari sono memorizzati in base all'ora locale 16 bit, non UTC come è convenzionale, usando un'antica formato MS DOS. Il bit 0 è il bit meno significativo del . Il formato è little-endian. Non c'era spazio in 16 bit per rappresentare con precisione il tempo anche per il secondo, quindi il campo secondi contiene i secondi divisi per due, dando precisione solo al secondo pari .

Ciò significa il tempo apparente di file all'interno di una zip improvvisamente differire di un'ora rispetto ai loro omologhi non compressi ogni volta si dispone di un cambio d'. Si significa anche che l'utilità di una zip sarà estrarre un ora UTC diverso da una data membro Zip a seconda di quale fuso orario il calcolo è stato fatto. Questo è ridicolo. Formato PKZIP bisogno un moderno timestamp UTC-based per evitare queste anomalie.

A peggiorare le cose, gli strumenti standard come WinZip o PKZIP sarà sempre intorno il tempo fino al prossimo, anche secondo quando si ripristinano, così forse rendendo il file di un secondo per due secondi più giovane. Il JDK (cioè javaToDosTime nel ZipEntry arrotonda il tempo verso il basso, rendendo in tal modo il file uno o due secondi più vecchio.

Il formato non supporta date prima 1980-01-01 0:00 UTC. Evitare file di data 1980-01-01 o precedente (ora locale o UTC).

Attendere! Diventa ancora peggio. Phil Katz, quando ha documentato il formato Zip, non ha provveduto a specificare se l'ora locale utilizzata nell'archivio deve essere essere legale o ora solare.

E per coronare il tutto ... Info-ZIP, JSE e TrueZIP applicare la pianificazione DST (giorni dove DST inizio e fine in un determinato anno) per qualsiasi data durante la conversione volte tra il tempo del sistema e DOS data /tempo. Questo è come dovrebbe essere. Explorer Vista, 7-Zip e WinZip applicano solo i risparmi dell'ora legale, ma non applica la pianificazione. Pertanto, utilizzano il risparmio di ora legale per qualsiasi data quando i tempi di conversione tra l'ora di sistema e la data/ora del DOS. Questo è solo sciatto.

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

tar file sono così molto meglio.

Problemi correlati