有没有办法比较C#中的日期“字符串”而不转换字符串?

时间:2010-04-26 11:18:09

标签: c#

我有两个字段:

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

如何比较这两个字段?:

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

这可以在没有先将字段转换为单独的日期类型变量的情况下完成吗?

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

8 个答案:

答案 0 :(得分:40)

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

if ( DateTime.Parse(date2) <=  DateTime.Parse(date1))

{
  // perform some code here
}

答案 1 :(得分:13)

如果您的日期实际存储为数据库中,那么您似乎无法确定它们在解析之前是否处于有效格式。出于这个原因,我建议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!
}

答案 2 :(得分:5)

至少你需要分开字符串,以便按照正确的顺序进行比较。

如果你想把它们保留为字符串,那么你需要用LARGEST-&gt; SMALLEST单位重新排序它们,所以这个:

yyyy/mm/dd

可以直接比较,但不能比较你的格式。使用您的格式,您需要将其拆分,并像上面一样重新组合,或者按照正确的顺序比较各个部分。

话虽如此,使用DateTime.ParseExact将字符串转换为DateTime相当容易。

答案 3 :(得分:2)

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

但如果您的字符串采用相同的格式(例如yyyy/mm/dd表示年数,则为月数,则为天),则比较可能有效。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

在进行比较之前,最好先格式化日期。根据您的cultureinfo,比较日期最安全的方法是将日期字符串格式化为“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
}

答案 7 :(得分:0)

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

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

  • 首先,确保日期字符串格式为 Lasse V. Karlsen 推荐的 yyyymmdd
  • 第二,使用字符串方法CompareTo来比较日期。

以下是该方法在您的案例中的工作方式(使用 C# 在线编译器对此进行测试):

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
    }
}