【问题标题】:Date Comparing in C#C#中的日期比较
【发布时间】:2011-12-15 17:37:30
【问题描述】:

我目前正在做一个小项目,但遇到了一个小问题。 我希望我的程序在启动时调用方法CheckDate。 此方法将读取 .txt 文件以查看 (yyyy/mm/dd) 格式的上次保存日期。 然后它将它与今天的日期进行比较,如果不一样,请继续执行一些说明。我已阅读文档here,但无法找到最适合我需要的方法。

问题 1:有没有办法以 (yyyy/mm/dd) 格式获取今天的日期?

问题 2:在 C# 中比较日期最简单的方法是什么?

提前致谢。

【问题讨论】:

  • 您目前如何读取字符串?您需要将其解析为DateTime 对象并将其与DateTime.Today 进行比较。不要尝试将DateTime.Today 转换为字符串并以这种方式进行比较。 DateTime 对象为日期/时间功能内置了大量逻辑,因此您无需重新发明它。
  • 我目前在 my.txt 文件中逐行阅读

标签: c# datetime date


【解决方案1】:
1. DateTime.Now.ToString("yyyy/MM/dd")
2. DateTime.Parse(input).Date == DateTime.Now.Date

【讨论】:

  • DateTime.Parse(input).Date - 等待发生的运行时错误:)
  • 他说的是最简单的方法,他没有说任何关于验证的事情:D。另外,找到 TryParse 并不是一个巨大的飞跃。
【解决方案2】:

您可以通过简单地格式化日期来将今天的日期作为字符串获取。

String today = String.Format("{0: yyyy/MM/dd}", DateTime.Now); 
String today = DateTime.Now.ToString("yyyy/MM/dd");

我建议不要使用文本文件作为保存数据的方式,但如果您使用该系统,您唯一需要做的就是检查文本文件中的日期是否与您格式化的日期相匹配。简单地比较格式化的字符串就可以了。

如果(字符串 a == 字符串 b)

您甚至可以将其放在一行中,而无需单独格式化内容

if (DateTime.Now.ToString("yyyy/MM/dd").Equals("date pulled from txt file"))

【讨论】:

  • 在我的系统上,这是 2011-12-15。虽然我认为他们无论如何都应该在这种情况下使用这种格式,但由于系统设置的变化,他们不应该得到它。您想逃到@"yyyy\/MM\/dd" 以保证/ 而不是系统日期分隔符。
  • @JonHanna 只要您以相同的方式解析两个日期,这无关紧要。
  • @Chase 这正是问题所在。很长一段时间以来,这台机器会以“2011/12/16”格式写入和解析您的字符串,因为默认设置为 dd/MM/yyyy,然后/ 会变成/。我改变了它,因为我更喜欢标准格式,所以现在它需要你的格式字符串来生成 2011-12-16。如果这个程序在上面运行,它就会坏掉。
  • 如果每次都解析两个日期就不会有冲突了。
【解决方案3】:

在 C# 中比较日期的最简单方法是什么?

不要将它们存储为文本,而是存储在 DatteTime 中。

比较变量。

如果两者都有时间,比较 a.Date == b.Date。

有没有办法以 (yyyy/mm/dd) 格式获取今天的日期?

是的。不过,这是错误的。 PARSE 输入错误,比较解析后的数据。

【讨论】:

  • 按照 OP 的要求,如何将 DateTime 存储为 DateTime.txt 文件中?
  • 好的,但我对此有点陌生。如果我没记错的话,streamwriter 和 streamreader 正在使用字符串吗?这就是为什么我坚持使用转换为字符串部分。如何将日期时间存储在我的 .txt 文件中?
  • @KirkWoll 我一开始应该怎么问。
【解决方案4】:

您可以使用 DateTime.Compare 方法 http://msdn.microsoft.com/en-us/library/system.datetime.compare.aspx - 这也应该允许您使用内置的 运算符。

【讨论】:

    【解决方案5】:

    通过问题的字母:

    1:

    DateTime.Now.ToString(@"yyyy\/MM\/dd") 
    

    2:

    if(d1 < d2)...
    if(d2 >= d1)...
    

    等等

    但是。

    DateTime dt;
    if(DateTime.TryParseExact(readInString, "yyyy-MM-dd", null, DateTimeStyles.AssumeLocal, out dt))
    {
      if(dt != DateTime.Now.Date)
      {
        //Code for case where it's no longer that day goes here.
      }
    }
    else
    {
      //Code for someone messed up the file and it's not a valid date any more goes here.
    }
    
    1. 您这样做是为了计算机阅读,而不是人类阅读,因此请使用标准格式而不是传统格式(ISO 中的标准,但除朝鲜以外的每个国家/地区都将其作为国家标准): yyyy-MM-dd (编辑:我知道你在加拿大,CSA Z234.5:1989 是用于技术目的的日期时间的相关国家标准;它说使用 yyyy-MM-dd)。

    2. 你应该反过来做,读取字符串,解析日期,然后进行比较。

    【讨论】:

      【解决方案6】:

      您可能想看看FileInfo-Class ...您可以将 LastWriteTime 成员与 DateTime.Today 进行比较

      【讨论】:

        【解决方案7】:
        DateTime d1 = DateTime.Now;
        DateTime d2 = d1.AddMilliseconds(123456789);
        string formattedDate = d1.ToString("yyyy/MM/dd");
        
        TimeSpan ts = d2 - d1;
        
        double dayDiff = ts.TotalDays;
        double hourDiff = ts.TotalHours;
        double minuteDiff = ts.TotalMinutes;
        double secondDiff = ts.TotalSeconds;
        double milDiff = ts.TotalMilliseconds;
        
        Console.WriteLine("Formatted Date: {0}\r\nDate Diff:\r\nTotal Days: {1}; Total Hours: {2}; Total Minutes: {3}; Total Seconds: {4}; Total Milliseconds: {5}", formattedDate,dayDiff,hourDiff,minuteDiff,secondDiff,milDiff);
        

        输出:

        格式化日期:2011/12/15

        日期差异:
        总天数:1.42889802083333;总小时数:34.2935525;总分钟数:2057.61315;总秒数: 123456.789;总毫秒数:123456789

        *编辑了我最初的帖子,以阐明“总计”属性的工作原理。

        【讨论】:

        • 这也可以,但是查看 TotalHours 属性,将其与当前 DateTime 进行比较或使用 TimeStamp 在您的 d2 - d1例子。
        【解决方案8】:

        //使用 TimeSpan 做这样的事情

          strCurDate = string.Format(DateTime.Now.ToString(), "yyyy/mm/dd");
          FileInfo fiUpdateFileFile = null;
          fiUpdateFileFile = new FileInfo(YourFile Location + Your FileName);
          if (((TimeSpan)(DateTime.Now - fiUpdateFileFile.LastWriteTime)).TotalHours < 24)
          {  
            // do your logic here...
          }
        // you could also get at DateTime.Now.Date() or Day.. depending on what you want to do
        

        【讨论】:

        • 好的,但由于我必须在 //Do 逻辑部分写入该文件,我将如何写入新日期?或者也许写任何 int 会改变 LastWriteTime??
        • 除非它不起作用。查看最后一个文件写入时间的想法很好,但 strCurDate 是错误的(在我现在运行它的系统上给出结果“YYYY-12-DD”),并且无论如何都没有使用。此外,“今天之前的最后更新”(在问题中)与在过去 24 小时内更新不同,给予或采取夏令时更改(在您的答案中)。
        • 谢谢@Jon 我会选择其他逻辑
        • 您始终可以使用 DateTime。现在写入取决于您要写入的进程中的位置。如果文件已打开,您将关闭它并在那时创建 FileInfo 对象,捕获 LastWriteTime并将其存储在字符串变量中.. 但是如果您必须将其写入文件.. 在关闭文件之前添加 DateTime.Now.. 有意义..?对于格式使用小写 yyyymmdd
        • 我实际上更喜欢这种方法。 yyyymmdd 将是年份,然后是分钟,然后是日期。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-15
        • 2012-01-20
        • 1970-01-01
        相关资源
        最近更新 更多