C# 在DateTime对象上使用ToString
在我的数据库中,日期像datetime一样存储,但当我想要执行搜索/筛选时,我希望它仅基于日期,而忽略确切的时间。我花了很多时间想办法,最后我自己找到了一个可行的解决方案:C# 在DateTime对象上使用ToString,c#,datetime,overloading,object-to-string,C#,Datetime,Overloading,Object To String,在我的数据库中,日期像datetime一样存储,但当我想要执行搜索/筛选时,我希望它仅基于日期,而忽略确切的时间。我花了很多时间想办法,最后我自己找到了一个可行的解决方案: string val = rule.Data; if (!string.IsNullOrEmpty(val)) { switch (rule.Field) { case "Date": {
string val = rule.Data;
if (!string.IsNullOrEmpty(val))
{
switch (rule.Field)
{
case "Date": {
DateTime parsedDate = DateTime.ParseExact(
val,
"dd/MM/yyyy",
CultureInfo.InvariantCulture);
var pYear = parsedDate.Year;
var pMonth = parsedDate.Month;
var pDay = parsedDate.Day;
rows = rows.Where(o => o.Date >= parsedDate && o.Date <= new DateTime(pYear, pMonth, pDay, 12, 59, 40)); break;
}
}
当我尝试此操作时,代码不会中断,但它也不会过滤数据。我总是得到空的结果。我猜
o.Date.ToString(“dd/MM/yyyy”)
就是问题所在。我不知道像这样对DateTime对象使用ToString()
是否可以。在这个例子中,我使用的是ToString()
也得到了一个类似于我在这里提供的格式类型-ToString(“dd/MM/yyyy”)
——但在我的例子中,ToString()
并没有在任何地方重载。这是操作DateTime对象的标准方法,还是我找不到预定义toString()
的位置。最后,您能否提供一个基于上述代码的工作示例。我认为,如果您需要比较日期,那么您可以只获取DateTime的日期组件,并将其与预定义值进行比较。这应该更快,因为不需要每次都将日期转换为字符串。因此,您可以首先像这样获取参考值DateTime.ParseExact(值,“dd/MM/yyyy”,CultureInfo.invariantculture)
。您也可以使用DateTime的构造函数来编写它。根据区域性o.Date是什么,请尝试:
string val = rule.Data;
if (!string.IsNullOrEmpty(val))
{
switch (rule.Field)
{
case "Date":
{
rows = rows.Where(o => o.Date.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) ==
DateTime.ParseExact(val,
"dd/MM/yyyy",
CultureInfo.InvariantCulture));
break;
}
}
}
或者可以设置当前线程的区域性:
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
编辑:如果您避免使用字符串,则该选项应该有效:
e、 g
你根本不应该使用字符串。如果它是数据库中的一个
datetime
(或类似),而在c#code中是一个datetime
,那么就没有理由使用字符串作为中间步骤
此外,您还应密切注意
日期时间
值的.Kind
属性。而且你永远不应该将本地时间与DateTime.Now
进行比较。如果这样做,可能会在夏令时转换期间引入错误。相反,您应该使用UTCDateTime
值,或者使用DateTimeOffset
值 是否尝试调试ifo.Date.ToString(
真的有问题吗?Date.ToString
不需要重载就可以将Date
正确格式化为string
对象。我使用DateTime submitDate=DateTime.Now.Date;
以您想要的格式获取今天的日期。然后我将其输入到如下表中:mes.submitDate=submitDate;
-为m工作e、 嗯,我读过一些文章。它似乎应该可以工作,我的val
变量有值“03/06/2013”
,当我给出ToString(“dd/MM/yyyy”)的格式类型时
我认为如果某个数据与日期匹配,我应该得到结果,但我没有得到结果。如果不是我使用的格式,我看不出有太多的错误空间,那么会是什么呢?ToString()应该可以工作。至少我使用以下代码:date.ToString(“yyyyMMdd”)是的,我刚硬编码了几个测试用例-ToString(“yyyy-MM-dd”)==“2013-06-03”
正在返回预期的结果,而ToString(“dd/MM/yyyy”)==“03/06/2013”
正在返回空结果,那么这可能是ToString(“dd/MM/yyyy”)吗< /代码>不是某种原因的有效格式吗?不,将文化设置到线程不是一个选项,但是您的答案看起来像我所看到的两个之间的某种混合。也许我会考虑它,尽管我喜欢在第二个示例中不使用解析的事实。
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
DateTime maxDate = new DateTime(2020, 11, 17);
if (DateTime.Now.Date > maxDate)
{
// this will just work regardless of setting culture
}