Existe uma enumeração predefinida para o mês na biblioteca .NET?

97

Estou procurando ver se há uma enumeração oficial para meses na estrutura .net.

Parece-me possível que haja um, por causa do quão comum é o uso de mês, e porque há outras enumerações na estrutura .net.

Por exemplo, há uma enumeração para os dias da semana, System.DayOfWeek, que inclui segunda, terça, etc.

Gostaria de saber se existe um para os meses do ano, ou seja, janeiro, fevereiro, etc?

Alguém sabe?

Mark Rogers
fonte

Respostas:

118

Não existe, mas se você quiser o nome de um mês, pode usar:

CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName (DateTime.Now.Month);

que retornará uma representação de string (do mês atual, neste caso). Observe que GetMonthaceita argumentos de 1 a 13 - janeiro é 1, 13 é uma string em branco.

Andy Mikula
fonte
11
Isso não é um enum embora.
Scott Wisniewski
3
Obrigado, resposta interessante, não é o que eu estava procurando, mas ainda assim vale a pena +!
Mark Rogers
4
Eu concordo com a questão específica da cultura, mas por que a Microsoft criou o DayOfWeek, isso é específico da cultura. Engraçado, hein?
Mark Rogers
12
Talvez porque várias culturas tenham calendários mensais diferentes, mas (aparentemente) não há nenhuma que tenha um número diferente de dias por semana. Portanto, o número de dias por semana é consistente, mesmo que os nomes não sejam.
Ryan Lundy
11
Se você é um programador de viagens no tempo, culturalmente sensível, esteja ciente de que houve culturas que tiveram uma semana decimal (por exemplo, França revolucionária) en.wikipedia.org/wiki/Decimal_calendar
Matthew Lock
75

Não, não há.

David Nelson
fonte
3
Sobre o quê Microsoft.VisualBasic.MonthName?
Josh Stodola
14
Que resposta útil você forneceu. Talvez alguma orientação adicional fosse mais apropriada.
Michael Eakins de
13
@ guillegr123 Como você sugeriria que eu provasse uma negativa?
David Nelson
7
Talvez isso não prove o negativo, mas um pequeno raciocínio não estaria fora de ordem: não há enum porque enums não podem ser localizados. Mês. Janeiro teria pouco ou nenhum significado para um programador russo. Isso também é suportado ao olhar para as funções que fornecem nomes de meses - eles estão localizados em um objeto Cultura.
Sam Axe,
8
Votos positivos para neutralizar os 10 votos negativos para a única resposta real a esta pergunta. Existe uma enumeração oficial para meses no .NET? Não, não há. Faria pouco sentido porque nem todo calendário tem o mesmo número de meses, e talvez seja por isso que nunca foi introduzido. Mas esse não é o ponto aqui. Existe um? Não. Pergunta respondida corretamente.
sm
39

Estou procurando ver se há uma enumeração oficial para meses na estrutura .net.

Não.

Aqui está um que preparei anteriormente. (Versão C #)

public enum Month
{
    NotSet = 0,
    January = 1,
    February = 2,
    March = 3,
    April = 4,
    May = 5,
    June = 6,
    July = 7,
    August = 8,
    September = 9,
    October = 10,
    November = 11,
    December = 12
}
wal
fonte
Por que usar NotSet? Por que não começar January = 1? então você poderia acabar com o resto das atribuições também ..
Tersosauros
1
@Tersosauros porque então o padrão será Januaryse, por exemplo, for usado como uma propriedade para uma classe. na maioria dos casos eu não quero isso, eu quero isso para ter um valor 'nulo' antes de ser explicitamente atribuído
wal
1
Mas @wal, se você quiser um valor 'nulo', deve usar seu enum como anulável. Na sua aula usa o mês público? Mês {get; conjunto; }
oteal
7
@Tersosauros observe que 0 sempre será o valor padrão de um enum, mesmo se não for definido explicitamente. Se NotSetfor omitido e January = 1(e o resto dos valores são 2, 3, etc.), o padrão deste enum seria(Month)0
tsemer
veio postar a mesma coisa .. essa deve ser a resposta. o Enum pode ser usado em todas as funções DateTime, ou seja, DateTime.Now.Month == (int) Month.January
Sonic Soul
32

DateTimeFormatInfo.CurrentInfo.MonthNames(não é um enum, mas acho que a instância CurrentInfo de DateTimeFormatInfo é o que você está procurando em geral). Se você quiser uma lista suspensa, poderá criá-la assim:

List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
var monthSelectList = monthNames.Select(
   m => new { Id = monthNames.IndexOf(m) + 1, Name = m });
Doug Lampe
fonte
1
retornar Enumerable.Range (0, 11) .Select (m => novo {Id = mês + 1, Nome = DateTimeFormatInfo.CurrentInfo.MonthNames [mês]});
Keith Harrison de
var months = Enumerable.Range(0, 11).Select(m => new KeyValuePair<int, string>(m + 1, DateTimeFormatInfo.CurrentInfo.MonthNames[m]));
Dan Diplo
13

Encontrado um no enum "MonthNamesType" deste namespace: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

A localização meio que assusta, mas está lá mesmo assim.

vidalsasoon
fonte
Eu recompensaria você com a resposta correta, mas não acho que isso faça parte da estrutura da biblioteca base .net. 1 para esforço e criatividade.
Mark Rogers
parece que faz parte do .net 3.5. Basta abrir o visualizador de objeto no Visual Studio e pesquisar "Janeiro" e as correspondências na API aparecerão.
vidalsasoon de
Sim, fiz o que você sugeriu, parece que está na pasta v3.0 e não é uma biblioteca padrão. Então, embora eu ache que esteja na biblioteca, sua localização não é a ideal. É algo como uma área cinzenta no que diz respeito aos requisitos da questão.
Mark Rogers
1 seria um esforço, com certeza. Do que estamos falando aqui?
indolentdeveloper
10

O que exatamente você está tentando realizar?

se tudo o que você quiser são doze strings com os meses do ano explicados, isso está disponível por meio de uma string de formato personalizado - aplicada a qualquer instância de data e hora,

  DateTime dt = DateTime.Parse("12 January 2009";
   dt.ToString("MMM");  // prints "Jan" 
                        // (or the right abbrev is in current culture)
   dt.ToString("MMMM"); // prints "January" 
                        // (or correct sp in current culture)

se você deseja apenas especificar o mês como uma propriedade enumerada de algum outro tipo de objeto, a propriedade Mês de um campo DateTime retorna um número inteiro de 1 a 12 ...

Charles Bretana
fonte
1
Obrigado pela sua resposta, estou apenas curioso se existe uma enumeração oficial, porque estou prestes a criar uma e gostaria apenas de saber se existe uma que já exista, por isso não redefino uma enumeração desnecessária .
Mark Rogers
1
Não afaik, não há nenhum, (Se você criar um, eu tornaria os valores inteiros explícitos, mas você pode garantir que eles sejam iguais aos valores 1-12 usados ​​por .Net para representar monthNumbers)
Charles Bretana
3

Sim, certamente existe. Faz parte do namespace Microsoft.VisualBasic ...

Microsoft.VisualBasic.MonthName

E para aqueles de vocês que têm problemas com este namespace, devem entender que ele realmente é .NET e não vai a lugar nenhum .

Para registro, a MonthNamefunção chama internamente o seguinte ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName
Josh Stodola
fonte
1
Desculpe, mas esta resposta tem o mesmo problema da resposta anterior, por não ser uma enumeração, que é o tópico desta questão. Ainda assim, obrigado pela informação.
Mark Rogers
@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames é uma string [] que é IEnumerable.
user169771
1
@ user169771 - string [] é uma IEnumerablemas não é uma enumeração. Portanto, não funciona.
Mark Rogers
2

Alguns calendários realmente têm mais de 12 meses: http://en.wikipedia.org/wiki/Month, mas não posso dizer se foi o motivo pelo qual o MS não criou um enum no .NET.

Para os preguiçosos como eu que gostariam de copiar / colar, em VB:

Public Enum MonthsOfYear
    January = 1
    February = 2
    March = 3
    April = 4
    May = 5
    June = 6
    July = 7
    August = 8
    September = 9
    October = 10
    November = 11
    December = 12
End Enum
François Gagnon
fonte
1

Não sei ao certo, mas meu palpite é não. DateTime.Month retorna um número inteiro. Se houvesse tal enumeração, provavelmente seria retornada por DateTime.

Scott Wisniewski
fonte
1

Eu estaria procurando algo assim para codificar, como

        if (DateTime.Now.Month != 1) // can't run this test in January.

tem este número mágico de 1 nele. enquanto que

        if (DateTime.Now.Month != DateTime.MonthsOfYear.January) 

é autodocumentado

Jadawin
fonte
0

Um enum seria bastante útil, mas você pode obter o resultado desejado com um formato:

DateTime myDateTimeObject=DateTime.Now; //(for example)
string monthName = myDateTimeObject.ToString("MMMM");

Isso retorna o nome completo do mês (janeiro, fevereiro, etc.). Use myDateTimeObject.ToString("MMM")para nome curto (janeiro, fevereiro, março, etc.).

Se você tem um número de mês específico mnthNum, sem nenhum DateTime, você sempre pode usar algo assim:

string monthName=(new DateTime(2000,mnthNum,1)).ToString("MMMM");

ou

string monthName=((new DateTime(2000,1,1)).AddMonths(mnthNum-1)ToString("MMMM");

Mas isso parece um pouco confuso. O primeiro exemplo requer que mnthNumesteja entre 1 e 12. O segundo exemplo permite (quase) qualquer número de mês e não está restrito a 1 a 12.

Keith
fonte