【问题标题】:How to compate two date values?如何比较两个日期值?
【发布时间】:2011-07-14 16:09:05
【问题描述】:

我有一个输入表格,用户每天在表格中填写当前日期。现在,我需要显示用户未在表单中输入的日期。

我已检索到输入的日期和该月的天数。我不知道如何比较这两个值并打印未输入的日期。

提前致谢。

【问题讨论】:

  • 请您尝试重新表述您的问题 - 我一点都不懂!
  • 阅读文档非常有用。特别是,您可能会遇到这种方法:DateTime.Compare
  • 基本上,我的理解是这样的:日期是在 5/6/11、5/1/11 和 5/21/11 输入的。此开发人员希望发出“2011 年 5 月”,然后是 2011 年 5 月以来不在原始列表中的每个日期
  • @Code - 用户似乎想确定用户未填写表单的日期。所以 DateTime.Compare 不太可能得到想要的结果。当然这个问题并不完全清楚。
  • @Ramhound:是的,我读过标题。那是唯一对我有意义的部分。

标签: c# .net datetime


【解决方案1】:

基本上,您会希望从每月的第一天开始,并为该月的每一天创建一个 DateTime 值。将这些天中的每一天与该月的所有输入值进行比较,如果不匹配,则输出生成的 DateTime。这是一个让你开始的基本算法;您可以根据需要对其进行修改以涵盖您需要的日期范围:

//I leave you the exercise of actually getting the entered dates in DateTime format
List<DateTime> enteredDates = GetEnteredDatesAsDateTimes();
var unenteredDates = new List<DateTime>();

//I assume you want days for the current month; 
//if not you can set up a DateTime using a specified month/year
var today = DateTime.Today;
var dateToCheck = new DateTime(today.Year, today.Month, 1);

//You could also make sure the date is less than the current date,
//or less than a specified "end date".
while (dateToCheck.Month == today.Month)
{
   //uses Linq, which requires .NET 3.5
   if(!enteredDates.Any(d=>d.Date == dateToCheck.Date))
      unenteredDates.Add(dateToCheck);

   //use the below code instead for .NET 2.0
   //bool inList = false;
   //foreach(var date in enteredDates)
   //   if(enteredDate.Date == date.Date)
   //   {
   //      inList = true;
   //      break;
   //   }
   //if(!inList) unenteredDates.Add(dateToCheck);

   dateToCheck = dateToCheck.AddDays(1);
}

//unenteredDates now has all the dates for which the user didn't fill out the form.

了解这是一个 N^2 复杂度算法;您将一个列表的每个元素与另一个列表的每个元素进行比较,期望这两个列表具有大致相等的基数。只要您不检查几个月的日期,它就不应该表现得很糟糕。您可以通过对输入的日期列表进行排序,然后对日期执行二进制搜索而不是线性搜索,将其减少到 NlogN。这增加了您需要编写的代码,但减少了代码需要执行的步骤。

【讨论】:

    【解决方案2】:

    前提是您能够跟踪表单填写的日期。您所要做的就是编写一个包含当前月份长度的循环。

    此时,您只需简单检查一下当前迭代是否存在于您的日期集合中。如果集合中不包含日期,则打印结果。

    System.DateTime.DaysInMonth(int year, int month) 将确定循环的迭代次数。

    您所要做的就是提取当前:月份和年份。

    【讨论】:

      【解决方案3】:

      我能想到的最简单的方法是打印一年中的所有日期,跳过表单中输入的任何日期。例如:

      for(int i=1;i<13;i++){
          String month = Integer.toString(i);
          for(int j=1;j<32;j++){
              String date = month+"/"+Integer.toString(j); 
              if (date in listOfValidDates):
                  if(date in filedDates):
                      continue;
                  System.out.println(date)
              }
           }
      

      更新: 将示例从伪代码更改为 java,因为这是我所知道的与 C# 最相似的语言。

      【讨论】:

      • @KeithS - 老实说,伪代码对用户更有帮助,而不是简单地给他答案。很明显,用户没有能力编写算法,因此如果简单地提供,将无法理解。
      猜你喜欢
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2011-03-01
      • 1970-01-01
      • 2013-05-30
      相关资源
      最近更新 更多