2010-04-26 28 views
12

Tengo dos campos:¿Hay alguna manera de comparar fechas "cadenas" en C# sin convertir las cadenas?

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

¿Cómo puedo comparar Me estas dos campos como así ?:

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

se puede hacer esto sin necesidad de convertir primero los campos a una variable de tipo fecha separada?

EDITAR: Debo mencionar que estos valores provienen de una tabla de base de datos donde los valores de fecha están en un formato de cadena para comenzar. Código antiguo heredado ...

Respuesta

33

No, pero no es difícil convertir una fecha en C#.

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

{ 
    // perform some code here 
} 
+0

Sí, parece bastante fácil. Estaba pensando que tendría que tener variables separadas con los valores de fecha convertidos en ellas, pero la forma en que me has mostrado me permite tener esas variables adicionales. ¡Gracias! – Kevin

+1

@Kevin, solo tenga cuidado con la configuración de su cultura: si está convirtiendo una hora estadounidense usando una cultura diferente (por defecto o por accidente) puede terminar con resultados inesperados :) – RYFN

+0

Gracias por el aviso, Zeus .El programa es solo un pequeño programa por lotes que se ejecutará cada cierto tiempo en nuestro servidor. Básicamente leerá una tabla de base de datos, comparará dos campos de cadenas (los campos contienen fechas como las de mi pregunta) y actualizará otro campo en el mismo registro, dependiendo de la comparación. El programa nunca se ejecutará en ningún lugar fuera del país o en un servidor con configuraciones de cultura no configuradas en "Estadounidense". – Kevin

4

Por lo menos debe separar las cadenas para compararlas en el orden correcto.

Si quieres dejar como cadenas, entonces usted necesita para cambiar su orden con LARGEST-> unidades más pequeñas, por lo que este:

yyyy/mm/dd 

se pueden comparar directamente, pero no el formato que tiene. Con su formato, debe dividirlo y recombinarlo como se muestra arriba, o comparar las piezas individuales en el orden correcto.

Habiendo dicho eso, es bastante fácil convertir las cadenas a DateTime usando DateTime.ParseExact.

2

En general, es una mala idea comparar la fecha como cadenas.

Pero si sus cadenas están en el mismo formato (por ejemplo, yyyy/mm/dd significa años, luego monthes luego días) entonces la comparación puede ser válida.

1

Se podría hacer con la manipulación de cadenas, pero se reduciría a la comparación efectiva de tres conjuntos de enteros, que como cadenas inducirían más sobrecarga que la conversión a la fecha. ¿Por qué querrías hacer eso?

1

No. Deje que el .net framework lo resuelva. Identificará correctamente la configuración y el formato de la fecha del usuario (usando la configuración del sistema, el hilo actual) y determinará cuál es el mes, el año y el día, especialmente si esos datos provienen, por ejemplo, de un servidor sql.

13

Si sus fechas se almacenan realmente como cadenas en la base de datos, parece que no puede estar seguro de que estarán en un formato válido antes de analizar. Por esa razón sugeriría una pequeña variación en la respuesta de 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

Se prefiere tener la fecha formateada antes de hacer la comparación. Dependiendo de su información cultural, la forma más segura de comparar fechas es formatear la cadena de fecha en "aaaa-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 
} 
Cuestiones relacionadas