Преобразовать в DateTime из строки, содержащей десятичные разделители и разделители с запятой - PullRequest
4 голосов
/ 02 октября 2011

Учитывая следующие 2 строки, обратите внимание на ".185" и ", 185"

  • 2011-09-15 17:05:37,185
  • 2011-09-15 17:05:37.185

Чтение из файла (не в моем распоряжении), и я вижу, что у них есть даты в обоих форматах. Мне нужно создать функцию для обоих сценариев.

Являются ли '. ' и ', ' специфичными для культуры?

Есть предложения по такой функции?

Это ниже не работает, так как у меня нет даты.

 class Program
{
    static void Main(string[] args)
    {
        string date1="2011-09-15 17:05:37.185";
        string date2="2011-09-15 17:05:37,185";

        const string format1 = "dd/MM/yyyy HH:mm:ss.ff";
        const string format2 = "dd/MM/yyyy HH:mm:ss,ff";
        DateTime resultDate1;
        DateTime resultDate2;
        DateTime.TryParseExact(date1, format1, CultureInfo.InvariantCulture, DateTimeStyles.None, out resultDate1);
        DateTime.TryParseExact(date2, format2, CultureInfo.InvariantCulture, DateTimeStyles.None, out resultDate2);
         Console.WriteLine(resultDate1.ToString());
         Console.WriteLine(resultDate2.ToString());
         Console.Read();
     }
  }

Ответы [ 2 ]

8 голосов
/ 02 октября 2011

Это. и, специфическая культура?

Да. В Европе запятую часто используют вместо точки в качестве десятичного разделителя.

Есть предложения по решению?

Да. Сначала я подумал, что функции DateTime.ParseExact () / DateTime.TryParseExact () имеют перегрузку , которая позволяет массив форматов для тестирования. Вы можете включить как вариант en-US, так и вариант en-GB. За исключением того, что я не думаю, что это сработает, поскольку вы все еще можете включить только один спецификатор культуры. Так что вместо этого я рекомендую вызывать .Replace () перед передачей строки в функцию ParseExact, чтобы изменить любые запятые, которые могут быть в строке, на точки.

В вашем обновленном примере кода строка формата просто не соответствует датам примера. Вы должны использовать это:

гггг-мм-дд чч: мм: сс.ффф

3 голосов
/ 02 октября 2011

Вы должны использовать DateTime.ParseExact или .TryParseExact, как это предлагается в комментарии Ханса Пассанта.

DateTime d1;
string[] formats = new [] { "yyyy-MM-dd HH:mm:ss.fff", "yyyy-MM-dd HH:mm:ss,fff" };
DateTime.TryParseExact(s1, formats, CultureInfo.InvariantCulture, 
                    DateTimeStyles.None, out d1);

Также следует указать CultureInfo.InvariantCulture, так как в противном случае метод ParseExact может использовать специфический для культуры разделитель даты (вместо /, например, "." В Германии) или разделитель времени (вместо ":").

...