¿Existe una enumeración predefinida para el mes en la biblioteca .NET?

97

Estoy buscando ver si hay una enumeración oficial durante meses en el marco .net.

Me parece posible que haya uno, debido a lo común que es el uso del mes y porque hay otras enumeraciones similares en el marco .net.

Por ejemplo, hay una enumeración para los días de la semana, System.DayOfWeek, que incluye lunes, martes, etc.

Me pregunto si hay uno para los meses del año, es decir, enero, febrero, etc.

¿Alguien sabe?

Mark Rogers
fuente

Respuestas:

118

No lo hay, pero si quieres el nombre de un mes puedes usar:

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

que devolverá una representación de cadena (del mes actual, en este caso). Tenga en cuenta que GetMonthtoma argumentos del 1 al 13: enero es 1, 13 es una cadena en blanco.

Andy Mikula
fuente
11
Sin embargo, eso no es una enumeración.
Scott Wisniewski
3
Gracias, respuesta interesante, no es lo que estaba buscando, ¡pero aún así vale un +!
Mark Rogers
4
Estoy de acuerdo con el tema específico de la cultura, pero ¿por qué entonces Microsoft creó DayOfWeek? Eso es específico de la cultura. Gracioso, ¿eh?
Mark Rogers
12
Quizás porque varias culturas tienen diferentes calendarios mensuales, pero (aparentemente) no hay ninguna que tenga un número diferente de días por semana. Entonces, el número de días a la semana es constante, incluso si los nombres no lo son.
Ryan Lundy
11
Si eres un programador que viaja en el tiempo y culturalmente sensible, ten en cuenta que ha habido culturas que tenían una semana decimal (por ejemplo, la Francia revolucionaria) en.wikipedia.org/wiki/Decimal_calendar
Matthew Lock
75

No, no lo hay.

David Nelson
fuente
3
¿Qué hay de Microsoft.VisualBasic.MonthName?
Josh Stodola
14
Qué respuesta tan útil ha proporcionado. Quizás alguna orientación adicional hubiera sido más apropiada.
Michael Eakins
13
@ guillegr123 ¿Cómo sugeriría que probase una negativa?
David Nelson
7
Quizás no demuestre lo negativo, pero un poco de razonamiento no estaría fuera de lugar: no hay enumeración porque las enumeraciones no se pueden localizar. Meses Enero tendría poco o ningún significado para un programador ruso. Esto se apoya aún más al observar las funciones que SÍ proporcionan nombres de mes: están ubicadas en un objeto Cultura.
Sam Axe
8
Votar a favor para contrarrestar los 10 votos en contra de la única respuesta real a esta pregunta. ¿Existe una enumeración oficial durante meses en .NET? No, no lo hay. No tendría mucho sentido porque no todos los calendarios tienen el mismo número de meses, y quizás por eso nunca se ha introducido. Pero ese no es el punto aquí. Hay uno No. Pregunta respondida correctamente.
sm
39

Estoy buscando ver si hay una enumeración oficial durante meses en el marco .net.

No.

Aquí hay uno que preparé antes. (Versión 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
fuente
¿Por qué usar NotSet? ¿Por qué no empezar con January = 1? entonces podrías acabar con el resto de las asignaciones también ..
Tersosauros
1
@Tersosauros porque entonces se usará de forma predeterminada Januarysi, por ejemplo, se usa como una propiedad para una clase. en la mayoría de los casos, no quiero eso, quiero que tenga un valor 'nulo' antes de que se asigne explícitamente
wal
1
Pero @wal, si desea un valor 'nulo', debe usar su enumeración como anulable. ¿En tu clase usa el mes público? Mes {obtener; conjunto; }.
oteal
7
@Tersosauros tenga en cuenta que 0 siempre será el valor predeterminado de una enumeración, incluso si no está definido explícitamente. Si NotSetse omite y January = 1(y el resto de los valores son 2, 3, etc.) entonces el valor predeterminado de esta enumeración sería(Month)0
tsemer
vino a publicar lo mismo .. esta debería ser la respuesta. el Enum se puede usar contra todas las funciones de DateTime, es decir, DateTime.Now.Month == (int) Month.January
Sonic Soul
32

DateTimeFormatInfo.CurrentInfo.MonthNames(no es una enumeración, pero creo que la instancia CurrentInfo de DateTimeFormatInfo es lo que está buscando en general). Si desea una lista desplegable, puede crearla así:

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

Se encontró uno en la enumeración "MonthNamesType" de este espacio de nombres: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

La ubicación asusta un poco, pero está ahí.

vidalsasoon
fuente
Le otorgaría la respuesta correcta, pero no creo que sea parte del marco .net de la biblioteca base. +1 por esfuerzo y creatividad.
Mark Rogers
parece que es parte de .net 3.5. Simplemente abra el visor de objetos en Visual Studio y busque "Enero" y aparecerán las coincidencias en la API.
vidalsasoon
Sí, hice lo que sugirió, parece que está en la carpeta v3.0 y no es una biblioteca predeterminada. Entonces, aunque supongo que está en la biblioteca, su ubicación no es la ideal. Está en una especie de área gris en cuanto a los requisitos de la pregunta.
Mark Rogers
+1 sería por esfuerzo seguro. ¿De qué dll estamos hablando aquí?
indolentdeveloper
10

¿Qué es exactamente lo que intenta lograr?

si todo lo que desea son doce cadenas con los meses del año detallados, entonces eso está disponible a través de una cadena de formato personalizado, aplicada para cualquier instancia de una fecha y 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)

si solo desea poder especificar el mes como una propiedad enumerada de algún otro tipo de objeto, entonces la propiedad Month de un campo DateTime devuelve un número entero de 1 a 12 ...

Charles Bretana
fuente
1
Gracias por su respuesta, solo tengo curiosidad por saber si hay una enumeración oficial, porque estoy a punto de crear una y solo me gustaría saber si hay una que ya existe, así que no redefinir una enumeración innecesaria .
Mark Rogers
1
No afaik, no hay ninguno (si crea uno, haría explícitos los valores enteros, por lo que puede asegurarse de que sean los mismos que los valores 1-12 utilizados por .Net para representar los números de mes)
Charles Bretana
3

Sí, ciertamente la hay. Es parte del espacio de nombres Microsoft.VisualBasic ...

Microsoft.VisualBasic.MonthName

Y para aquellos de ustedes que tienen un problema con este espacio de nombres, deben comprender que realmente es .NET y que no va a ninguna parte .

Para el registro, la MonthNamefunción llama internamente a lo siguiente ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName
Josh Stodola
fuente
1
Lo siento, pero esta respuesta tiene el mismo problema que la respuesta anterior, ya que no es una enumeración, que es el tema de esta pregunta. Aún así, gracias por la información.
Mark Rogers
@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames es una cadena [] que es IEnumerable.
user169771
1
@ user169771 - string [] es una IEnumerablepero no es una enumeración. Entonces no funciona.
Mark Rogers
2

Algunos calendarios de hecho tienen más de 12 meses: http://en.wikipedia.org/wiki/Month pero no puedo decir si fue la razón por la que MS no creó una enumeración en .NET.

Para los perezosos como yo que les hubiera gustado copiar / pegar, en 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
Francois Gagnon
fuente
1

No lo sé con certeza, pero mi corazonada es no. DateTime.Month devuelve un número entero. Si hubiera tal enumeración, probablemente la devolvería DateTime.

Scott Wisniewski
fuente
1

Estaría buscando algo como esto para codificar, como

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

tiene este número mágico de 1. mientras

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

es autodocumentado

Jadawin
fuente
0

Una enumeración sería bastante útil, pero puede obtener el resultado deseado con un formato:

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

Esto devuelve el nombre completo del mes (enero, febrero, etc.). Úselo myDateTimeObject.ToString("MMM")para el nombre corto (enero, febrero, marzo, etc.).

Si tiene un número de mes en particular mnthNum, sin ninguno DateTime, siempre puede usar algo como esto:

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

o

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

Pero eso parece un poco complicado. El primer ejemplo requiere que mnthNumesté entre 1 y 12. El segundo ejemplo permite (casi) cualquier número de mes y no está restringido a 1 a 12.

keith
fuente