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.
parseTime
kann ich UTCTime
bekommen. utcTimeToPOSIXSeconds
kann ich ein POSIXTime
bekommen
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:
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)
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.
(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:
Sie können auch Data.Convertible.convert
(aus dem konvertierbaren Paket) verwenden: