Necesito poder comparar algunos nombres de meses que tengo en una matriz.
Sería bueno si hubiera alguna forma directa como:
Month.toInt("January") > Month.toInt("May")
Mi búsqueda en Google parece sugerir que la única forma es escribir su propio método, pero esto parece un problema lo suficientemente común como para pensar que ya se habría implementado en .Net, ¿alguien ha hecho esto antes?
Podrías hacer algo como esto:
fuente
Si usa el
DateTime.ParseExact()
método -que varias personas han sugerido, debe considerar cuidadosamente lo que desea que suceda cuando la aplicación se ejecute en un entorno que no sea inglés.En Dinamarca, que de
ParseExact("Januar", ...)
yParseExact("January", ...)
debe trabajar y que deben fallar?Esa será la diferencia entre
CultureInfo.CurrentCulture
yCultureInfo.InvariantCulture
.fuente
Una solución sencilla sería crear un diccionario con nombres y valores. Luego, usando Contains () puede encontrar el valor correcto.
fuente
Puede usar el método DateTime.Parse para obtener un objeto DateTime y luego verificar su propiedad Month. Haz algo como esto:
El truco consiste en crear una fecha válida para crear un objeto DateTime.
fuente
Puede usar una enumeración de meses:
Sin embargo, no estoy 100% seguro de la sintaxis de enum.Parse ().
fuente
public enum Month { January = 1, Feburary }
y también convertir a un int en lugar de Month.No es necesario crear una instancia de DateTime para hacer esto. Es tan simple como esto:
Me estoy ejecutando en la
da-DK
cultura, por lo que esta prueba unitaria pasa:Lo dejo como ejercicio para que el lector cree una sobrecarga donde pueda pasar una CultureInfo explícita.
fuente
ToLower()
: no sabía que una de las sobrecargas convierte la cadena,using the casing rules of the specified culture
aunque para ser justos, no es obvio por el nombre del método que pueda ofrecer esa funcionalidad.CurrentCulture
. Tanto"January".ToLower(CultureInfo.CurrentCulture).Dump();
y"January".ToLower(new CultureInfo("en-NZ")).Dump();
de salidajanuary
nombres pero el mes se capitalizan en elCurrentCulture.DateTimeFormat.MonthNames
.ToLower
:) En realidad, hay un ligero error lógico en mi código, ya que los nombres del mes se dan como todo en minúsculas en da-DK. Por lo tanto, no se debe poner en minúscula la entrada, o también se deben minúsculas todos los nombres de los meses, dependiendo de si se desea o no una coincidencia que no distinga entre mayúsculas y minúsculas.using the casing rules of the specified culture
en el sentido de que se capitalizaría, por ejemplo, meses y días porCultureInfo
. Lo que funciona en su ejemplo porque los nombres de los meses están en minúsculas. Demostración eficaz del uso de pruebas unitarias para inducir a error. Podría ser digno de una edición para dejar en claro que su ejemplo es un caso límite :-)Y respondiendo esto siete años después de que se hizo la pregunta, es posible hacer esta comparación utilizando métodos integrados:
se convierte en
Que se puede refactorizar en un método de extensión para simplificar. El siguiente es un ejemplo de LINQPad (de ahí las
Dump()
llamadas al método):Con salida:
fuente
Si está usando c # 3.0 (o superior) puede usar extensores
fuente
El código de precaución está en la versión Beta.
fuente
Lo traduzco al código C # en la versión en español, saludos:
fuente
Lo que hice fue usar SimpleDateFormat para crear una cadena de formato, analizar el texto a una fecha y luego recuperar el mes de eso. El código está abajo:
fuente
Este código te ayuda ...
Método GetMonthName: devuelve una cadena ...
Si desea obtener un mes como un número entero, simplemente use -
¡¡¡Espero que te ayude!!!
¡¡¡Gracias!!!
fuente