2010-04-26 25 views
12

我有两个领域:有没有办法在C#中比较日期“字符串”而不转换字符串?

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

我怎样才能比较喜欢这两个字段,以便?:

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

可以这样不先转换领域的独立日期类型的变量做了什么?

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

回答

33

不,但它不难转换为C#中的日期。

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

{ 
    // perform some code here 
} 
+0

是的,看起来很简单。我想我必须有单独的变量和转换后的日期值,但是你显示的方式让我可以解决这些额外的变量。谢谢! – Kevin 2010-04-26 11:22:39

+1

@凯文,只是要小心你的文化设置 - 如果你使用不同的文化(默认或偶然)转换美国日期时间,你可能会以意想不到的结果:) – RYFN 2010-04-26 11:42:02

+0

感谢您的单挑,宙斯。该程序只是一个小批量程序,将在我们的服务器上经常运行。它将基本上读取数据库表,比较两个字符串字段(这些字段包含我的问题中的日期),并根据比较结果更新同一记录中的另一个字段。该程序将永远不会在国家以外的任何地方运行,或者在文化设置未设置为“美国”的服务器上运行。 – Kevin 2010-04-26 11:46:13

4

至少需要挑选字符串以便按照正确的顺序进行比较。

如果你想留下他们作为字符串,那么你需要用LARGEST->最小单位重新排序,所以这一点:

yyyy/mm/dd 

可以直接进行比较,而不是你的格式。使用你的格式,你需要分割它,并且像上面那样重新组合它,或者按照正确的顺序比较各个部分。

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

2

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

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

1

它可以通过字符串操作来完成,但它会降低到有效比较三组整数,因为字符串会导致比转换日期时间更多的开销。你为什么想这么做?

1

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

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