Преобразовать строку даты в формат DateTime - PullRequest
1 голос
/ 06 ноября 2019

У меня есть строка даты типа 03/10/1999, где формат dd/MM/yyyy (формат pt-BR).

И мне нужно преобразовать эту дату в SQL-подобный формат yyyy-MM-dd HH:mm:ss.fff.

Я пытался использовать функции Parse и ParseExact, но пока безуспешно. Я приведу результаты ниже ...


Использование Разбор

var BrazilianDate = "03/10/1999";
var Parse = DateTime.Parse(BrazilianDate, new CultureInfo("pt-BR"));
Console.WriteLine("Parsed date: " + Parse);

Вывод: Parsed date: 10/3/1999 12:00:00 AM

Без дефисов или миллисекунд...


Использование ParseExact

var BrazilianDate = "03/10/1999";
var ParseExact = DateTime.ParseExact(BrazilianDate, "yyyy-MM-dd HH:mm:ss.fff", new CultureInfo("pt-BR"));
Console.WriteLine(ParseExact);

вывод:

Исключение во время выполнения (строка -1):Строка не была распознана как действительный DateTime.

Трассировка стека:

[System.FormatException: строка не была распознана как действительный DateTime.] В System.DateTimeParse.ParseExact (String s, Stringформат, DateTimeFormatInfo dtfi, стиль DateTimeStyles) в System.DateTime.ParseExact (String s, String format, поставщик IFormatProvider) в Program.Main ()

Ответы [ 3 ]

5 голосов
/ 06 ноября 2019

Вам необходимо отформатировать вывод с правильной строкой форматирования, например:

Console.WriteLine("Parsed date: " + Parse.ToString("yyyy-MM-dd HH:mm:ss.fff"));
//Parsed date: 1999-10-03 00:00:00.000

Если вы не укажете формат, .NET выбирает то, что считает правильным (что часто бываетне в США).

Вам также необходимо строго разделять значение DateTime и его представление в форме string. Независимо от того, как вы его отформатируете, само значение останется прежним.

2 голосов
/ 06 ноября 2019

Строка формата, которую вы используете в методе parse, представляет формат входной строки.

A DateTime не имеет формата отображения, фактически это числовое значение, представляющее количество тиковначиная с определенной эпохи. Из официальной документации :

Значения времени измеряются в единицах по 100 наносекунд, называемых тиками. Конкретной датой является количество тиков с 12:00 полуночи 1 января 0001 г. н.э. (CE) в календаре GregorianCalendar. В число не входят тики, которые будут добавлены в високосные секунды. Например, значение тиков 31241376000000000L представляет дату пятница, 01 января, 0100 12:00:00, полночь.

При разборе строк я считаю, что лучше всего использовать ParseExact или TryParseExact. Чтобы напечатать наше строковое представление значения DateTime, используйте перегрузку ToString, которая принимает string, который представляет формат, который вы хотите отобразить.

var BrazilianDateString = "03/10/1999";
var DateTimeValue = DateTime.ParseExact(BrazilianDate, "dd/MM/yyyy", CultureInfo.InvariantCulture);
Console.WriteLine(DateTimeValue.ToString("yyyy-MM-dd HH:mm:ss.fff");
0 голосов
/ 06 ноября 2019

Этот код работает для меня:

        DateTime dt = new DateTime();

        string x = "03/10/1999 22:10:10";

        dt = DateTime.Parse(x);

        Console.WriteLine(dt.ToShortDateString());
        Console.WriteLine(dt.ToShortTimeString());

        Console.ReadLine();

Вывод на консоль:

03/10/10 1999

22: 10

Дон 'Если использовать CultureInfo, DateTime может самостоятельно понимать испанско-бразильские даты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...