我有两个原始文件,我使用加密应用程序加密它们,这个应用程序更改这些文件的最后修改日期(如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及其无穷无尽的问题。
我对之前的标题感到抱歉(我编辑了它)。
答案 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