2010-02-18 25 views
6

Tengo un problema con un ensamblado C# (.net 2.0 escrito con Visual Studio 2005) que está instalado en un servidor del Reino Unido y debe usar la configuración regional del Reino Unido.Dónde se establece el entorno/entorno del sistema para .Net

Lo que hace mi código es convertir una fecha en el formato dd/MM/aaaa en utc. es decir, aaaa-mm-dd. El problema surgió con fechas como 16/02/2010 donde el componente no pudo convertir la fecha y devolvió el error. Después de la depuración me di cuenta de que, por alguna extraña razón, CultureInfo devuelto por System.CultureInfo es en-US.

puedo programáticamente cambiar estos ajustes usando:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB", false); 

y mi código funciona bien.

Sin embargo, no quiero hacer eso todo el tiempo, ya que mi sistema debería ser el Reino Unido. Nosotros no. Entonces, ¿cómo puedo cambiar la cultura predeterminada para .Net framework de forma predeterminada en-GB en lugar de en-US?

Para información:

  • he tratado de actualizar el archivo machine.config y especificar la cultura = es-ES para la sección de la globalización (que se establece en punto muerto), pero no funciona bien [han hecho eso para 1.1 y 2.0] pero es posible que no lo haya cambiado correctamente.
  • He verificado la configuración regional de Windows y definitivamente están configurados en el Reino Unido con fechas como dd/MM/aaaa
  • Me estoy ejecutando en un servidor virtual y he verificado mi sistema host. También se establece en Reino Unido

Editar:

Un poco de detalles adicionales sobre el contexto. El ensamblado en cuestión se llama a través de la interoperabilidad COM de un componente nativo de C++ de terceros que se ejecuta como una aplicación COM +.

+0

Podría ser interesante ver si el problema proviene del entorno C++/COM o del sistema operativo. ¿Qué sucede si acaba de escribir una aplicación de consola simple con Console.WriteLine (Thread.CurrentThread.CurrentCulture.DisplayName); ¿Qué muestra? – HackerBaloo

Respuesta

1

No es necesario cambiar CurrentCulture para realizar la transformación. Si está seguro de que la fecha es en forma de "dd/mm/aaaa" se puede utilizar

DateTime dtTemp = DateTime.ParseExact(dateString, "dd/MM/yyyy", null) // in order not to have to specify a FormatProvider 

y luego usar

dtTemp.ToString("yyyy-MM-dd") 

De esta manera usted no tendrá un problema, no importa lo la CurrentCulture es.Sin embargo, si usted no está seguro de que la fecha es de la forma "dd/mm/aaaa" sino que se basa en el formato CurrentCulture corta la fecha, entonces debe usar

DateTime dtTemp = DateTime(dateString, CurrentCulture.DateTimeFormat.ShortDatePattern, CurrentCulture.DateTimeFormat); 
+0

Me gusta esta solución pragmática al problema y pensar en ello, probablemente sea la mejor manera de implementarlo de todos modos, ya que la entrada/salida los formatos realmente son fijos. Todavía me gustaría saber por qué la configuración regional del sistema no funciona como espero. – andynormancx

+0

Se me ocurrió esta solución alternativa, en un caso en el que la configuración regional seleccionada del sistema exigía un formato de "dd/MM/aaaa" pero el usuario había seleccionado la fecha para formatearse como "MM/dd/aaaa". Entonces realmente no podía confiar en la cultura actual. Esto es posible en Windows 7 y creo que en XP también. –

2

Creo que esto está representado por System.Globalization.CultureInfo.InstalledUICulture, así que si nada más puede que copie eso en la cultura actual de la secuencia. Me sorprende que hayas encontrado un caso en el que la cultura de los hilos sea diferente a la cultura instalada. Tal vez su código se ejecuta en un proceso que cambió la cultura?

Es posible que la cuenta que ejecuta el código tenga una configuración regional diferente a la predeterminada del sistema. ¿Lo has comprobado?

+0

No estoy seguro de que la primera sugerencia sea muy diferente a simplemente establecer la cultura explícitamente. Es posible que la cuenta del usuario esté mal configurada, lo comprobaré. – andynormancx

1

Para establecer la cultura y la cultura de interfaz de usuario para todas las páginas, añadir una sección de la globalización en el archivo Web.config y, a continuación, establezca la uiculture y atributos cultura, como se muestra en el siguiente ejemplo:

<globalization uiCulture="en" culture="en-GB" />

+0

El código en cuestión no se está ejecutando dentro de ASP.NET, por lo que no hay ningún archivo web.config, supongo que esa configuración también podría establecerse en el archivo de configuración de la aplicación. Agregaré algunos detalles adicionales a la pregunta sobre el contexto de la llamada. – andynormancx

+0

Mejor respuesta, también es una buena forma de obtener mensajes de error de Google si tienes sistemas con diferentes culturas; además, obtienes errores prematuros por los errores relacionados con 'System.Globalization' que podrías tener en la base de código – mfeineis

3

Hmmm, de acuerdo con el API Docs:

Cuando se inicia un subproceso, su cultura se determina inicialmente mediante el uso de GetUserDefaultLCID de la API de Windows.

Este método deriva su configuración regional del (como su nombre lo indica) Configuración regional predeterminada del usuario, que supongo que está en el Panel de control. NOTA: Esto NO es lo mismo que la configuración regional de la interfaz de usuario.

0

Los ensamblajes en .net framework son cultura neutra.

¿Qué código está tratando de convertir la fecha? Si usa Parse o TryParse, intente proporcionar el argumento cultural para que comprenda la fecha.

5

El servidor no está configurado correctamente. Panel de control + región e idioma, pestaña Ubicación. Cambiar esto podría ser un poco complicado. El servidor puede haber sido mal configurado a propósito. Habla primero con el administrador del servidor antes de hacer cualquier cosa.

Su plan alternativo es utilizar la sobrecarga del método DateTime.TryParse() que toma el argumento IFormatProvider. Pase CultureInfo.GetCultureInfo ("en-gb"). DateTimeFormat.

3

gracias por sus respuestas (andy publicó la pregunta en mi nombre). De hecho, fue un problema con la configuración regional, pero ni con el usuario con el que estaba conectado ni con el usuario con el que se estaba ejecutando el proceso. Eso hubiera sido demasiado fácil. Parece que el usuario predeterminado todavía estaba en-US. Lo reinicié haciendo clic en la casilla "Aplicar configuraciones al usuario actual y al usuario predeterminado ..." en la pestaña avanzada y reiniciando el servidor. System.Globalization.CultureInfo ahora devuelve {en-GB}. Y un MyDate.ToString (aaaa-mm-dd) funciona bien si la fecha se pasa como dd/MM/aaaa o dd-MM-aaaa o aaaa-MM-dd sin la necesidad de analizar.

Sin embargo, muchas gracias a todos por sus sugerencias (ParseExact, etc.) que sí funcionaron. Serán muy útiles para otros formatos de fecha que no pude manejar de una manera agradable (aaaaMMdd).

Marc

+0

observación interesante y valiosa sobre la configuración de usuario predeterminada –

Cuestiones relacionadas