Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在DateTime对象上使用ToString_C#_Datetime_Overloading_Object To String - Fatal编程技术网

C# 在DateTime对象上使用ToString

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": {

在我的数据库中,日期像datetime一样存储,但当我想要执行搜索/筛选时,我希望它仅基于日期,而忽略确切的时间。我花了很多时间想办法,最后我自己找到了一个可行的解决方案:

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
进行比较。如果这样做,可能会在夏令时转换期间引入错误。相反,您应该使用UTC
DateTime
值,或者使用
DateTimeOffset

是否尝试调试if
o.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
}