8

在 .NET 3.5 上使用 NUnit 2.2,以下测试在使用 DateTime.Equals 时失败。为什么?

[TestFixture]
public class AttributeValueModelTest
{
    public class HasDate
    {
        public DateTime? DateValue
        {
            get
            {
                DateTime value;
                return DateTime.TryParse(ObjectValue.ToString(), out value) ? value : new DateTime?();
            }
        }

        public object ObjectValue { get; set; }
    }

    [Test]
    public void TwoDates()
    {
        DateTime actual = DateTime.Now;
        var date = new HasDate {ObjectValue = actual};
        Assert.IsTrue(date.DateValue.Value.Equals(actual));
    }
}
4

5 回答 5

16

日期不相等。TryParse 会掉一些滴答声。比较刻度值。

对于一次测试运行:

Console.WriteLine(date.DateValue.Value.Ticks);
Console.WriteLine(actual.Ticks);

产量:

633646934930000000
633646934936763185
于 2008-12-12T20:43:57.623 回答
3

问题不是真正的 TryParse,而是实际上是 ToString()。

DateTime 对象以精确到百万分之一秒的精度(如果不是精确度)开始。ToString() 将其转换为字符串,精度仅为一秒。

TryParse 正在尽其所能提供给它的东西。

如果您添加格式说明符(沿 行"yyyy-MM-dd HH:mm:ss.ffffff"),它应该可以工作。

于 2008-12-12T21:16:00.147 回答
1

要指定包含所有精度的格式,可以使用 String.Format() 方法。James 给出的示例如下所示:

String.Format("{0:yyyy-MM-dd HH:mm:ss.ffffff}", ObjectValue);

我不知道当你传递一些不是约会的东西时会发生什么。

也许更简单的方法是在您已经有了日期对象时添加一个特殊情况:

    public DateTime? DateValue
    {
        get
        {
            DateTime value = ObjectValue as DateTime;
            if (value != null) return value;
            return DateTime.TryParse(ObjectValue.ToString(), out value) ? value : new DateTime?();
        }
    }
于 2008-12-12T22:36:18.490 回答
0

我不知道这在 .NET 中是否相同,但在 Java 中,equals 通常只会在实例相同的情况下进行比较,而不是在值相同的情况下进行比较。相反,您想使用 compareTo。

于 2008-12-12T20:34:48.407 回答
0

public DateTime? DateValue
        {
            get
            {
                DateTime value;
                bool isDate = DateTime.TryParse(ObjectValue.ToString(), out value); 
                return isDate ? new DateTime?(value) : new DateTime?();
            }
        }

于 2008-12-12T20:37:49.350 回答