在C#中比较时间值时如何处理DST

时间:2012-03-20 17:17:07

标签: c# datetime comparison utc dst

我要比较两个时间(String)。这些时间值是格式,因为可以从下面的代码中理解:

第一个时间点:

String fileTime = new FileInfo(fileName).LastWriteTime.ToUniversalTime().ToString("MM/dd/yyyy hh:mm tt");

第二时间值: (我从数据库中可用的印度时间列表中获取)

DateTime date = DateTime.ParseExact(eachBinary.Date, "MM/dd/yyyy hh:mm tt", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
date = TimeZoneInfo.ConvertTime(date, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"), TimeZoneInfo.Utc); 
eachBinary.Date = date.ToString("MM/dd/yyyy hh:mm tt");

如上所示,我想将系统文件时序与DB记录中的时序进行比较。 在这里,我看到即使在转换为UTC然后比较字符串之后也存在不等时序的潜在问题。

我知道在这里比较一个文件(比如 file1 )的时间是相等的。但程序(或)应用程序返回时它们不相等。

我的代码中是否存在DST问题? 如果是这样,你可以在比较中帮助处理DST。

EDIT1:

第一时间值 = 02/23/2012 09:08 AM(它是从太平洋区转换而来,转换之前是02/23/2012 12:08 AM)

第二时间值 = 02/23/2012 08:08 AM(转换前是02/23/2012 01:38 PM)

1 个答案:

答案 0 :(得分:1)

我认为第一次转换(fileTime)是返回错误值的转换。我不在PST,我的文化使用24小时制,所以我必须使用以下代码模拟你的第一个代码示例:

// 02/23/2012 12:08 AM (instead of reading LastWriteTime)
DateTime original = new DateTime(2012, 02, 23, 00, 08, 00);

// instead of ToUniversalTime(), which would use my local time zone
TimeZoneInfo pstzone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(original, pstzone); 

// instead of a plain ToString(), which would use my local culture
CultureInfo us = CultureInfo.CreateSpecificCulture("en-US");
String display = utc.ToString("MM/dd/yyyy hh:mm tt", us);

// output: display = 02/23/2012 08:08 AM

所以,它"适用于我的机器"。我建议你在你的机器上试试这个。如果它也能正常工作,请逐步替换部件(新的DateTime - > LastWriteTime; ConvertTimeToUtc - > ToUniversalTime;等等),直到您到达原始的单行示例。注意哪一步导致转换失败 - 现在您知道哪个部分负责返回错误的结果。