2017-03-22 5 views
1

Ich habe zwei Originaldateien und ich benutze Verschlüsselungsanwendung, um sie zu verschlüsseln, diese Anwendung ändern das Datum der letzten Änderung dieser Dateien (wie 7zip tun), so habe ich versucht, das Datum der letzten Änderung der Originaldatei zu speichern Textdatei, damit ich dieses Datum später aus der Textdatei lesen und vergleichen kann, um zu sehen, welche Datei neuer ist, bevor sie überschrieben wird.Konvertieren von Datum zu Nummer

Aber ich möchte nicht Datum und Uhrzeit Datentyp verwenden, ich möchte es in Zahl konvertieren und die einzige Möglichkeit, die ich weiß ist, um es in doppelte konvertieren, aber es ist fehlgeschlagen.

So bin ich auf der Suche nach einer Möglichkeit, Datum als Nummer zu speichern, dann diese Zahl zu vergleichen (wenn ich könnte) oder es bis heute umwandeln, um zu wissen, welche Datei neuer ist, ich suche nicht nach Datum zu verdoppeln, dann verdoppeln stringeln.

Momentan erhalte ich das letzte Änderungsdatum der Datei unter Verwendung .LastWriteTime und wandle es in doppelt unter Verwendung .ToOADate um, aber es gab keine korrekten Ergebnisse.

Ich habe versucht, das Problem in diesem Code zu vereinfachen:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     Dim d1 As Double, d2 As Double 

     d1 = IO.File.GetLastWriteTime("D:\g2.xlsb").ToOADate     
     d2 = 42816.7630876736 

     Debug.Print(d1)  '42816.7630876736 
     Debug.Print(d2)  '42816.7630876736 
     Debug.Print(d1 = d2) 'False 

    End Sub 

Wenn ich debuggen diesen Code Zeile für Zeile und bewegen Sie die Maus ein d1 seine Show eine Zahl mit 12 dezimal 42816.763087673608, aber wenn ich es auf eine sparen Textdatei speichert eine Nummer mit nur 10 Dezimal 42816.7630876736.

Meine Frage ist: wie man ein Datum in eine Zahl umwandelt und es in Textdatei speichert, dann (später) diese Zahl aus dieser Textdatei liest und ein Datum daraus wieder herstellt.

Dank @Steve für seine Antwort (in Kommentaren), DateTime.Ticks ist eine großartige Lösung für mich zu vermeiden, Doppel-und seine endlosen Probleme zu verwenden.

Und es tut mir leid, den vorherigen Titel (Ich habe es bearbeitet).

+1

Verwenden DateTime.Ticks statt – Steve

+1

@Steve, Danke sehr, 'DateTime.Ticks' ist, was ich gesucht habe.es ist viel besser als (doppelt und seine Probleme). – Fadi

+1

Auch das Problem mit Double ist schlimmer, wenn Sie das Datum aus dem Double in Ihrer Textdatei neu erstellen müssen. – Steve

Antwort

3

Wie Sie in der Datetime-docs

Zeitwert gemessen werden in 100-Nanosekunden-Einheiten lesen können genannt Zecken

und natürlich die Datetime Struktur hat eine Eigenschaft vom Typ Ticks Lange genannt.

Dies scheint der perfekte Kandidat für Ihre Anforderungen. Mit Ticks können Sie die String-Darstellung der Datums-Ticks in einer Textdatei speichern oder den Long-Wert in seiner Binärform in eine Binärdatei schreiben. In jedem Fall haben Sie keine Präzisionsprobleme mit dem Long Integer-Wert und natürlich können Sie den Wert von Ihrem Speicher neu laden.

Darüber hinaus kann der Ticks-Wert verwendet werden, um die DateTime-Variable neu zu erstellen und mit der LastWriteTime (oder LastWriteTimeUtc) der Datei zu überprüfen, während dies nicht mit einem doppelten Wert durchgeführt werden kann.

So zum Beispiel (das Vorhandensein eines Verfahrens unter der Annahme GetTicksFromStorage genannt, der den langen Ticks Wert irgendwo gespeichert zurück)

Dim ticks as Long = GetTicksFromStorage() 
Dim curTicks = IO.File.GetLastWriteTime("D:\g2.xlsb").Ticks 

If ticks < curTicks Then 
    Console.WriteLine("G2 is newer") 
Else 
    .... 
End If 

oder

' Here the result of the GetTicksFromStorage is passed to the DateTime constructor 
Dim storedDate as DateTime = new DateTime(GetTicksFromStorage()) 
Dim curDate = IO.File.GetLastWriteTime("D:\g2.xlsb") 
if storedDate < curDate Then 
    Console.WriteLine("G2 is newer") 
Else 
    .... 
End If   
+0

Vielen Dank @Steve für Ihre großartige Antwort, genau das, was ich gesucht habe. – Fadi