0

我正在获取可执行文件的“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
}
4

2 回答 2

4

除非您特别需要将日期保持在当地时间或有关联的时区,否则我建议您改用通用时间。这使得使用日期变得更加容易,因为它们都比较合理,并且实际上可以提高性能(当您请求时DateTime.Now,.NET 调用DateTime.UtcNow然后对本地时间执行相对昂贵的调整)。

另一种选择是使用DateTimeOffset,它存储带有偏移量的日期(不是时区! -例如,DST 会给你不同的偏移量)并使比较像通用的DateTime. 不幸的是,虽然,GetLastWriteTime不使用DateTimeOffset所以这可能不适合你。

于 2012-12-21T17:33:55.623 回答
1

使用DateTime ToUniversalTime()方法

于 2012-12-21T17:34:05.427 回答