如何比较两个可能为空的时间??DateTime.Compare()不行

牧原 2017-05-22 05:36:52
要对两个时间类型(DateTime)数据比较大小,但有一个可能为空,使用DateTime.Compare()报如下错误:
The best overloaded method match for 'System.DateTime.Compare(DateTime, DateTime)' has some invalid arguments
cannot convert from 'System.DateTime?' to 'System.DateTime'
...全文
979 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
牧原 2017-05-28
  • 打赏
  • 举报
回复
非常感谢各位的解答,问题已经得到解决,可用的方法如下: 1、使用dateTime1.CompareTo(dateTime2),若为1,dateTime1>dateTime2;为-1,dateTime1<dateTime2,为0则相等; 2、直接使用>、>=、<、<=和==进行比较即可。 我结贴了。。。。
by_封爱 版主 2017-05-26
  • 打赏
  • 举报
回复
其实 我们想多了. 看7#的代码 直接==就可以判断了.

            DateTime d1 = DateTime.Now;
            DateTime? d2 = null;
            var rs = d1 == d2;
            Console.WriteLine(rs);
by_封爱 版主 2017-05-26
  • 打赏
  • 举报
回复
引用 12 楼 zff_1917double 的回复:
那怎么比较这样的时间类型数据呢???
注意看3# 说的很清楚了. System.DateTime.Compare方法中2个参数 都是datetime..但是你其中一个是datetime? 所以这代码根本不通过编译 直接报错了. 因为虽然他们名字差不多 但是多了一个? 会提示参数无效的. 所以你可以直接使用datetime.CompareTo来比较 比如

DateTime d1 = DateTime.Now;
DateTime? d2 = null;
var rs = d1.CompareTo(d2)==0;
Console.WriteLine(rs);
需要注意的是 你自己说了 有一个可能为空.. 所以为空的要在后面就行了,
牧原 2017-05-26
  • 打赏
  • 举报
回复
引用 10 楼 diaodiaop 的回复:
[quote=引用 5 楼 wang_peng_yl 的回复:] DateTime?看这样的写法 你以前肯定不是开发C#程序的,最起起码不是开发winForm的,纯C#里没有这样干的, C#不差那2byte的内存 如果必需为null,那肯定需要先判断一下,不为空了再比较
我到是觉得你好像不是做winform或者是c#的 因为根据数据库的映射关系 如果数据库的字段是

create table xx
(
 id int identity(1,1) primary key not null,
 name varchar(100) null,
 age int null,
 regtime datetime null,
)
那么设个生成对应的model就是

public class xx
{
 public int id{get;set;}
 public name {get;set;}
 public int? age {get;set;}
 public datetime? regtime{get;set}
}
这是很正常很普通的好吧... 而且时间为空或者数字为空 这种需求 很普通. 至于你没遇到,那是你的问题.不能能说这些东西在c#里没有这么干的.. 无知不是装厉害的本钱......[/quote] 那怎么比较这样的时间类型数据呢???
吉普赛的歌 2017-05-26
  • 打赏
  • 举报
回复
专门写一个比较方法不就得了?不需要纠结。

public bool CompareDateTime(DateTime? d1, DateTime? d2){
//todolist
}
但事实上, 没有必要把这种值类型上升为引用类型, 搞出这种不方不便的东西出来。 在数据库里, 不要定义可空的字段类型, 统一给定默认值。

create table t(
    birthday datetime not null default('1900-01-01'),
    addTime datetime not null default(getdate())
)
逻辑上更清晰, 索引的效率也更高。
ilikeff8 2017-05-26
  • 打赏
  • 举报
回复

            DateTime? time1 = new DateTime(2017, 1, 1, 1, 1, 1);
            DateTime? time2 = new DateTime(2017, 1, 1, 1, 1, 2);

            bool isBig = time2 > time1; // true

            DateTime? time3 = null;

            isBig = time3 > time1; // false
牧原 2017-05-26
  • 打赏
  • 举报
回复
引用 14 楼 diaodiaop 的回复:
其实 我们想多了. 看7#的代码 直接==就可以判断了.

            DateTime d1 = DateTime.Now;
            DateTime? d2 = null;
            var rs = d1 == d2;
            Console.WriteLine(rs);
还是得用CompareTo(),“==”只能判断是否相等,并不能比较大小。CompareTo()有两个模板如下:
public int CompareTo(DateTime value);
public int CompareTo(object value);
牧原 2017-05-23
  • 打赏
  • 举报
回复
引用 2 楼 stherix 的回复:
DateTime是结构而非类,是不可能为空的 使用DateTime?的话,肯定先要判断是否为空
用数据库的一张视图生成的模型字段就是DateTime?类型,就是提前判断给字段是否为空,再用DateTime.Compare进行判断一样会报错,因为传进去的参数就不能为DateTime?类型。
正怒月神 2017-05-23
  • 打赏
  • 举报
回复
DateTime dt = DateTime.Parse("2017/02/20"); DateTime? dt1 = DateTime.Parse("2017/02/20"); Console.WriteLine(dt==dt1);
xian_wwq 2017-05-23
  • 打赏
  • 举报
回复
变量进行初始化 能够避免很多不必要的麻烦
wang_peng_yl 2017-05-23
  • 打赏
  • 举报
回复
DateTime?看这样的写法 你以前肯定不是开发C#程序的,最起起码不是开发winForm的,纯C#里没有这样干的, C#不差那2byte的内存 如果必需为null,那肯定需要先判断一下,不为空了再比较
秋的红果实 2017-05-23
  • 打赏
  • 举报
回复
你是不是把一个时间变量给声明成可空类型了,例如:

DateTime t1?=……
xuzuning 2017-05-23
  • 打赏
  • 举报
回复
System.DateTime.Compare(DateTime, DateTime) 要求两个参数都是 DateTime 类型的,而你的却是 DateTime? 类型的,自然无法比较 再说 DateTime 也不可为空 但是 DateTime? a = null; 这样写是可以通过编译的 如
DateTime? a = null;
DateTime b = DateTime.Now;
var c = b.CompareTo(a); //1
是不会有问题的
stherix 2017-05-23
  • 打赏
  • 举报
回复
DateTime是结构而非类,是不可能为空的 使用DateTime?的话,肯定先要判断是否为空
星空蔚蓝 2017-05-23
  • 打赏
  • 举报
回复

try{
     DateTime? startime = null;
     DateTime? endtime = null;
     sdtime = Convert.ToDateTime("2017-04-11 08:00:00");
     endtime  = Convert.ToDateTime("2017-04-11 20:00:00");
     TimeSpan ts = startime - endtime;//时间比较
     if (ts.TotalSeconds > 0) {}
}catch (Exception ex)
            {throw; }
by_封爱 版主 2017-05-23
  • 打赏
  • 举报
回复
引用 5 楼 wang_peng_yl 的回复:
DateTime?看这样的写法 你以前肯定不是开发C#程序的,最起起码不是开发winForm的,纯C#里没有这样干的, C#不差那2byte的内存 如果必需为null,那肯定需要先判断一下,不为空了再比较
我到是觉得你好像不是做winform或者是c#的 因为根据数据库的映射关系 如果数据库的字段是

create table xx
(
 id int identity(1,1) primary key not null,
 name varchar(100) null,
 age int null,
 regtime datetime null,
)
那么设个生成对应的model就是

public class xx
{
 public int id{get;set;}
 public name {get;set;}
 public int? age {get;set;}
 public datetime? regtime{get;set}
}
这是很正常很普通的好吧... 而且时间为空或者数字为空 这种需求 很普通. 至于你没遇到,那是你的问题.不能能说这些东西在c#里没有这么干的.. 无知不是装厉害的本钱......
紫魂一号 2017-05-23
  • 打赏
  • 举报
回复

DateTime? dt1, dt2;
if(dt1.HasValue && dt2.HasValue)
{
     if(dt1.Value.CompareTo(dt2.Value))
}
crystal_lz 2017-05-22
  • 打赏
  • 举报
回复
你都知道 可能会有空 判断之前就不能先判断是否为空?

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧