Gibt es eine bessere Möglichkeit, von UTCTime nach EpochTime zu konvertieren?

8

Ich möchte die Änderungszeit einer Datei auf die Zeit einstellen, die ich von exif-Daten erhalten habe.

Um die Zeit von exif zu bekommen, habe ich gefunden:

%Vor%

Um die Zeit für die Dateiänderung festzulegen, habe ich Folgendes gefunden:

%Vor%

Angenommen, ich finde eine Zeit in Exif, muss ich eine Zeichenfolge in eine EpochTime konvertieren.

  • Mit parseTime kann ich UTCTime bekommen.
  • Mit utcTimeToPOSIXSeconds kann ich ein POSIXTime bekommen
  • Mit einem POSIXTime kann ich mehr oder weniger ein EpochTime bekommen

Um von einem UTCTime in EpochTime zu konvertieren, tippe ich auf diesen Typ, aber ich bin es nicht sicher, dass es richtig ist:

%Vor%

Dies ist Teil einer Funktion getTime, die die Zeit von Exif zurückgibt Daten, falls vorhanden, ansonsten die Änderungszeit der Datei:

%Vor%

Meine Frage ist

Gibt es einen besseren / einfacheren Weg, die Zeit zu konvertieren? (Vielleicht mit verschiedenen Bibliotheken)

    
David V. 16.11.2010, 12:56
quelle

2 Antworten

8

Data.Time ist die am besten unterstützte Zeitbibliothek, also würde ich definitiv zustimmen Sie können es verwenden, um die Zeichenfolgendarstellung von Datum und Uhrzeit zu analysieren dass Sie die Exif-Daten verlassen.

Sind Sie sicher, dass Sie die Änderungszeit einer Datei festlegen müssen? Das ist ungewöhnlich. Aber wenn ja, dann müssen Sie die Bibliotheken System.Posix auf einem Posix-System verwenden.

Wenn Sie die Änderung einer Datei nur lesen müssen, Sie wären besser dran mit der generischen Funktion %Code%. Leider, diese Funktion verwendet auch eine nicht standardmäßige Zeitbibliothek, System.Directory.getModificationTime von der in diesem Fall das lange veraltete System.Time -Paket. Du müsstest also einige ähnliche Machenschaften machen.

Ihre Konvertierung von old-time zu POSIXTime ist zufällig OK in diesem speziellen Fall, aber im Allgemeinen ist es kein idealer Weg zu gehen.

Der EpochTime -Typ, a.k.a der EpochTime type von C, does keinen direkten Weg in Haskell zu bauen, ohne durch zu gehen ein ganzzahliger Wert, auch wenn er selbst nicht notwendigerweise ganzzahlig ist abhängig von Ihrem Betriebssystem. Sie könnten über C mit dem FFI gehen, wenn diese möglichen Sekundenbruchteile sind Ihnen wichtig. Hier ist das sicher nicht wichtig, denn Sie erhalten die Sekunden von einem time_t Formatparameter, der keinen Bruchteil haben kann. Sowieso. Sie müssen noch eine Art Rundung oder Abschneiden durchführen um vom nicht-integralen %S -Typ nach UTCTime zu gelangen.

Sie verwenden momentan nur die EpochTime -Instanz von Enum , um das zu tun Runden / Abschneiden für Sie, aber es entscheidet sich dafür. Auch in diesem speziellen Fall spielt es keine Rolle, denn wir passieren zu wissen, dass der Wert integral sein wird. Aber im Allgemeinen ist es besser, es zu spezifizieren Sie sich explizit mit POSIXTime , floor oder ceiling . Z. B.

%Vor%

(Beachten Sie, dass Sie das round nicht explizit ausschreiben müssen, Sie können die Funktion case aus dem Prelude verwenden.)

Beachten Sie, dass ich auch maybe explizit verwende, um die Umwandlung durch Der fromInteger -Typ. Wenn Sie stattdessen über Integer gehen möchten (achten Sie auf das "Jahr 2038 Problem" auf 32-Bit-Maschinen) würde ich definieren separate Konvertierungsfunktion, um dies zu verdeutlichen:

%Vor%     
Yitz 16.11.2010, 18:04
quelle
8

Sie können auch Data.Convertible.convert (aus dem konvertierbaren Paket) verwenden:

%Vor%     
Thedward 02.02.2012 23:32
quelle

Tags und Links