我有两种类型的日期,一种是DateTime
格式,另一种是string
格式,这两种日期的格式如下:
yyyy-MM-dd HH: mm: ss
我想删除HH: mm: ss
,因为我需要在循环中比较这些日期以迭代数据库。问题是CalendarSelectionDate
事件返回了其中一个日期,小时,分钟和秒甚至设置为0.任何人都有最好的方法吗?
更新
if (DateTime.TryParseExact(reader["data"].ToString(), "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt)){...}
代码行为返回无效日期,特别是如果我已经12/05/15 ......代码将返回1/01/0001
答案 0 :(得分:4)
如果您想在没有小时的情况下比较DateTime
个对象,可以使用Date
属性:
if (myDbDate.Date != myUserDate.Date) { }
您也可以使用ToString()将日期转换为字符串,但请注意,如果日期为字符串,则日期为notoriously very hard thing to deal with:
if (myDbDate.ToShortDateString() != myUserDate) { }
或者如果您非常确定自己的格式,可以使用自定义日期格式:
if (myDbDate.ToString("yyyy-MM-dd") != myUserDate) { }
根据我自己和个人的经验,自动将字符串解析为日期(DateTime.Parse
或TryParse
)通常会产生非常随机的结果。您似乎永远不知道.Net将决定使用哪种格式(dd/MM
或MM/dd
?)。
使用ParseExact
或TryParseExact
解决了这个问题,并允许进一步处理日期(例如,添加天数)。但是,对于初始问题中的简单比较,因为您已经锁定了#34;代码中的日期格式,它没有太大变化(可能是性能方面,我不知道),并且将日期转换为字符串要比其他方式简单得多
话虽这么说,我继续假设比较是"是不同的"。如果比较是"晚于/早于",那么投射到某个日期确实是正确的解决方案。
答案 1 :(得分:2)
首先,您必须了解DateTime
没有格式。它仅包含描述特定时间点的信息。格式适用于DateTime
的字符串表示形式。根据您的需要,您可以使用DateTime.Date
,它会返回具有相同年,月和日值的新DateTime
,但时间设置为上午12点。与DateTime.ParseExact
一起,您可以将string
解析为DateTime
,然后仅比较Date
部分。
var someDate = DateTime.ParseExact(stringValue, "yyyy-MM-dd HH: mm: ss");
if(someDate.Date != otherDate.Date)
{
}
答案 2 :(得分:0)
要获取任何DateTime
的基础日期,只需使用Date
属性。
DateTime.Now.Date