c#DateTime.Equals()工作不正常

c#DateTime.Equals()工作不正常,c#,C#,我试图比较两个DateTime变量,它们具有相同的值 但当我使用Equals方法时,它返回false,表示“不相等” 我的代码是: DateTime date = DateTime.Parse("2/27/2010 1:06:49 PM"); foreach (KeyValuePair<DateTime, List<string>> k in Sample) { if (date.Equals(k.Key)) { Console.WriteLine

我试图比较两个DateTime变量,它们具有相同的值

但当我使用Equals方法时,它返回false,表示“不相等”

我的代码是:

DateTime date = DateTime.Parse("2/27/2010 1:06:49 PM");
foreach (KeyValuePair<DateTime, List<string>> k in Sample)
{
   if (date.Equals(k.Key))
   {
      Console.WriteLine("Yes");
   }
   else {
      Console.WriteLine("No");
   }
}
DateTime date=DateTime.Parse(“2/27/2010 1:06:49 PM”);
foreach(示例中的KeyValuePair k)
{
如果(日期等于(k键))
{
控制台。WriteLine(“是”);
}
否则{
控制台。写入线(“否”);
}
}
字典示例包含以下键:

  • 2018年5月8日上午11:18:00
  • 2018年5月8日上午11:17:46
  • 2010年2月27日下午1:06:49
  • 2018年5月8日上午11:18:08
第三个键值与比较值相同

对于所有的键,我得到的是no作为输出


有人能解释为什么会这样吗?

正如我所评论的,
DateTime
不仅包含秒,还包含毫秒和滴答声。也许他们不平等。但是,您可以使用以下扩展方法仅在几秒钟内进行比较:

public static class DateTimeExtensions
{
    public static bool EqualsUpToSeconds(this DateTime dt1, DateTime dt2)
    {
        return dt1.Year == dt2.Year && dt1.Month == dt2.Month && dt1.Day == dt2.Day &&
               dt1.Hour == dt2.Hour && dt1.Minute == dt2.Minute && dt1.Second == dt2.Second;
    }   
}
样本:

DateTime date1 = DateTime.Parse("2/27/2010 1:06:49 PM", CultureInfo.InvariantCulture);
DateTime date2 = date1.AddMilliseconds(100);
bool equals = date1.EqualsUpToSeconds(date2); // true

这可能是一个文化问题吗? 请尝试使用右侧的
CultureInfo
进行比较

static void Main(string[] args)
{
    var culture = new CultureInfo("en-US", false);
    Dictionary<DateTime, List<string>> Sample = new Dictionary<DateTime, List<string>>();

    Sample.Add( DateTime.Parse("5/8/2018 11:18:00 AM", culture), new List<string>());
    Sample.Add( DateTime.Parse("5/8/2018 11:17:46 AM", culture), new List<string>());
    Sample.Add( DateTime.Parse("2/27/2010 1:06:49 PM", culture), new List<string>());
    Sample.Add( DateTime.Parse("5/8/2018 11:18:08 AM", culture), new List<string>());

    DateTime date = DateTime.Parse("2/27/2010 1:06:49 PM", culture);
    foreach (KeyValuePair<DateTime, List<string>> k in Sample)
    {
        if (date.Equals(k.Key))
        {
            Console.WriteLine("Yes");
        }
        else
        {
            Console.WriteLine("No");
        }
    }
}
static void Main(字符串[]args)
{
var culture=新的CultureInfo(“en-US”,false);
字典示例=新字典();
Sample.Add(DateTime.Parse(“5/8/2018 11:18:00 AM”,区域性),new List());
Sample.Add(DateTime.Parse(“5/8/2018 11:17:46 AM”,区域性),new List());
Add(DateTime.Parse(“2/27/2010 1:06:49 PM”,区域性),newlist());
Sample.Add(DateTime.Parse(“5/8/2018 11:18:08 AM”,文化),new List());
DateTime date=DateTime.Parse(“2/27/2010 1:06:49 PM”,区域性);
foreach(示例中的KeyValuePair k)
{
如果(日期等于(k键))
{
控制台。WriteLine(“是”);
}
其他的
{
控制台。写入线(“否”);
}
}
}

出于好奇,刚刚测试了这个,效果很好

public static void Main()
{
    Dictionary<DateTime, List<string>> Sample = new Dictionary<DateTime, List<string>>();
    Sample.Add( DateTime.Parse("5/8/2018 11:18:00 AM"), new List<string>());
    Sample.Add( DateTime.Parse("5/8/2018 11:17:46 AM"), new List<string>());
    Sample.Add( DateTime.Parse("2/27/2010 1:06:49 PM"), new List<string>());
    Sample.Add( DateTime.Parse("5/8/2018 11:18:08 AM"), new List<string>());    
    DateTime date = DateTime.Parse("2/27/2010 1:06:49 PM");
  foreach (KeyValuePair<DateTime, List<string>> k in Sample)
  {
    if (date.Equals(k.Key))
    {
       Console.WriteLine("Yes");
    }
    else {
       Console.WriteLine("No");
    }
   }
 }      

在您的问题中,您已经证明,即使样本中的日期与匹配的日期相同,但根据
Equal()

您应该调试并尝试比较两个日期的
刻度

试试下面的代码

DateTime date = DateTime.Parse("2/27/2010 1:06:49 PM");
foreach (KeyValuePair<DateTime, List<string>> k in Sample)
{
   //if both Ticks are same, you should expect dates to be equal
   Console.WriteLine(date.Ticks + "-" + k.Key.Ticks);
   if (date.Equals(k.Key))
   {
      Console.WriteLine("Yes");
   }
   else {
      Console.WriteLine("No");
   }
}
DateTime date=DateTime.Parse(“2/27/2010 1:06:49 PM”);
foreach(示例中的KeyValuePair k)
{
//如果两个记号相同,则应该期望日期相等
Console.WriteLine(date.Ticks+“-”+k.Key.Ticks);
如果(日期等于(k键))
{
控制台。WriteLine(“是”);
}
否则{
控制台。写入线(“否”);
}
}
这样,您将在匹配日期的同时记录刻度

你在这里比较两个日期的实际方法应该是

DateTime date = DateTime.Parse("2/27/2010 1:06:49 PM");
foreach (KeyValuePair<DateTime, List<string>> k in Sample)
{
   if (date.Ticks == k.Key.Ticks)
   {
      Console.WriteLine("Yes");
   }
   else {
      Console.WriteLine("No");
   }
}
DateTime date=DateTime.Parse(“2/27/2010 1:06:49 PM”);
foreach(示例中的KeyValuePair k)
{
if(date.Ticks==k.Key.Ticks)
{
控制台。WriteLine(“是”);
}
否则{
控制台。写入线(“否”);
}
}

如果不能解决您的问题,请在此发表评论

DateTime.Equals
(静态或实例)将比较
Ticks
属性。虽然在您看来,这两个日期可能是相同的(由于显示方式的可读性),但它们可能是相同的,也可能不是相同的。滴答是相当高精度的测量(1滴答=100纳秒)

如果
KeyValuePair
中的值来自某个系统生成的日期时间,那么它的值将不同于您使用静态值创建自己的日期时间对象

比如说看这两个日期,

DateTime one = new DateTime(636614784317968133);
DateTime two = new DateTime(636614784317968134);
它们有100纳秒的差异。在addwatch中,它们看起来都一样,但是
Equals
方法将为两者返回false

如果要在毫秒之后删除这些值,可以使用以下代码:

one = one.AddTicks(-one.Ticks % TimeSpan.TicksPerMillisecond);
two = two.AddTicks(-two.Ticks % TimeSpan.TicksPerMillisecond);

完成此操作后,您可以看到两个日期对象的
记号都相同,现在可以进行比较。

等于结构(日期时间),即值类型检查值是否相等,但对于日期时间已经存在,您可以使用它

if (DateTime.Compare(date.Equals,k.Key) == 0)
   {
      Console.WriteLine("Yes");
   }
   else {
      Console.WriteLine("No");
   }

DateTime
不仅包含秒,还包含毫秒和刻度。也许它们不相等你确定它是完全相同的值吗?仅仅因为它们显示相同,并不意味着它们的精度完全相同,etcHow是否正在填充集合?使用日期时间。现在?你能举个例子吗?这很奇怪。我要检查
日期的成员是否与列表中的成员相同。时区可能有一些变化,具体取决于实例的创建方法,也可能有毫秒等方面的差异。您应该定义Datetime的格式以匹配字典中的格式。在这种情况下,示例日期列表的刻度必须不同。日期在秒之前是相同的,但不是以滴答为单位。。在这种情况下,
如果(date.Ticks.Equals(k.Key.Ticks)){/
也会这样做,当然会对他有所帮助。(事实上,我在回答中也添加了这一点)。但这真的很有趣,人们为什么会在比较两个简单的日期时陷入困境。这只是因为日期的
Ticks
属性对于所有人来说都不太常见。请将其中一行代码更改为:
Sample.Add(DateTime.Parse(“2/27/2010 1:06:49.123 PM”),new List();
然后再试一次again@Fabjan这正是我所说的!因为
DateTime.Ticks
是以1/10000000秒为单位的,你可以这样比较:
return dt1.Ticks/10000000==dt2.Ticks/10000000;
这可能会更有效。在他的例子中,示例日期列表的Ticks必须不同。日期直到秒都是相同的但不是在滴答声中,我有同样的情况,看到问题了吗
if (DateTime.Compare(date.Equals,k.Key) == 0)
   {
      Console.WriteLine("Yes");
   }
   else {
      Console.WriteLine("No");
   }