@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:
(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.
"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.
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;publicstaticclassDateTimeExtensions{publicstaticDateTimeToDateTime(thisstring 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}}publicstaticDateTimeToDateTime(thisstring 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;classProgram{staticvoidMain(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(newDateTime(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:
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 dateConsole.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);
stringvalue="1 January 2019";CultureInfo provider =newCultureInfo("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.
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}
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.
Digamos que você tenha uma data com o formato yyMMdd.
A maneira mais rápida de convertê-lo que encontrei é:
var d =newDateTime((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);
@CMS
não marcada como resposta? Pode haver uma razão - estou curioso.Respostas:
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:
fonte
Você tem basicamente duas opções para isso.
DateTime.Parse()
eDateTime.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:
Se você tiver um formato específico para a sequência, use o outro método:
"d"
significa o padrão de data curta (consulte o MSDN para obter mais informações ) enull
especifica que a cultura atual deve ser usada para analisar a sequência.fonte
tente isso
uma maneira melhor seria esta:
fonte
Use
DateTime.Parse(string)
:fonte
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
fonte
Nobody seems to implemented an extension method
talvez porque não seja necessário ...Eu tentei de várias maneiras. O que funcionou para mim foi o seguinte:
data
para mim foram momentos como este 24/09/2017 09:31:34fonte
Experimente o abaixo, onde strDate é a sua data no formato 'MM / dd / aaaa'
fonte
Convert.ToDateTime ou DateTime.Parse
fonte
fonte
DateTime.Parse
Sintaxe:
Exemplo:
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.
Documentação completa
fonte
Você também pode usar DateTime.TryParseExact () como abaixo se não tiver certeza do valor de entrada.
fonte
Coloque esse código em uma classe estática
> public static class ClassName{ }
Dessa forma, você pode usar
fonte
Acabei de encontrar uma maneira elegante:
fonte
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.
fonte
esse te dá
fonte
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 é:
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:
fonte