【问题标题】:How to take care of DST while comparing time values in C#在 C# 中比较时间值时如何处理 DST
【发布时间】:2012-04-05 05:02:19
【问题描述】:

我有两个时间要比较(String)。这些计时值是 Format 的,从下面的代码可以理解:

第一次计时值:

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");

正如您在上面看到的,我想将系统文件时间与数据库记录中的时间进行比较。 在这里,即使在转换为 UTC 然后比较字符串之后,我也看到了时间不等的潜在问题。

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

我的代码中的夏令时是否存在问题? 如果是这样,请您帮忙比较 DST。

EDIT1:

1st Timing value = 02/23/2012 09:08AM(它是从太平洋地区转换的,转换之前是 02/23/2012 12:08 AM)

2nd Timing value = 02/23/2012 08:08AM(转换前是 02/23/2012 01:38PM)

【问题讨论】:

  • 请向我们展示您的测试用例,即向我们展示 (a) 文件时间戳,(b) fileTimeeachFile.Date 的实际值。
  • 既然可以直接比较DateTime,为什么还要比较字符串?
  • 可能您的时间变量之一有时区信息,而另一个没有。
  • 如前所述,请展示一个简短但完整的程序来演示该问题。我同意 Alexei 的观点 - 你为什么要转换成字符串?
  • @stack_pointerisEXTINCT:您应该绝对修复您的架构和代码,以便它使用正确的数据类型。将日期保留为字符串将迫使您在所有地方执行转换,从而混淆您的代码。如果您打算尽快丢弃您的应用程序,那很好 - 但否则您应该修复它,以避免长期问题。不要走捷径 - 正确修复它。 (如果这些字符串代表 local 时间,那就更糟了——在这种情况下,由于 DST 转换的模糊性,您还会丢失数据。)

标签: c# datetime comparison utc dst


【解决方案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;等),直到您到达原始的单行示例。请注意哪个步骤导致转换失败——现在您知道哪个部分负责返回错误的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2021-07-10
    • 2014-10-18
    • 2021-08-18
    相关资源
    最近更新 更多