我正在获取可执行文件的“LastWriteTime”,并将其与我设置的内部DateTime进行比较。如果LastWriteTime小于或等于内部DateTime,那么我将清除数据库中的两个表。
此代码在太平洋时区非常适合我。但是如果用户在另一个时区(例如我前面4个小时),则它不起作用,因为“LastWriteTime”返回转换为其时区的时间。例如,我正在寻找“12/12/2012 8:38:12 AM”的值,如果它们比我提前4个小时,这个值会自动更改为“12/12/2012 12:38:12 PM“在他们的系统上。
有人可以告诉我应该在我的代码中修改什么来考虑不同的时区,所以“LastWriteTime”和我的'build2023_EXE_Date'变量都返回相同的日期/时间所以我比较两个日期/时间无论我的最终用户在哪个时区,价值都不会失败?
我使用的是.NET 3.5,而不是.Net 4.x
//http://stackoverflow.com/questions/1600962/displaying-the-build-date
string w_file = "MyEXE.exe";
string w_directory = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +
Path.DirectorySeparatorChar + "MyEXE";
DateTime currentExeTime = File.GetLastWriteTime(System.IO.Path.Combine(w_directory, w_file));
DateTime build2023_EXE_Date = new DateTime(2012, 12, 12, 8, 38, 12); //"12/12/2012 8:38:12 AM"
//We need to truncate the millisecond time off of the EXE LastWriteTime
//or else when we compare to our internal DateTime build2323_EXE_Date value,
//it will not match
//http://stackoverflow.com/questions/1004698/how-to-truncate-milliseconds-off-of-a-net-datetime
currentExeTime = new DateTime(
currentExeTime.Ticks - (currentExeTime.Ticks % TimeSpan.TicksPerSecond),
currentExeTime.Kind
);
if (currentExeTime <= build2023_EXE_Date) //If previous build matches or is before the Build 2023 date then clear these two tables.
{
//This will fail the comparision if the user is in a different time zone than me.
//Clear tables
}
答案 0 :(得分:4)
除非您特别需要在当地时间保留日期或有相关的时区,否则我建议您使用通用时间。这使得使用日期变得更加容易,因为它们都比较清晰,并且它实际上可以更高效(当您请求DateTime.Now
时,.NET调用DateTime.UtcNow
然后执行相对昂贵的本地时间调整。
另一种选择是使用DateTimeOffset
,它存储一个带偏移量的日期(不是时区! - 例如,DST会给你不同的偏移量)并进行比较简单易用DateTime
。不幸的是,GetLastWriteTime
不使用DateTimeOffset
,因此这可能不适合您。
答案 1 :(得分:1)
使用DateTime ToUniversalTime()
方法