2011-05-05 22 views
5

I cámara tratando de convertir una fecha a cadena y vuelta, pero haciendo que funcione para todas las culturas.¿Cómo hacer que DateTime sea independiente de la cultura actual?

Básicamente tengo un Textbox (tbDateTime) y una etiqueta (lbDateTime). La etiqueta le dice al usuario, en qué formato el software espera la entrada de tbDateTime. La entrada del Textbox se usará para un comando MySQL.

Actualmente funciona así:

lbDateTime.Text = "DD.MM.YYYY hh:mm:ss"; // I live in germany 
DateTime date = Convert.ToDateTime(tbDateTime.Text); 
String filter = date.ToString("yyyy-MM-dd HH:mm:ss"); 

Ahora mi pregunta:

  • ¿Es posible determinar el formato de cadena para lbDateTime.Text basado en la cultura actual?
  • ¿Qué formato utiliza la función Convert.ToDateTime?

Espero que me puedan ayudar. En realidad, no tengo una pc aquí para probar diferentes culturas, así que tengo mucho miedo de hacer algo mal.

Respuesta

5

En lugar de utilizar el método Convert.ToDateTime se pueden utilizar los métodos DateTime.Parse o DateTime.ParseExact. Ambos le permiten aprobar una cultura que indica cómo espera que se formatee la fecha.

El método DateTime.ParseExact también le permite especificar el formato que espera, por lo que puede analizar más o menos cualquier formato con este método.

Editar:
En cuanto Convert.ToDateTime. La documentación dice que la cultura actual se utiliza al analizar: http://msdn.microsoft.com/en-us/library/xhz1w05e.aspx

La cultura actual se puede encontrar mediante la propiedad System.Threading.Thread.CurrentThread.CurrentCulture.

Edit2:
Oh. Es posible que también desee utilizar DateTime.TryParse y DateTime.TryParseExact si no está seguro de si el formato proporcionado no es válido.

Edit3:
Un montón de ediciones aquí ... Veo que desea determinar la cadena de cultura que coincide con la fecha ha entrado el usuario. No hay una solución general que garantice que funcione aquí. Digamos, por ejemplo, que el usuario ingresó la fecha 01.02.11. No hay forma de estar seguro si esta fecha es en día.mes.año o mes.día.año o año.mes.día y así sucesivamente.

Lo mejor que puede hacer es tener una lista de culturas de entrada esperadas y comenzar con las más probables e intentar analizar la fecha usando eso. Si eso falla, puede probar el segundo más probable y así sucesivamente ...

Pero esto realmente no es recomendable. O bien, proporcione al usuario un formato esperado, o mejor, utilice un cuadro de entrada de fecha que garantice que recibirá la fecha seleccionada en un formato apropiado.

5

El método Convert.ToDateTime llamará DateTime.Parse para analizar la cadena, utilizando la referencia cultural actual (CultureInfo.Current).

Puede especificar una referencia cultural al analizar la cadena.Ejemplo:

DateTime data = DateTime.Parse(tbDateTime.Text, new CultureInfo("en-GB")); 

Usted puede utilizar DateTime.ParseExact (o DateTime.TryParseExact) para analizar la cadena utilizando un formato de fecha personalizado. Ejemplo:

DateTime data = DateTime.ParseExact(tbDateTime.Text, "dd'.'MM'.'yyyy HH':'mm':'ss", CultureInfo.InvariantCulture); 
+0

DateTime.Parse está lanzando error al convertir de fecha árabe al de fecha y hora en-US. "La cadena no fue reconocida como un DateTime válido". cómo deshacerse de esto? ¿Alguna idea? –

0

Otra solución:

// Specify the current language (used in the current system you are working on) 
CultureInfo currentCulture = CultureInfo.GetCultureInfo(CultureInfo.CurrentCulture.ToString()); 
// Specify the language that we need 
CultureInfo myLanguage = CultureInfo.GetCultureInfo("en-US"); 

// Adapt the DateTime here, we will use the current time for this example 
DateTime currentDate = DateTime.Now; 
// The date in the format that we need 
string myDate = DateTime.Parse(currentDate.ToString(), currentCulture).ToString(myLanguage); 
Cuestiones relacionadas