Convertir una cadena a DateTime

591

¿Cómo se convierte una cadena como 2009-05-08 14:40:52,531en a DateTime?

cramopy
fuente
2
@dban ¿Por qué una respuesta de @CMSno marcada como respuesta? Puede haber una razón: tengo curiosidad.
nam
55
El usuario @nam eliminó su cuenta o fue expulsado, no puede hacer clic en ella ni ver reputación / medallas. Lamentablemente, todo lo que podemos hacer es darle el visto bueno.
YumeYume

Respuestas:

754

Como maneja el tiempo basado en 24 horas y tiene una coma que separa la fracción de segundos, le recomiendo que especifique un formato personalizado:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);
CMS
fuente
44
Buenos ojos. No vi la coma en el OP.
lc.
(Creo que querías usar una coma en las cadenas de fecha y formato, ¿verdad?)
lc.
1
Es solo una coma debido a la configuración de la configuración regional europea de OP, ¿qué pasa si lleva ese código a otro servidor con un US? Locale, entonces las fracciones de una sección serán un decimal, no una coma en la cadena guardada, y su solución será rotura. Asegúrese de agregar una marca para el tipo de cadena de fecha y hora entrante para su configuración regional correcta antes de aplicar el analizador correcto. Me sorprende que Microsoft no tenga este código precompilado en otro lugar en CLR o C # .net
finalice el
no se puede convertir a la cadena de fecha y hora MyString = "22/06/1916 3:20:14 PM";
Vinod Kumar
El tiempo de 24 horas y la coma como separador decimal no es una configuración regional personalizada. No debería necesitar ser manejado especialmente.
jpaugh
248

Básicamente tienes dos opciones para esto. DateTime.Parse()y DateTime.ParseExact().

El primero es muy indulgente en términos de sintaxis y analizará las fechas en muchos formatos diferentes. Es bueno para la entrada del usuario que puede venir en diferentes formatos.

ParseExact le permitirá especificar el formato exacto de su cadena de fecha para usar para el análisis. Es bueno usar esto si su cadena siempre está en el mismo formato. De esta manera, puede detectar fácilmente cualquier desviación de los datos esperados.

Puede analizar la entrada del usuario de esta manera:

DateTime enteredDate = DateTime.Parse(enteredString);

Si tiene un formato específico para la cadena, debe usar el otro método:

DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);

"d"representa el patrón de fecha corta (consulte MSDN para obtener más información ) y nullespecifica que la cultura actual debe usarse para analizar la cadena.

Lijadora
fuente
137

prueba esto

DateTime myDate = DateTime.Parse(dateString);

una mejor manera sería esta:

DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
    // handle parse failure
}
gehsekky
fuente
26

Nadie parece implementar un método de extensión. Con la ayuda de la respuesta de @ CMS :

El ejemplo completo y mejorado de fuente completa está aquí: Gist Link

namespace ExtensionMethods {
    using System;
    using System.Globalization;

    public static class DateTimeExtensions {
        public static DateTime ToDateTime(this string s, 
                  string format = "ddMMyyyy", string cultureString = "tr-TR") {
            try {
                var r = DateTime.ParseExact(
                    s: s,
                    format: format,
                    provider: CultureInfo.GetCultureInfo(cultureString));
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }
        }

        public static DateTime ToDateTime(this string s, 
                    string format, CultureInfo culture) {
            try {
                var r = DateTime.ParseExact(s: s, format: format, 
                                        provider: culture);
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }

        }

    }
}

namespace SO {
    using ExtensionMethods;
    using System;
    using System.Globalization;

    class Program {
        static void Main(string[] args) {
            var mydate = "29021996";
            var date = mydate.ToDateTime(format: "ddMMyyyy"); // {29.02.1996 00:00:00}

            mydate = "2016 3";
            date = mydate.ToDateTime("yyyy M"); // {01.03.2016 00:00:00}

            mydate = "2016 12";
            date = mydate.ToDateTime("yyyy d"); // {12.01.2016 00:00:00}

            mydate = "2016/31/05 13:33";
            date = mydate.ToDateTime("yyyy/d/M HH:mm"); // {31.05.2016 13:33:00}

            mydate = "2016/31 Ocak";
            date = mydate.ToDateTime("yyyy/d MMMM"); // {31.01.2016 00:00:00}

            mydate = "2016/31 January";
            date = mydate.ToDateTime("yyyy/d MMMM", cultureString: "en-US"); 
            // {31.01.2016 00:00:00}

            mydate = "11/شعبان/1437";
            date = mydate.ToDateTime(
                culture: CultureInfo.GetCultureInfo("ar-SA"),
                format: "dd/MMMM/yyyy"); 
         // Weird :) I supposed dd/yyyy/MMMM but that did not work !?$^&*

            System.Diagnostics.Debug.Assert(
               date.Equals(new DateTime(year: 2016, month: 5, day: 18)));
        }
    }
}
guneysus
fuente
Nobody seems to implemented an extension methodtal vez porque no es necesario ...
Yousha Aleayoub
A veces, la biblioteca estándar no se ajusta a nuestras necesidades. Y es por eso que necesito / uso de bibliotecas auxiliares. Usar la forma del método de extensión, o una API fluida, es preferir FP sobre OOP o viceversa. Ni correcto ni incorrecto. Es elección. @YoushaAleayoub
guneysus
23

Lo intenté de varias maneras. Lo que funcionó para mí fue esto:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data para mí fueron momentos como este 24/09/2017 9:31:34 AM

zeilja
fuente
Se ve mejor, ¿puede asignar su valor a la variable DateTime?
Birhan Nega
20

Pruebe lo siguiente, donde strDate es su fecha en formato 'MM / dd / aaaa'

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))
Krishna
fuente
1
Nadie mencionó que solo funciona con ese formato en particular.
T.Todua
Lástima ... 🙂 Los codificadores siempre piensan que los demás codificadores descubrirán ... Lo bueno en realidad ... Haznos pensar más ...
Krishna el
15
string input;
DateTime db;
Console.WriteLine("Enter Date in this Format(YYYY-MM-DD): ");
input = Console.ReadLine();
db = Convert.ToDateTime(input);

//////// this methods convert string value to datetime
///////// in order to print date

Console.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);
Umair Baig
fuente
1
¿Te perdiste la parte del tiempo? Necesito fecha y hora, ¿cómo puedo hacer eso?
Badhon Jain
15

DateTime.Parse

Sintaxis:

DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)

Ejemplo:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • Valor: representación de cadena de fecha y hora.
  • Proveedor: objeto que proporciona información específica de la cultura.
  • Estilos: opciones de formato que personalizan el análisis de cadenas para algunos métodos de análisis de fecha y hora. Por ejemplo, AllowWhiteSpaces es un valor que ayuda a ignorar todos los espacios presentes en la cadena mientras se analiza.

También vale la pena recordar que DateTime es un objeto que se almacena internamente como número en el marco, el formato solo se aplica cuando lo convierte de nuevo en cadena.

  • Analizando la conversión de una cadena al tipo de número interno.

  • Formateo que convierte el valor numérico interno en una cadena legible.

Recientemente tuve un problema en el que estaba tratando de convertir un DateTime para pasar a Linq, lo que no me había dado cuenta en ese momento era que el formato es irrelevante al pasar DateTime a una consulta de Linq.

DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);

Documentación completa de fecha y hora

Mr.B
fuente
14

También puede usar DateTime. TryParseExact () como se muestra a continuación si no está seguro del valor de entrada.

DateTime outputDateTimeValue;
if (DateTime.TryParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out outputDateTimeValue))
{
    return outputDateTimeValue;
}
else
{
    // Handle the fact that parse did not succeed
}
dev.bv
fuente
2

Pon este código en una clase estática> public static class ClassName{ }

public static DateTime ToDateTime(this string datetime, char dateSpliter = '-', char timeSpliter = ':', char millisecondSpliter = ',')
{
   try
   {
      datetime = datetime.Trim();
      datetime = datetime.Replace("  ", " ");
      string[] body = datetime.Split(' ');
      string[] date = body[0].Split(dateSpliter);
      int year = date[0].ToInt();
      int month = date[1].ToInt();
      int day = date[2].ToInt();
      int hour = 0, minute = 0, second = 0, millisecond = 0;
      if (body.Length == 2)
      {
         string[] tpart = body[1].Split(millisecondSpliter);
         string[] time = tpart[0].Split(timeSpliter);
         hour = time[0].ToInt();
         minute = time[1].ToInt();
         if (time.Length == 3) second = time[2].ToInt();
         if (tpart.Length == 2) millisecond = tpart[1].ToInt();
      }
      return new DateTime(year, month, day, hour, minute, second, millisecond);
   }
   catch
   {
      return new DateTime();
   }
}

De esta manera, puedes usar

string datetime = "2009-05-08 14:40:52,531";
DateTime dt0 = datetime.TToDateTime();

DateTime dt1 = "2009-05-08 14:40:52,531".ToDateTime();
DateTime dt5 = "2009-05-08".ToDateTime();
DateTime dt2 = "2009/05/08 14:40:52".ToDateTime('/');
DateTime dt3 = "2009/05/08 14.40".ToDateTime('/', '.');
DateTime dt4 = "2009-05-08 14:40-531".ToDateTime('-', ':', '-');
MRT2017
fuente
2

Acabo de encontrar una manera elegante:

Convert.ChangeType("2020-12-31", typeof(DateTime));

Convert.ChangeType("2020/12/31", typeof(DateTime));

Convert.ChangeType("2020-01-01 16:00:30", typeof(DateTime));

Convert.ChangeType("2020/12/31 16:00:30", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("en-GB"));

Convert.ChangeType("11/شعبان/1437", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("ar-SA"));

Convert.ChangeType("2020-02-11T16:54:51.466+03:00", typeof(DateTime)); // format: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz"
guneysus
fuente
1

Diferentes culturas en el mundo escriben cadenas de fechas de diferentes maneras. Por ejemplo, en los Estados Unidos el 20/01/2008 es el 20 de enero de 2008. En Francia, esto arrojará una InvalidFormatException. Esto se debe a que Francia lee las fechas y horas como Día / Mes / Año, y en los Estados Unidos es Mes / Día / Año.

En consecuencia, una cadena como 20/01/2008 se analizará hasta el 20 de enero de 2008 en Francia y luego arrojará una InvalidFormatException en los EE. UU.

Para determinar su configuración de cultura actual, puede usar System.Globalization.CultureInfo.CurrentCulture.

string dateTime = "01/08/2008 14:50:50.42";  
        DateTime dt = Convert.ToDateTime(dateTime);  
        Console.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}",  
                          dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);  
Saeed Dini
fuente
1
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

este te da

2019-08-17 11:14:49.000
Abdulhakim Zeinu
fuente
-1

¿Lo quieres rápido?

Digamos que tiene una fecha con el formato aaMMdd.

La forma más rápida de convertirlo que encontré es:

var d = new DateTime(
(s[0] - '0') * 10 + s[1] - '0' + 2000, 
(s[2] - '0') * 10 + s[3] - '0', 
(s[4] - '0') * 10 + s[5] - '0')

Simplemente, elija los índices de acuerdo con su formato de fecha de elección. Si necesita velocidad, probablemente no le importe la forma 'no genérica' de la función.

Este método toma aproximadamente el 10% del tiempo requerido por:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
David
fuente