Eu preciso ser capaz de comparar alguns nomes de meses que tenho em uma matriz.
Seria bom se houvesse alguma forma direta como:
Month.toInt("January") > Month.toInt("May")
Minha busca no Google parece sugerir que a única maneira é escrever seu próprio método, mas isso parece um problema comum o suficiente que eu acho que já teria sido implementado em .Net, alguém fez isso antes?
Você poderia fazer algo assim:
fonte
Se você usar o
DateTime.ParseExact()
-método que várias pessoas sugeriram, deve considerar cuidadosamente o que deseja que aconteça quando o aplicativo for executado em um ambiente diferente do inglês!Na Dinamarca, o que,
ParseExact("Januar", ...)
eParseExact("January", ...)
deve trabalhar e que deve falhar?Essa será a diferença entre
CultureInfo.CurrentCulture
eCultureInfo.InvariantCulture
.fonte
Uma solução simples seria criar um Dicionário com nomes e valores. Então, usando Contains (), você pode encontrar o valor correto.
fonte
Você pode usar o método DateTime.Parse para obter um objeto DateTime e, em seguida, verificar sua propriedade Month. Faça algo assim:
O truque é construir uma data válida para criar um objeto DateTime.
fonte
Você pode usar um enum de meses:
Não estou 100% certo sobre a sintaxe de enum.Parse (), no entanto.
fonte
public enum Month { January = 1, Feburary }
e também converter para um int em vez de Mês.Você não precisa criar uma instância DateTime para fazer isso. É tão simples quanto isto:
Estou executando na
da-DK
cultura, então este teste de unidade passa:Vou deixar isso como um exercício para o leitor criar uma sobrecarga onde você possa passar um CultureInfo explícito.
fonte
ToLower()
- eu não sabia que uma das sobrecargas converte a string,using the casing rules of the specified culture
embora, para ser justo, não seja óbvio, pelo nome do método, que ela possa oferecer essa funcionalidade.CurrentCulture
. Ambos"January".ToLower(CultureInfo.CurrentCulture).Dump();
e"January".ToLower(new CultureInfo("en-NZ")).Dump();
saída dejanuary
nomes, mas mês são capitalizados noCurrentCulture.DateTimeFormat.MonthNames
.ToLower
:) Na verdade, há uma pequena falha lógica em meu código, já que os nomes dos meses são fornecidos em minúsculas em da-DK. Portanto, não se deve colocar a entrada em caixa baixa, ou então deve-se também diminuir todas as letras dos nomes dos meses - dependendo se uma correspondência sem distinção entre maiúsculas e minúsculas é desejada ou não.using the casing rules of the specified culture
para significar que seria maiúscula, por exemplo, meses e dias porCultureInfo
. O que funciona no seu exemplo porque os nomes dos meses estão em minúsculas. Demonstração eficaz do uso de testes de unidade para enganar. Pode ser digno de uma edição para deixar claro que seu exemplo é um caso extremo :-)E respondendo a isso sete anos após a pergunta ser feita, é possível fazer esta comparação usando métodos integrados:
torna-se
Que pode ser refatorado em um método de extensão para simplificar. A seguir está um exemplo do LINQPad (daí as
Dump()
chamadas de método):Com saída:
fonte
Se você estiver usando c # 3.0 (ou superior), você pode usar extensores
fonte
o código de cuidado está na versão Beta.
fonte
Eu traduzo para o código C # na versão em espanhol, respeitando:
fonte
O que fiz foi usar SimpleDateFormat para criar uma string de formato, analisar o texto em uma data e, em seguida, recuperar o mês dessa data. O código está abaixo:
fonte
Este código ajuda você ...
Método GetMonthName - retorna string ...
Se você deseja obter um mês como um número inteiro, basta usar -
Espero que ajude você !!!
Obrigado!!!
fonte