Esiste un'enumerazione predefinita per Month nella libreria .NET?


97

Sto cercando di vedere se c'è un'enumerazione ufficiale per mesi nel framework .net.

Mi sembra possibile che ce ne sia uno, a causa di quanto sia comune l'uso di month e perché ci sono altre enumerazioni simili nel framework .net.

Ad esempio, esiste un'enumerazione per i giorni della settimana, System.DayOfWeek, che include lunedì, martedì e così via.

Mi chiedo se ce n'è uno per i mesi dell'anno, cioè gennaio, febbraio, ecc.?

Qualcuno sa?

Risposte:


118

Non c'è, ma se vuoi il nome di un mese puoi usare:

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

che restituirà una rappresentazione di stringa (del mese corrente, in questo caso). Nota che GetMonthaccetta argomenti da 1 a 13: gennaio è 1, 13 è una stringa vuota.


11
Tuttavia non è un enum.
Scott Wisniewski,

3
Grazie, risposta interessante, non quello che stavo cercando, ma vale comunque un +!
Mark Rogers

4
Sono d'accordo sul problema specifico della cultura, ma perché microsoft ha creato DayOfWeek, questo è specifico della cultura. Divertente, eh?
Mark Rogers

12
Forse perché varie culture hanno calendari mensili diversi, ma (apparentemente) non ce n'è una che ha un numero diverso di giorni alla settimana. Quindi il numero di giorni alla settimana è coerente anche se i nomi non lo sono.
Ryan Lundy,

11
Se sei un programmatore culturalmente sensibile e che viaggia nel tempo, tieni presente che ci sono state culture che avevano una settimana decimale (ad esempio la Francia rivoluzionaria) en.wikipedia.org/wiki/Decimal_calendar
Matthew Lock

75

No, non c'è.


3
Di cosa Microsoft.VisualBasic.MonthName?
Josh Stodola

14
Che risposta utile hai fornito. Forse qualche guida aggiuntiva sarebbe stata più appropriata.
Michael Eakins

13
@ guillegr123 Come suggeriresti di provare a dimostrare un negativo?
David Nelson

7
Forse non prova il negativo, ma un piccolo ragionamento non sarebbe fuori uso: non c'è enumerazione perché le enumerazioni non possono essere localizzate. Mesi. Gennaio avrebbe poco o nessun significato per un programmatore russo. Ciò è ulteriormente supportato esaminando le funzioni che forniscono i nomi dei mesi: si trovano su un oggetto Culture.
Sam Axe

8
Upvoting per contrastare i 10 downvotes per l'unica risposta effettiva a questa domanda. Esiste un'enumerazione ufficiale per mesi in .NET? No, non c'è. Non avrebbe molto senso perché non tutti i calendari hanno lo stesso numero di mesi, ed è forse per questo che non è mai stato introdotto. Ma non è questo il punto qui. Ce n'è uno? No. La domanda ha risposto correttamente.
sm

39

Sto cercando di vedere se c'è un'enumerazione ufficiale per mesi nel framework .net.

No.

Ecco uno che ho preparato in precedenza. (Versione 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
}

Perché usare NotSet? Perché non iniziare con January = 1? allora potresti farla finita anche con il resto dei compiti ..
Tersosauros

1
@Tersosauros perché allora verrà impostato su Januaryse, ad esempio, viene utilizzato come proprietà per una classe. nella maggior parte dei casi non lo voglio, voglio che abbia un valore 'nullo' prima che venga assegnato esplicitamente
wal

1
Ma @wal, se vuoi il valore 'null', dovresti usare il tuo enum come nullable. Nella tua classe usi il mese pubblico? Mese {get; impostato; }.
oteal

7
@Tersosauros nota che 0 sarà sempre il valore predefinito di un enum, anche se non è definito esplicitamente. Se NotSetviene omesso e January = 1(e il resto dei valori sono 2, 3, ecc.), Il valore predefinito di questa (Month)0
enumerazione

è venuto a postare la stessa cosa .. questa dovrebbe essere la risposta. Enum può essere utilizzato contro tutte le funzioni DateTime, ad esempio DateTime.Now.Month == (int) Month.January
Sonic Soul

32

DateTimeFormatInfo.CurrentInfo.MonthNames(non un enum, ma penso che l'istanza CurrentInfo di DateTimeFormatInfo sia ciò che stai cercando in generale). Se vuoi un elenco a discesa, puoi costruirlo in questo modo:

List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
var monthSelectList = monthNames.Select(
   m => new { Id = monthNames.IndexOf(m) + 1, Name = m });

1
return Enumerable.Range (0, 11) .Select (m => new {Id = month + 1, Name = DateTimeFormatInfo.CurrentInfo.MonthNames [month]});
Keith Harrison

var months = Enumerable.Range(0, 11).Select(m => new KeyValuePair<int, string>(m + 1, DateTimeFormatInfo.CurrentInfo.MonthNames[m]));
Dan Diplo

13

Trovato uno nell'enumerazione "MonthNamesType" di questo spazio dei nomi: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

La posizione spaventa un po 'ma è comunque lì.


Ti darei la risposta corretta, ma non credo che faccia parte del framework .net della libreria di base. +1 per impegno e creatività.
Mark Rogers

sembra che faccia parte di .net 3.5. Basta aprire il visualizzatore di oggetti in Visual Studio e cercare "gennaio" e le corrispondenze nell'API vengono visualizzate.
vidalsaso

Sì, ho fatto come hai suggerito, sembra che sia nella cartella v3.0 e non è una libreria predefinita. Quindi, anche se immagino che sia nella libreria, la sua posizione non è l'ideale. È in una sorta di zona grigia per quanto riguarda i requisiti della domanda.
Mark Rogers

+1 sarebbe sicuramente per lo sforzo. Di che dll stiamo parlando qui?
indolentdeveloper

10

Cosa stai cercando di ottenere esattamente?

se tutto ciò che desideri sono dodici stringhe con i mesi dell'anno enunciati, allora è disponibile tramite una stringa di formato personalizzata - applicata a qualsiasi istanza di un datetime,

  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 vuoi solo essere in grado di specificare il mese come una proprietà enumerata di qualche altro tipo di oggetto, la proprietà Month di un campo DateTime restituisce un numero intero da 1 a 12 ...


1
Grazie per la tua risposta, sono solo curioso se esiste un'enumerazione ufficiale, perché sto per crearne una e vorrei solo sapere se ce n'è una già esistente, quindi non ridefinisco un'enumerazione non necessaria .
Mark Rogers

1
No afaik, non ce n'è, (se ne crei uno, renderei espliciti i valori interi, puoi assicurarti che siano gli stessi dei valori 1-12 usati da .Net per rappresentare i numeri dei mesi)
Charles Bretana

3

Sì, certamente c'è. Fa parte dello spazio dei nomi Microsoft.VisualBasic ...

Microsoft.VisualBasic.MonthName

E per quelli di voi che hanno un problema con questo spazio dei nomi, dovreste capire che è veramente .NET e non sta andando da nessuna parte .

Per la cronaca, la MonthNamefunzione chiama internamente quanto segue ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName

1
Scusa ma questa risposta ha lo stesso problema della risposta precedente, in quanto non è un'enumerazione, che è l'argomento di questa domanda. Comunque, grazie per le informazioni.
Mark Rogers

@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames è una stringa [] che è IEnumerable.
user169771

1
@ user169771 - string [] è un IEnumerablema non è enumun'erazione. Quindi non funziona.
Mark Rogers

2

Alcuni calendari hanno effettivamente più di 12 mesi: http://en.wikipedia.org/wiki/Month ma non posso dire se sia stato il motivo per cui MS non ha creato un enum in .NET.

Per i pigri come me che avrebbero gradito un copia / incolla, in 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

1

Non lo so per certo, ma la mia impressione è no. DateTime.Month restituisce un numero intero. Se fosse presente una tale enumerazione, verrebbe probabilmente restituita da DateTime.


1

Cercherei qualcosa di simile con cui codificare, come

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

ha questo numero magico di 1 in esso. mentre

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

è auto-documentante


0

Un enum sarebbe piuttosto utile, ma puoi ottenere il risultato desiderato con un formato:

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

Restituisce il nome completo del mese (gennaio, febbraio, ecc.). Utilizzare myDateTimeObject.ToString("MMM")per il nome breve (gennaio, febbraio, marzo, ecc.).

Se hai un numero di mese particolare mnthNum, senza alcuno DateTime, puoi sempre usare qualcosa del genere:

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

o

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

Ma sembra un po 'complicato. Il primo esempio richiede che mnthNumsia compreso tra 1 e 12. Il secondo esempio consente (quasi) qualsiasi numero di mese e non è limitato da 1 a 12.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.