我有一个名为BoughtDate
的可为空的Date属性。
我正在尝试以下方法:
if( item.BoughtDate.Value.Equals( DateTime.MaxValue) ) item.BoughtDate= null;
也尝试了这个:
if( item.BoughtDate.Equals( DateTime.MaxValue) ) item.BoughtDate=null;
调试时,我的BoughtDate
和DateTime.MaxValue
似乎完全相同 - 但它说的不一样(不会将我的item.BoughtDate
设置为空)
为什么我的比较不起作用?
答案 0 :(得分:6)
@PaulSuart在注释中指出的问题可能是毫秒精度。 DateTime.MaxValue.TimeOfDay
是{23:59:59.9999999}
,但您的BoughtDate.TimeOfDay
可能是{23:59:59.9990000}
,因此它们并不相同。
我要做的只是比较日期,我认为在大多数情况下这已经足够了:
if( item.BoughtDate.Value.Date.Equals( DateTime.MaxValue.Date) ) item.BoughtDate= null;
答案 1 :(得分:0)
尝试使用DateTime.Compare
https://msdn.microsoft.com/pl-pl/library/system.datetime.compare(v=vs.110).aspx
public static void Main()
{
DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0);
DateTime date2 = new DateTime(2009, 8, 1, 12, 0, 0);
int result = DateTime.Compare(date1, date2);
string relationship;
if (result < 0)
relationship = "is earlier than";
else if (result == 0)
relationship = "is the same time as";
else
relationship = "is later than";
Console.WriteLine("{0} {1} {2}", date1, relationship, date2);
}
你的例子中的可能就是这样:
if(DateTime.Compare(item.BoughtDate.Value,DateTime.MaxValue) == 0) item.BoughtDate=null;
答案 2 :(得分:0)
我对你的案子进行了快速测试:
static void Main(string[] args)
{
DateTime? BoughtDate = DateTime.MaxValue;
//subtract 100 milliseconds from it
BoughtDate = BoughtDate.Value.AddMilliseconds(-1);
Console.WriteLine(BoughtDate.Value.Hour); //23
Console.WriteLine(DateTime.MaxValue.Hour); //23
Console.WriteLine(BoughtDate.Value.Minute); //59
Console.WriteLine(DateTime.MaxValue.Minute); //59
Console.WriteLine(BoughtDate.Value.Second); //59
Console.WriteLine(DateTime.MaxValue.Second); //59
Console.WriteLine(BoughtDate.Value.Year); //9999
Console.WriteLine(DateTime.MaxValue.Year); //9999
Console.WriteLine(BoughtDate.Value.Month); //12
Console.WriteLine(DateTime.MaxValue.Month); //12
Console.WriteLine(BoughtDate.Value.Day); //31
Console.WriteLine(DateTime.MaxValue.Day); //31
Console.WriteLine(BoughtDate.Value.Millisecond); //998
Console.WriteLine(DateTime.MaxValue.Millisecond); //999
if (BoughtDate.Value.Equals(DateTime.MaxValue))
{
Console.WriteLine("equals comparison succeeded"); //doesn't get printed
}
}
从原始值减少仅一毫秒后,它不会在if块中通过相等检查条件,但如果您在快速监视窗口中看到BoughtDate
的值,它们看起来完全相同<正如你所说的那样(因为它只显示年,月,日,小时,分钟和秒)。
仅在展开+
符号时显示毫秒部分。
因此,您的日期时间变量必须以毫秒为单位进行区分,即使它们看起来一目了然。
答案 3 :(得分:0)
如果您从SQL-Server获取日期,我认为您可以在以下链接中找到答案。 SQL-Server仅支持23:59:59.997之间的时间范围,这可能导致几个小于C#支持的小节。你可以比较@Pikoh已经提到过的日期。
https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql