在C#中比较日期

3
我目前在做一个小项目,遇到了一点问题。我希望我的程序可以在启动时调用方法 CheckDate。这个方法会读入一个 .txt 文件来查看保存的最后日期,格式为 (yyyy/mm/dd)。然后它会将其与今天的日期进行比较,如果不同则继续执行一些指令。我已经阅读了这里的文档here,但是找不到最适合我的需要的方法。
问题1:有没有办法以 (yyyy/mm/dd) 格式获取今天的日期?
问题2:在C#中比较日期的最简单方法是什么?
提前感谢你的帮助。

你目前如何读取字符串?你需要将其解析为 DateTime 对象,并将其与 DateTime.Today 进行比较。不要尝试将 DateTime.Today 转换为字符串,然后进行比较。DateTime 对象内置了许多日期/时间功能的逻辑,因此您无需重新发明它。 - David
我目前正在逐行读取我的.txt文件。 - phadaphunk
8个回答

7
1. DateTime.Now.ToString("yyyy/MM/dd")
2. DateTime.Parse(input).Date == DateTime.Now.Date

3
DateTime.Parse(input).Date - 这里存在一个潜在的运行时错误 :) (注:这句话的意思是,该代码可能会在运行时出现错误,需要进一步检查和修复。) - David
2
他说最简单的方法,他没有提到验证:D。而且找到TryParse也不是很难。 - Bashwork

3
你可以通过格式化日期来获得今天的日期字符串。
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",以确保使用/而不是任何系统日期分隔符。 - Jon Hanna
@JonHanna 只要您以相同的方式解析两个日期,那么这就不重要了。 - Chase
@Chase 这正是问题所在。很长一段时间,这个机器会以“2011/12/16”的格式编写和分析您的字符串,因为默认设置为dd/MM/yyyy,那么/就会变成/。我改变了它,因为我更喜欢标准格式,所以现在它将采用您的格式字符串来生成2011-12-16。如果此程序正在运行,则会出现错误。 - Jon Hanna
如果每次解析两个日期,就不会有冲突。 - Chase

1
什么是在C#中比较日期的最简单方法?
将其存储为DateTime,而不是文本。
比较变量。
如果两个都有时间,则比较a.Date == b.Date。
今天是否有以(yyyy/mm/dd)格式获取日期的方法?
有。但这是错误的。解析错误的输入并比较已解析的数据。

1
如何将DateTimeDateTime的形式存储在.txt文件中,就像OP所问的那样? - Kirk Woll
好的,但我对此有点新。如果我没错,streamwriter和streamreader是用于处理字符串的,是吧?这就是为什么我卡在了转换为字符串的部分上。我该如何将datetime存储在我的.txt文件中? - phadaphunk
@KirkWoll,这正是我一开始应该问的方式。 - phadaphunk

1

1

根据问题的字面意思:

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. 你应该反过来做,先读取字符串,解析日期,然后进行比较。


0

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


0
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。 - MethodMan

0

//使用 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”吗? - phadaphunk
2
除了它不起作用。查看最后一次文件写入时间的想法很好,但是strCurDate是错误的(在我的系统上运行它现在会给出结果“YYYY-12-DD”),而且也没有被使用。此外,“今天之前最后更新”(在问题中)与在过去24小时内更新相比有所不同,可能会受到夏令时变化的影响(在您的答案中)。 - Jon Hanna
谢谢 @Jon,我会选择另一种逻辑。 - phadaphunk
你可以随时使用DateTime.Now来编写,这取决于你希望在进程的哪个阶段进行编写。如果文件已打开,您将关闭它并在此时创建FileInfo对象,捕获LastWriteTime并将其存储在字符串变量中..但是,如果您必须将其写入文件,则在关闭文件之前添加DateTime.Now。明白了吗?对于格式,请使用小写yyyymmdd。 - MethodMan
1
我一般更喜欢这种方法。yyyymmdd将是年份,接着是分钟,最后是日期。 - Jon Hanna
将其与今天的日期进行比较,如果不相同,则不等同于“不在过去24小时内”。上次保存日期可能是在晚上11点完成的,下一次运行可能只有一个小时后,并且在新日期上运行。 - Austin Salonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接