将日期转换为数字

时间:2017-03-22 17:32:43

标签: vb.net

我有两个原始文件,我使用加密应用程序加密它们,这个应用程序更改这些文件的最后修改日期(如7zip),所以我试图将原始文件的最后修改日期保存到文本文件,所以我可以稍后从文本文件中读取这个日期并比较它以查看覆盖它之前哪个文件更新。

但我不想使用日期和时间数据类型,我想将其转换为数字,我知道的唯一方法是将其转换为double但它失败了。

所以我正在寻找一种方法来将日期保存为数字然后比较这个数字(如果可以的话)或重新转换为日期以确定哪个文件更新,我不是要将转换日期转换为双倍然后加倍字符串。

目前,我使用.LastWriteTime获取文件的上次修改日期,并使用.ToOADate将其转换为加倍,但未提供正确的结果。

我试图简化此代码中的问题:

    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

当我逐行调试此代码并将鼠标放入d1时,它显示一个带有12位十进制42816.763087673608的数字但是当我将其保存到文本文件时,它会保存一个只有10位小数的数字42816.7630876736

我的问题是:如何将日期转换为数字并将其保存到文本文件,然后(稍后)从此文本文件中读取此数字并从中重新创建日期。

感谢@Steve的回答(在评论中),DateTime.Ticks对我来说是一个很好的解决方案,可以避免使用double及其无穷无尽的问题。

我对之前的标题感到抱歉(我编辑了它)。

1 个答案:

答案 0 :(得分:3)

正如您可以在DateTime文档中阅读

  

时间值以100纳秒单位测量,称为刻度

显然,DateTime结构有一个Long类型的属性,名为Ticks

这似乎是满足您要求的完美候选人。使用Ticks,您将能够将日期Ticks的字符串表示存储在文本文件中,或者将二进制形式的long值写入二进制文件。 在任何情况下,长整数值都不会出现精度问题,当然,您可以从存储中重新加载值。

此外,Ticks值可用于重新创建DateTime变量,并使用它来检查文件的LastWriteTime(或LastWriteTimeUtc),而这不能用double值完成。

例如(假设存在一个名为GetTicksFromStorage的方法,它返回存储在某处的长刻度值)

 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

 ' 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