如何比较DateTime类型数据的大小

1 Equals 方法

返回一个值,该值指示两个 DateTime 对象,或者一个 DateTime实例和另一个对象或 DateTime是否具有相同的值。 (MSDN)

下面通过实例代码来对Equals 方法的使用进行说明。

 

代码片段1

DateTime d1 = System.DateTime.Now;
Console.WriteLine("d1={0}", d1);
Thread.Sleep(1000);
DateTime d2 = System.DateTime.Now;
Console.WriteLine("d2={0}", d2);
Console.WriteLine("d1.Equals(d2)={0}", d1.Equals(d2));
Console.WriteLine();

d1与d2 保存系统当前时间,此处两者之间相差1000毫秒(原因呢?)。使用DateTime 对象的实例方法Equals对两者的值(记住:是比较两者的值!)进行比较,相等返回true,否则返回false。很显然,此处返回false,因为d1与d2的值相差1000毫秒,能相等吗,呵呵。

运行程序,结果如下:

 

 

我们查看Equals方法的定义,了解到方法定义如下:

Equals方法的定义还有另外两种形式,详情如下:

 

接着介绍Equals方法的应用。

 

代码片段2(接代码片段1)

DateTime d3 = d1;    
Console.WriteLine("d3 = d1={0}", d3);
Console.WriteLine("d1.Equals(d3)={0}", d1.Equals(d3));
Console.WriteLine();

将d1赋值给d3很显然,两者值相等。

运行程序,结果如下:

 

代码片段3(接代码片段2)

Console.WriteLine("DateTime.Equals(d1, d2)={0}", DateTime.Equals(d1, d2));
Console.WriteLine("DateTime.Equals(d1, d3)={0}", DateTime.Equals(d1, d3));

此处使用静态方法Equals来对d1d2d3进行值相等(同样比较值)比较。结果和前面一致。如下图:

 

代码片段4(接代码片段3)

很显然,下面得介绍最后一种Equals方法的使用了。

该方法重写 ValueType.Equals(Object)方法。

ValueType.Equals(Object)方法接收object入参。

ValueType.Equals(Object)方法返回:实例具有相同的类型并表示相同的值,则为 true;否则为 false

此处与代码片段1介绍的Equals方法的异同点就不赘述了,很容易知晓。

上代码:

Console.WriteLine();
DateTime d100 = System.DateTime.Now.Date;
Console.WriteLine("d100={0}", d100);
string d200 = "2013/9/28 0:00:00";
Console.WriteLine("[string]d200={0}", d200);
Console.WriteLine("d100.Equals(d200)={0}", d100.Equals(d200));
Console.WriteLine();

代码运行结果:

此处,d100 d200 打印出的值完全一致,但是两者类型不一致,所以结果是false。

再次提醒:实例具有相同的类型表示相同的值才返回true

 

代码片段5(接代码片段4)

DateTime d300 = System.DateTime.Now.Date;
Console.WriteLine("d300={0}", d300);
Console.WriteLine("d100.Equals(d300.ToString())={0}", d100.Equals(d300.ToString()));
Console.WriteLine("d100.Equals((object)d300)={0}", d100.Equals((object)d300));
Console.WriteLine();

结果如下:

代码片段5中,将DateTime类型的变量d300转换成字符串类型和object类型数据,再与d100进行相等比较。

很显然,将d300转换成字符串后与d100比较,结果为false,两者类型不一致。而转换成object类型再与d100比较时,值为true,那是因为比较时系统会将object类型的d300再次转换成DateTime类型,所以两者不光值相等,类型也相同,所以返回true

最后,大家可能会问,那使用“==”操作符对时间类型数据进行时,得到的结果会与使用Equals方法的结果一致吗?

直接在前面的代码中插入(插入哦,偷笑)如下代码:

Console.WriteLine("d1==d2={0}", d1 == d2);(插入代码片段1)
Console.WriteLine("d1==d3={0}", d1 == d3);(插入代码片段2)
Console.WriteLine("d1==d2={0}", d1 == d2);(插入代码片段3)
Console.WriteLine("d1==d3={0}", d1 == d3);(插入代码片段3)
Console.WriteLine("d100==d200={0}", d100 == d200);(插入代码片段4)
此处报错,很显然,字符串怎么能和时间进行比较呢,这点编译器都知道。(呵呵,调侃一下)
Console.WriteLine("d100==d300.ToString()={0}", d100 == d300.ToString());(插入代码片段5)
此处同样报错,原因同前。
Console.WriteLine("d100==(object)d300={0}", d100 == (object)d300);(插入代码片段5)
此处同样报错,提示:运算符“==”无法应用于“System.DateTime”和“object”类型的操作数。(看来ValueType.Equals(Object)方法还是有作用的。)

结果如下:


 由结果可以看出,使用“==”操作符对时间类型数据进行时,得到的结果与使用Equals方法的结果一致(当然,前提是能使用“==”操作符得情况下)。

还有个问题,得探讨一下。我们知道,实例化一个DateTime类型的对象时,会默认给该对象一个值的。那我们在开发时,怎样判断该对象此时的值是初始化时的默认值还是重新赋过的值呢,方法如下:

DateTime day30 = new DateTime();
Console.WriteLine("day30={0}", day30);
bool comRes30 = day30.Equals(DateTime.MinValue);
Console.WriteLine("day30.Equals(DateTime.MinValue)={0}", comRes30);

运行程序,得到:

通过结果,我们知道,这个默认值为“0001/1/1 0:00:00,该值与DateTime.MinValue值一致,所以只需与DateTime.MinValue比较即可。

 

下面介绍Compare方法的使用。

 

2.Compare方法

对两个 DateTime的实例进行比较,并返回一个指示第一个实例是早于、等于还是晚于第二个实例的整数。 (MSDN)

下面通过实例代码来对Compare方法的使用进行说明。

 

代码片段1

DateTime day1 = System.DateTime.Now;
Console.WriteLine("day1={0}", day1);           
DateTime day2 = System.DateTime.Now;
Console.WriteLine("day2={0}", day2);
Thread.Sleep(1000);
DateTime day3 = System.DateTime.Now;
Console.WriteLine("day3={0}", day3);
Console.WriteLine("DateTime.Compare(day1,day2)={0}", DateTime.Compare(day1, day2));
Console.WriteLine("DateTime.Compare(day2,day1)={0}", DateTime.Compare(day2, day1));
Console.WriteLine("DateTime.Compare(day1,day3)={0}", DateTime.Compare(day1, day3));
Console.WriteLine("DateTime.Compare(day3,day1)={0}", DateTime.Compare(day3, day1));
Console.WriteLine();

运行结果:

day1day2值相等,day3值晚了1000ms。所以,day1day2比较时,返回0day1day3比较时返回-1或者1

代码片段2(接代码片段1)

DateTime day10 = System.DateTime.Now;
Console.WriteLine("day10={0}", day10);
Thread.Sleep(1000);
DateTime day20 = System.DateTime.Now;
Console.WriteLine("day20={0}", day20);
Console.WriteLine("day10.CompareTo(day20)={0}", day10.CompareTo(day20));
Console.WriteLine("day20.CompareTo(day10)={0}", day20.CompareTo(day10));
Console.WriteLine();

运行结果:

此处不做过多解释。

 

CompareTo方法也有两种形式,如下:

两者的关系与Equals方法中所用的说明类似,不再赘述。

 

好的,就到这里了。大笑难过委屈快哭了

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值