【问题标题】:Is there a way to compare date "strings" in C# without converting the strings?有没有办法在 C# 中比较日期“字符串”而不转换字符串?
【发布时间】:2010-04-26 11:18:09
【问题描述】:

我有两个字段:

string date1 = "04/26/10";
string date2 = "04/25/10";

我怎样才能像这样比较这两个字段?:

if (date2 <= date1)
{
  // perform some code here
}

是否可以在不先将字段转换为单独的日期类型变量的情况下完成此操作?

编辑:我应该提到这些值来自数据库表,其中日期值以字符串格式开头。旧代码...

【问题讨论】:

    标签: c#


    【解决方案1】:

    不,但在 C# 中转换为日期并不难。

    if ( DateTime.Parse(date2,CultureInfo.InvariantCulture) <=  DateTime.Parse(date1,CultureInfo.InvariantCulture))
    
    {
      // perform some code here
    }
    

    CultureInfo 取决于字符串日期在旧版数据库中的格式。见:DateTime formats used in InvariantCulture

    【讨论】:

    • 是的,这看起来很简单。我在想我必须有单独的变量,其中包含转换后的日期值,但是你展示的方式让我绕过了这些额外的变量。谢谢!
    • @Kevin,请注意您的文化设置 - 如果您使用不同的文化(默认或意外)转换美国日期时间,您可能会得到意想不到的结果 :)跨度>
    • 感谢宙斯的提醒。该程序只是一个小批量程序,将在我们的服务器上经常运行。它基本上会读取一个数据库表,比较两个字符串字段(这些字段包含我的问题中的日期),并根据比较更新同一记录上的另一个字段。该程序永远不会在该国以外的任何地方运行,也不会在文化设置未设置为“美国”的服务器上运行。
    • 另外,如果在其他事件中,当对一个值执行 dataType.Parse() 时,如果它不是预期的格式,它会抛出一个错误异常,你需要捕获它.. 仅供参考
    【解决方案2】:

    如果您的日期实际上存储为字符串在数据库中,您似乎无法确定它们在解析之前是否采用有效格式。出于这个原因,我建议对 jle 的答案进行一些小改动:

    DateTime d1, d2;
    if (DateTime.TryParse(date1, out d1) &&
        DateTime.TryParse(date2, out d2) &&
        d2 <= d1)
    {
        // perform some code here
    }
    else
    {
        // strings didn't parse, but hey,
        //at least you didn't throw an exception!
    }
    

    【讨论】:

      【解决方案3】:

      至少您需要分离字符串以便以正确的顺序比较它们。

      如果您想将它们保留为字符串,则需要使用 LARGEST->SMALLEST 单位对它们重新排序,因此:

      yyyy/mm/dd
      

      可以直接比较,但不是你的格式。根据您的格式,您需要拆分它,然后像上面那样重新组合它,或者按正确的顺序比较各个部分。

      话虽如此,使用DateTime.ParseExact 将字符串转换为日期时间是相当容易的。

      【讨论】:

        【解决方案4】:

        通常将日期作为字符串比较是个坏主意。

        但如果您的字符串格式相同(例如,yyyy/mm/dd 表示年,然后是月,然后是天),那么比较可能是有效的。

        【讨论】:

          【解决方案5】:

          它可以通过字符串操作来完成,但归结为有效地比较三组整数,这作为字符串会比转换为日期时间产生更多的开销。为什么要这样做?

          【讨论】:

            【解决方案6】:

            没有。让 .net 框架为您解决这个问题。它将正确识别用户日期设置和格式(使用系统设置、当前线程)并确定月份、年份和日期 - 特别是如果该数据来自例如 sql server。

            【讨论】:

              【解决方案7】:

              最好在进行比较之前对日期进行格式化。根据您的文化信息,比较日期的最安全方法是将日期字符串格式化为“yyyy-mm-dd”。

              DateTime d1, d2;
              string date1 = "04/26/10";
              string date2 = "04/25/10";
              d1 = DateTime.Parse(date1.ToString("yyyy-MM-dd"));
              d2 = DateTime.Parse(date2.ToString("yyyy-MM-dd"));
              if (d1 > d2)
              {
                    //do something
              }
              

              【讨论】:

                【解决方案8】:

                最佳做法是避免将日期作为字符串类型进行比较,并与 C# 的官方 DateTime 对象进行比较。

                如果您的用例需要使用 string 对象进行比较,则:

                • 1st,请确保日期字符串格式为 Lasse V. Karlsen 推荐的 yyyymmdd。
                • 2、使用字符串方法CompareTo比较日期。

                这是该方法在您的情况下的工作方式(使用 C# Online Compiler 进行测试):

                using System;
                public class Program
                {
                    public static void Main()
                    {
                        string fmt = "yyyymmdd";
                        string min = "20201206";
                        string max = "20210810";
                        Console.WriteLine(max.CompareTo(min)); // Output :  1
                        Console.WriteLine(min.CompareTo(max)); // Output : -1
                        string same1 = "20001212";
                        string same2 = "20001212";
                        Console.WriteLine(same1.CompareTo(same2)); // Output : 0
                        Console.WriteLine(same2.CompareTo(same1)); // Output : 0
                        // Summary:
                        // 1 = Greater than string param
                        // -1 = lesser than string param
                        // 0 = equals to string param
                    }
                }
                

                【讨论】:

                  猜你喜欢
                  • 2020-03-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-10-19
                  相关资源
                  最近更新 更多