2008-11-25 40 views
16

No estoy seguro de lo que está sucediendo aquí.String.Format (formato, fecha) ignora el formato

Tengo un objeto DateTime, y cuando intento:

String.Format("{0:dd/MM/yyyy}", _date) 

el valor devuelto es:

"24-05-1967" 

Lo que yo quiero es

"24/05/1967" 

¿Puede alguien explicar por qué mi la cadena de formato está siendo ignorada?

Un poco más de fondo: Esta es una aplicación web que comenzó como .net 1.1, y estoy en el proceso de moverlo a 2.0/3.5.

Actualización:

Si cambio el formato a {0: dd: MM: aaaa}, devuelve 24: 05: 1967 - es sólo el/la cadena de formato que se cambia a la - Char.


Resolución:

Al actualizar la aplicación para ejecutarse en 2.0, los valores de globalización de ASP.NET fueron mal estado.

Desde las propiedades del sitio web, la pestaña ASP.NET, la Configuración de edición, la Ficha de la aplicación: la cultura y la interfaz de usuario Cultura se establecieron en el primer elemento de la lista (af-ZA) por alguna razón extraña.

Respuesta

24

El/es en realidad el separador de fecha para su cultura específica que podría ser -, en otras palabras, la cadena de formato no se ignora sino que se usa correctamente . Mira lo que CultureInfo se asocia con el hilo conductor:

System.Threading.Thread.CurrentThread.CurrentCulture 

Si intenta esto:

String.Format(new CultureInfo("en-US"), "{0:dd/MM/yyyy}", DateTime.Now); 

Va a obtener la fecha formateado con/ya que es la correcta para el separador en-US. Lo que probablemente debería hacer es utilizar la cadena de formato de fecha corta y asegúrese de que el hilo tiene el cultivo apropiado asociado, entonces esto sería conseguir lo que quiere y va a trabajar en una aplicación globalizado, así:

DateTime.Now.ToString("d", Thread.CurrentThread.CurrentCulture); 

¡Espero que esto ayude!

+0

+1 para recordar que '/' se convierte para cultura Y señalar que el especificador de cadena de fecha corta 'd' puede ser mejor :) – Nij

9

Es probable que desee utilizar el método ToString() de su objeto DateTime para obtener la representación de cadena que está buscando. Una cadena de formato de "dd"/"MM"/"aaaa" le dará el formato que describió. Tenga en cuenta que necesita escapar caracteres literales en la cadena de formato utilizando comillas simples.

Ejemplo: DateTime.Now.ToString("dd'/'MM'/'yyyy");

+0

Gracias, que funciona - no creo que sepa cuándo esto cambió (entre 1,1 y 3,5) y hacia dónde se documentó? – chris

+0

Consulte .NET Framework 3.5: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx (.NET 3.5) y .NET Framework 1.1: http://msdn.microsoft.com/en-us /library/8kb3ddd4(VS.71).aspx (.NET 1.1) para más detalles. No parece que la API haya cambiado para cadenas de formato de fecha y hora personalizadas. – Oppositional

0

Eso es raro. Ese formato funciona correctamente para mí. Es posible que desee probar _date.ToString ("dd/MM/aaaa") en su lugar (aunque eso es solo una toma en la oscuridad).

0

Las configuraciones regionales (¿en el servidor web?) Tienen los delimitadores de fecha en '-'. En mi configuración regional (EE), la salida sería "24.05.1967" :)

1

A menos que especifique el IFormatProvider (generalmente un objeto CultureInfo), usará de forma predeterminada el formato de fecha/hora de Thread.CurrentThread.CurrentCulture, que le proporcionará los resultados cambiantes.

Y sí, cambiará/pero no:.

La solución en este caso es para especificar el proveedor de formato, como este:

String.Format(CultureInfo.InvariantCulture, "{0:dd/MM/yyyy}", _date) 
1

El carácter "/" es el marcador de posición neutra de cultivo para el carácter separador de fecha y hora que se define en la configuración regional. Así es el personaje ":" para el tiempo.

Para incrustar el "/" literalmente y no como un marcador de posición, debe encerrarlo entre comillas simples '/' en la cadena de formato.

0

esto le dará su requerido salida

String.Format("{0:dd/MM/yyyy}", Convert.ToDateTime(_date)); 
0

hilo Interesante!

Tengo una aplicación que se lee en un archivo Excel y permite al usuario exportar sus datos a un archivo .csv en un formato definido por el usuario.

Específicamente, quería dar a los usuarios la capacidad de exportar fechas a (exactamente) un formato como aaaa/mm/dd, independientemente de la información cultural de su computadora portátil.

He intentado algunas de estas sugerencias, pero el único que hizo el trabajo fue la sugerencia de Pop Catalin, para envolver cualquier/caracteres con apóstrofes:

outputFormat = outputFormat.Replace("/", "'/'"); 
valueToExport = ImportedDate.ToString(outputFormat); 

Este parece ser el única manera de forzar ToString() para usar la cadena de formato exacta, sin intentar hacer nada específico de Cultura.

actualización

siempre resulta divertido cuando contesto una pregunta StackOverflow, después haga clic en el mismo error de unos pocos años más tarde, y tropezar a través de mi propia respuesta!

Como se mencionó en muchas de estas respuestas, la solución es envolver caracteres de barra diagonal en apóstrofes, para forzar ToString() a ignorar las configuraciones de cultivo.

Por lo tanto, si su configuración de Cultura tiene un carácter de parada completa como carácter separador de fechas (por ejemplo, "20.07.2015"), esto es lo que verá cuando intente formatear la fecha de Navidad y cómo puede forzar fácilmente a siempre uso de avance-barras:

DateTime dtChristmas = new DateTime(2015, 12, 31); 

// This might return "31/12/2015", "31.12.2015", etc, depending on Culture settings 
string str1 = dtChristmas.ToString("dd/MM/yyyy"); 

// ...but these two statements will both *always* return "31/12/2015" 
string str2 = dtChristmas.ToString("dd'/'MM'/'yyyy"); 
string str3 = dtChristmas.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);