在.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));
}
}
答案 0 :(得分:14)
日期不相等。 TryParse会丢掉一些滴答声。比较Tick值。
一次试运行:
Console.WriteLine(date.DateValue.Value.Ticks);
Console.WriteLine(actual.Ticks);
收率:
633646934930000000
633646934936763185
答案 1 :(得分:3)
问题不在于TryParse,实际上是ToString()。
DateTime对象以精确度(如果不是准确度)开始,下降到百万分之一秒。 ToString()将其转换为字符串,精度仅为一秒。
TryParse正在尽其所能地发挥作用。
如果添加格式说明符(沿"yyyy-MM-dd HH:mm:ss.ffffff"
行),它应该有用。
答案 2 :(得分:1)
要指定包含所有精度的格式,可以使用String.Format()方法。詹姆斯给出的例子如下:
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?();
}
}
答案 3 :(得分:0)
我不知道这在.NET中是否相同,但在Java中,equals通常只会在实例相同时进行比较,而不是在值相同的情况下进行比较。你想要使用compareTo。
答案 4 :(得分:0)
public DateTime? DateValue
{
get
{
DateTime value;
bool isDate = DateTime.TryParse(ObjectValue.ToString(), out value);
return isDate ? new DateTime?(value) : new DateTime?();
}
}