Convertendo uma String em DateTime


591

Como você converte uma string como 2009-05-08 14:40:52,531em DateTime?


2
@dban Por que uma resposta @CMSnão marcada como resposta? Pode haver uma razão - estou curioso.
nam

5
@nam O usuário excluiu sua conta ou foi banido, não pode clicar nela nem ver reputação / medalhas. Infelizmente, tudo o que podemos fazer é ajudá-lo.
precisa saber é o seguinte

Respostas:


754

Como você está lidando com o tempo baseado em 24 horas e possui uma vírgula separando a fração de segundos, recomendo que você especifique um formato personalizado:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);

4
Bons olhos. Não vi a vírgula no OP.
lc.

(Eu acho que você pretendia usar uma vírgula nas strings de data e formato, certo?)
lc.

1
É apenas uma vírgula por causa da configuração de localidade europeia dos OPs, e se você levar esse código para outro servidor com um US.Locale, as frações de uma seção serão decimais e não vírgulas na string salva, e sua solução será quebrar. Certifique-se de adicionar uma verificação para o tipo de sequência de data / hora de entrada para o seu Código de idioma correto antes de aplicar o analisador correto. Estou surpreso que a Microsoft já não tem este prebuild código em outro lugar no CLR ou C # .net
Hamish

não foi possível converter isso para a data e hora string MyString = "22/06/1916 15:20:14";
Vinod Kumar

O tempo de 24 horas e a vírgula como separador decimal não são um código de idioma personalizado. Não deve ser tratado especialmente.
jpaugh

248

Você tem basicamente duas opções para isso. DateTime.Parse()e DateTime.ParseExact().

O primeiro é muito tolerante em termos de sintaxe e analisa datas em muitos formatos diferentes. É bom para a entrada do usuário, que pode vir em diferentes formatos.

ParseExact permitirá que você especifique o formato exato da sua sequência de datas a ser usada para análise. É bom usar isso se sua string estiver sempre no mesmo formato. Dessa forma, você pode detectar facilmente quaisquer desvios dos dados esperados.

Você pode analisar a entrada do usuário assim:

DateTime enteredDate = DateTime.Parse(enteredString);

Se você tiver um formato específico para a sequência, use o outro método:

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

"d"significa o padrão de data curta (consulte o MSDN para obter mais informações ) e nullespecifica que a cultura atual deve ser usada para analisar a sequência.


137

tente isso

DateTime myDate = DateTime.Parse(dateString);

uma maneira melhor seria esta:

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


26

Ninguém parece ter implementado um método de extensão. Com a ajuda da resposta do @ CMS :

Exemplo de código-fonte completo e em funcionamento está aqui: 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)));
        }
    }
}

Nobody seems to implemented an extension methodtalvez porque não seja necessário ...
Yousha Aleayoub

Às vezes, a biblioteca padrão não se encaixa em nossas necessidades. E é por isso que é necessário / usar bibliotecas auxiliares. Usando o método de extensão, a API fluente prefere FP em vez de OOP ou vice-versa. Nem correto nem errado. É escolha. @YoushaAleayoub
guneysus

23

Eu tentei de várias maneiras. O que funcionou para mim foi o seguinte:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data para mim foram momentos como este 24/09/2017 09:31:34


Parece melhor, pode atribuir seu valor à variável DateTime?
Birhan Nega

20

Experimente o abaixo, onde strDate é a sua data no formato 'MM / dd / aaaa'

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))

1
Ninguém mencionou que ele funciona apenas com esse formato específico.
T.Todua

Pena ... 🙂 codificadores sempre pensar companheiros codificadores vai descobrir ... Boa coisa realmente ... fazer-nos pensar mais ...
Krishna


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);

1
Você perdeu a parte do tempo? Preciso de data e hora. Como posso fazer isso?
Badhon Jain 29/09

15

DateTime.Parse

Sintaxe:

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

Exemplo:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • Valor: representação de string de data e hora.
  • Fornecedor: objeto que fornece informações específicas da cultura.
  • Estilos: opções de formatação que personalizam a análise de strings para alguns métodos de análise de data e hora. Por exemplo, AllowWhiteSpaces é um valor que ajuda a ignorar todos os espaços presentes na string enquanto ela analisa.

Também vale lembrar que DateTime é um objeto que é armazenado como número internamente na estrutura. O formato só se aplica a ele quando você o converte novamente em string.

  • Analisando a conversão de uma sequência para o tipo de número interno.

  • Formatação convertendo o valor numérico interno em uma sequência legível.

Recentemente, tive um problema em que estava tentando converter um DateTime para passar para o Linq, o que eu não havia percebido no momento em que o formato era irrelevante ao passar o DateTime para uma consulta do Linq.

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

Documentação completa


14

Você também pode usar DateTime.TryParseExact () como abaixo se não tiver certeza do 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
}

2

Coloque esse código em uma classe 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();
   }
}

Dessa forma, você pode 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('-', ':', '-');

2

Acabei de encontrar uma maneira 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"

1

Diferentes culturas do mundo escrevem strings de diferentes maneiras. Por exemplo, nos EUA em 20/01/2008 é 20 de janeiro de 2008. Na França, isso gera uma InvalidFormatException. Isso ocorre porque a França lê as datas como Dia / Mês / Ano e, nos EUA, é Mês / Dia / Ano.

Conseqüentemente, uma sequência como 20/01/2008 será analisada até 20 de janeiro de 2008 na França e lançará uma InvalidFormatException nos EUA.

Para determinar suas configurações de cultura atuais, você pode 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);  

1
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

esse te dá

2019-08-17 11:14:49.000

-1

Você quer isso rápido?

Digamos que você tenha uma data com o formato yyMMdd.

A maneira mais rápida de convertê-lo que encontrei é:

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')

Basta escolher os índices de acordo com o formato de data escolhido. Se você precisa de velocidade, provavelmente não se importa com a maneira 'não genérica' da função.

Esse método leva cerca de 10% do tempo necessário para:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.