La cadena no se reconoció como un "formato dd / MM / aaaa" válido de fecha y hora.

172

Estoy tratando de convertir mi valor con formato de cadena a tipo de fecha con formato dd/MM/yyyy.

this.Text="22/11/2009";

DateTime date = DateTime.Parse(this.Text);

Cuál es el problema ? Tiene una segunda anulación que pide IFormatProvider. ¿Que es esto? ¿ Necesito pasar esto también? En caso afirmativo, ¿cómo usarlo para este caso?

Editar

¿Cuáles son las diferencias entre Parsey ParseExact?

Editar 2

Ambas respuestas de Slaks y Sam están funcionando para mí, actualmente el usuario está dando la entrada pero esto me asegurará que son válidas usando maskTextbox.

Qué respuesta es mejor teniendo en cuenta todos los aspectos, como la seguridad de tipografía, el rendimiento o algo que te parezca

Shantanu Gupta
fuente
77
@Edit: Para eso está la documentación. msdn.microsoft.com/en-us/library/w2sa9yss.aspx
SLaks
2
ParseExact es para cuando conoces el formato exacto de la cadena de fecha, Parse es cuando quieres algo que pueda manejar algo un poco más dinámico.
gingerbreadboy

Respuestas:

255

Uso DateTime.ParseExact.

this.Text="22/11/2009";

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
Samuel Neff
fuente
8
¿Por qué tenemos que pasar nulo aquí?
Shantanu Gupta
3
La entrada puede ser "22/11/2009 12:00:00 AM" o "22/11/2009". Además, la cultura de la máquina de desarrollo puede ser diferente de la cultura de producción. Entonces, ¿el código anterior funcionará a la perfección?
Rahatur
8
@Rahat, el análisis exacto no funcionará si el formato no coincide. El patrón de formato anterior es dd/MM/yyyypara que una cadena de texto con un tiempo no se analice correctamente. Deberá quitar el tiempo o incluirlo en el patrón de formato. Hay una sobrecarga ParseExactque acepta una variedad de patrones de formato y analizará el texto si coincide con alguno de ellos.
Samuel Neff
77
@SamuelNeff ¿Por qué no usa en CultureInfo.InvariantCulturelugar del actual si está definiendo un formato de todos modos?
Alvin Wong
3
@Toolkit La razón es que las barras en la cadena de formato no son barras literales. Se sustituyen por la cadena del separador de fecha en la cultura actual. Por lo tanto, depende de la cultura en la forma en que está escrito anteriormente. Samuel Neff, intenta Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");, romperá tu solución. Para arreglar eso, use "dd'/'MM'/'yyyy"(protegiendo las barras con comillas simples), o @"dd\/MM\/yyyy"("escapando" de las barras con barras invertidas).
Jeppe Stig Nielsen
44

Debe llamar ParseExact, lo que analiza una fecha que coincide exactamente con el formato que proporciona.

Por ejemplo:

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);

El IFormatProviderparámetro especifica la cultura a utilizar para analizar la fecha.
A menos que su cadena provenga del usuario, debe pasar CultureInfo.InvariantCulture.
Si la cadena proviene del usuario, debe pasar CultureInfo.CurrentCulture, que utilizará la configuración que el usuario especificó en Opciones regionales en el Panel de control.

SLaks
fuente
2
@Slaks: CultureInfo.InvariantCulture no está disponible en el código. ¿Necesito usar algún espacio de nombres
Shantanu Gupta
3
using System.Globalization;
Fugas
2
También puede hacer clic con el botón derecho en el error y hacer clic en resolver, esto colocará el espacio de nombres que falta para usted.
Inkey
también puede hacer clic doble el error y ve una flecha hacia abajo que muestran espacios de nombres relacionados que pueden utilizarse
Usman Younas
Los espacios también cuentan, por ejemplo, si su formato de cadena es "MM / dd / aaaa HH: mm: ss" (nota - 2 espacios) - entonces su formato para ParseExact también debe incluir los espacios
Chris Halcrow
20

Analizar una representación de cadena de un DateTime es algo complicado porque las diferentes culturas tienen diferentes formatos de fecha. .Net conoce estos formatos de fecha y los extrae de su cultura actual ( System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat) cuando llama DateTime.Parse(this.Text);

Por ejemplo, la cadena "22/11/2009" no coincide con ShortDatePattern para los Estados Unidos (en-US) pero sí con Francia (fr-FR).

Ahora, puede llamar DateTime.ParseExacty pasar en la cadena de formato exacta que espera, o puede pasar una cultura apropiada DateTime.Parsepara analizar la fecha.

Por ejemplo, esto analizará su fecha correctamente:

DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );

Por supuesto, no solo debes elegir al azar Francia, sino algo apropiado para tus necesidades.

Lo que necesita saber es qué System.Threading.Thread.CurrentThread.CurrentCultureestá configurado y si / por qué difiere de lo que espera.

Greg
fuente
su solución no funciona para mí, da un error como "La cadena no se reconoció como una fecha y hora válida" y estoy pasando la siguiente fecha de entrada: "13/06/17" a su solución pero da error. Por favor, ayúdenme.
Ghanshyam Lakhani
16

Aunque las soluciones anteriores son efectivas, también puede modificar el archivo webconfig con lo siguiente ...

<configuration>
   <system.web>
     <globalization culture="en-GB"/>
   </system.web>
</configuration>

Ref: formato de fecha y hora diferente en la máquina local en comparación con la máquina de producción

Amit Philips
fuente
1
Amit Philips, me salvaste el día. Intenté todas las cosas posibles. Y este pequeño cambio funciona. Gracias.
RNH
1
Amit, eres verdaderamente el hijo de Dios.
The Furious Bear
10

Es posible que deba especificar la cultura para ese formato de fecha específico como en:

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy

    this.Text="22/11/2009";

    DateTime date = DateTime.Parse(this.Text);

Para más detalles ir aquí:

http://msdn.microsoft.com/en-us/library/5hh873ya.aspx

Ricardo Sanchez
fuente
4

Después de pasar mucho tiempo, he resuelto el problema.

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
atik sarker
fuente
3

use esto para convertir cadenas a fecha y hora:

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
AshifJM
fuente
3

Basado en esta referencia , el siguiente enfoque funcionó para mí:

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
Jesús Castro
fuente
2
private DateTime ConvertToDateTime(string strDateTime)
{
DateTime dtFinaldate; string sDateTime;
try { dtFinaldate = Convert.ToDateTime(strDateTime); }
catch (Exception e)
{
string[] sDate = strDateTime.Split('/');
sDateTime = sDate[1] + '/' + sDate[0] + '/' + sDate[2];
dtFinaldate = Convert.ToDateTime(sDateTime);
}
return dtFinaldate;
}
Bala Kumar
fuente
1

Al igual que alguien anterior dijo que puede enviarlo como un parámetro de cadena, pero debe tener este formato: '20130121', por ejemplo, y puede convertirlo a ese formato tomándolo directamente del control. Entonces lo obtendrá, por ejemplo, de un cuadro de texto como:

date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"

para convertirlo a: '20130121' usa:

date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);

para que SQL pueda convertirlo y ponerlo en su base de datos.

G Jeny Ramirez
fuente
0

Puedes usar también

this.Text = "22112009";
DateTime newDateTime = new DateTime(Convert.ToInt32(this.Text.Substring(4, 4)), // Year
                                    Convert.ToInt32(this.Text.Substring(2,2)), // Month
                                    Convert.ToInt32(this.Text.Substring(0,2)));// Day
Serkan Hekimoglu
fuente
0

Me funcionó debajo del código:

DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));

Espacio de nombres

using System.Globalization;
Anjan Kant
fuente
-6

Cambiar manualmente:

string s = date.Substring(3, 2) +"/" + date.Substring(0, 2) + "/" + date.Substring(6, 4);

A partir del 22/11/2015 se convertirá en 22/11/2015

sarta
fuente