2010-05-25 12 views
9

¿Es posible obtener los CurrentCulture 's de lunes a viernes de DateTimeFormatInfo, pero volviendo Lunes como primer día de la semana en lugar de Domingo. Y, si la cultura actual no es el inglés (es decir, el código ISO no es "en"), déjelo como predeterminado.Obtención de nombres de los días de cultivo actual en .NET

Por defecto CultureInfo.CurrentCulture.DateTimeFormat.DayNames devuelve:

[0]: "Sunday" 
[1]: "Monday" 
[2]: "Tuesday" 
[3]: "Wednesday" 
[4]: "Thursday" 
[5]: "Friday" 
[6]: "Saturday" 

pero necesito:

[0]: "Monday" 
[1]: "Tuesday" 
[2]: "Wednesday" 
[3]: "Thursday" 
[4]: "Friday" 
[5]: "Saturday" 
[6]: "Sunday" 

Respuesta

10

Puede utilizar custom cultures para crear una nueva cultura basada de uno existente. Para ser honesto, sin embargo, diría que eso es probablemente un poco torpe. La solución "simple" sólo puede ser algo como:

public string[] GetDayNames() 
{ 
    if (CultureInfo.CurrentCulture.Name.StartsWith("en-")) 
    { 
     return new [] { "Monday", "Tuesday", "Wednesday", "Thursday", 
         "Friday", "Saturday", "Sunday" }; 
    } 
    else 
    { 
     return CultureInfo.CurrentCulture.DateTimeFormat.DayNames; 
    } 
} 
+0

De acuerdo, creo que esto es probablemente el más fácil. Terminé usando 'if (CurrentCulture.TwoLetterISOLanguageName ==" en ")' para verificar el inglés. –

6

puede clonar la cultura actual, que recibe una copia modificable del objeto CultureInfo. Luego puede establecer DateTimeFormat.FirstDayOfWeek a Monday.

CultureInfo current = CultureInfo.Current; 
CultureInfo clone = (CultureInfo)current.Clone(); 

clone.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday; 

Lo anterior clone ahora tratar lunes como el primer día de la semana.

EDITAR

Después de volver a leer su pregunta no creo que esto va a hacer lo que estás esperando. DayNames seguirá regresando en el mismo orden independientemente de la configuración FirstDayOfWeek.

Pero dejaré esta respuesta como wiki de la comunidad en caso de que alguien se encuentre con esta pregunta en el futuro.

+0

¡Guau, nunca imaginé que fuera tan fácil! –

+0

Gracias por su respuesta, ya probé esto y me decepcionó que aún recibiera los días en el mismo pedido. Buena idea sin embargo. –

5

Estoy publicar esto como una respuesta por separado, ya que realmente no tiene nada que ver con mi otra respuesta (que puede ser útil a alguien más en el futuro en otro contexto.)

Como alternativa a la solución de codeka, también se puede hacer algo como esto (lo que evitaría tener que codificar los nombres de los días en-us.)

string[] dayNamesNormal = culture.DateTimeFormat.DayNames; 
string[] dayNamesShifted = Shift(dayNamesNormal, (int)DayOfWeek.Monday); 

// you probably wanna add some error checking here. 
// this method shifts array left by a specified number 
// of positions, wrapping the shifted elements back to 
// end of the array 
private static T[] Shift<T>(T[] array, int positions) { 
    T[] copy = new T[array.Length]; 
    Array.Copy(array, 0, copy, array.Length-positions, positions); 
    Array.Copy(array, positions, copy, 0, array.Length-positions); 
    return copy; 
} 

quería escribir esto antes, pero estoy luchando contra un disco duro externo morir ...

+0

Buena solución, me gusta el método Shift, muy útil para mantener en la biblioteca. –

4

Una idea más, inspirada en la respuesta de Josh, usi ng a Queue en lugar de cambiar la matriz.

var days = CultureInfo.CurrentCulture.DateTimeFormat.DayNames; 
if (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "en") 
{ 
    var q = new Queue<string>(days); 
    q.Enqueue(q.Dequeue()); 
    days = q.ToArray(); 
} 
+0

¡listo! Seguro que es más fácil para los ojos que la manipulación directa del arreglo. – Josh

0

Desde un solo día se está moviendo, que resolvió este problema como este:

'the list is from Sunday to Saturday 
'we need Monday to Sunday 
'so add a Sunday on the end and then remove the first position 
dayNames.AddRange(DateTimeFormatInfo.CurrentInfo.DayNames) 
dayNames.Add(DateTimeFormatInfo.CurrentInfo.GetDayName(DayOfWeek.Sunday)) 
dayNames.RemoveAt(0) 
2

Si está recibiendo nombres de los días en base a las fechas, no importa lo el día en que comienza la semana; DateTimeFormat.DayNames identifica el domingo como 0, al igual que DateTime, no importa si las semanas comienzan el jueves o lo que sea.:)

Para obtener el nombre de los días en Inglés partir de una fecha: (valor mágico)

string GetDayName(DateTime dt) 
{ 
    return CultureInfo.InvariantCulture.DateTimeFormat.DayNames[(int)dt.DayOfWeek]; 
} 

Si por alguna razón usted absolutamente quiere tratar con el enteros que sustentan la enumeración DayOfWeek, solo turno el índice y tomar el módulo, por lo tanto, el mapeo de 0 => 6, 1 => 0, y así sucesivamente:

string GetDayName(int dayIndex) 
{ 
    return CultureInfo.InvariantCulture.DateTimeFormat.DayNames[(dayIndex + 6) % 7]; 
} 
0

Esto también debería funcionar bien.

public static List<String> Days 
    { 
     var abbDayNames = CultureInfo.CurrentCulture.DateTimeFormat.AbbreviatedDayNames; 

     var days = new string[7]; 
     var firstDayOfWeek = (int)DayOfWeek.Monday; 
     for (int i = 6; i>= 0; i--) 
     { 
      days[i] = abbDayNames[(firstDayOfWeek + i) % 7]; 
     } 

     return new List<string>(days); 
    } 
Cuestiones relacionadas