C # DateTime.Parse эффективно время с часами / мин / сек / милис / микро / нано секунд - PullRequest
0 голосов
/ 13 ноября 2018

От третьей стороны я получаю эту строку, которую хочу преобразовать в DateTime: "13 Ноября 2018 16: 08: 52: 000: 000: 000" Я пробовал эти варианты, но FormatException брошено:

System.DateTime.ParseExact("12 NOV 2018 16:08:52:000:000:000", 
                           "dd MMM yyyy HH:mm:ss:fff:ffffff:fffffffff", 
                                             CultureInfo.InvariantCulture)

И то же исключение, когда я использовал это:

System.DateTime.ParseExact("12 NOV 2018 16:08:52:000:000:000",
                            "dd MMM yyyy HH:mm:ss:fff", CultureInfo.InvariantCulture)

Есть ли чистый способ разобрать его как есть или мне нужно использовать грязный способ, например string.Split(new []{':'})?

Примечание:

  • Для нужд моего бизнеса мне не нужна доля микро / нано секунд.
  • , поскольку эта операция синтаксического анализа происходит много раз в секунду, эффективность является ключевым фактором.

Обновление

Я выбрал предложение @Tim для работы со строками:

string date = "12 NOV 2018 16:08:52:000:000:000";
date = date.Remove(date.Remove(date.LastIndexOf(':')).LastIndexOf(':'));
DateTime result = System.DateTime.ParseExact(date, "dd MMM yyyy HH:mm:ss:fff", System.Globalization.CultureInfo.InvariantCulture);

Причины:

  • Я не могу обещать структуру строки date, так как она поступает от третьей стороны. Поэтому будет очень опасно использовать шаблон формата dd MMM yyyy HH:mm:ss:fff:fff:fff
  • Как писал @Jeroen Mostert, использование разделения строк не является ключевым фактором при использовании DateTime.ParseExact()

Кроме того, если вы действительно думаете, что эффективность так важна, не думайте, что какой-либо один вызов DateTime.ParseExact будет «быстрым», или что любое разбиение строки будет узким местом.

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Я думаю, что одним и тем же форматом для: fff является ключевой фактор

System.DateTime.ParseExact("12 NOV 2018 16:08:52:000:000:000","dd MMM yyyy H:mm:ss:fff:fff:fff", CultureInfo.InvariantCulture) кажется, работает

https://dotnetfiddle.net/ZAtchu пример кода

0 голосов
/ 13 ноября 2018

Не точный ответ

System.DateTime.ParseExact("25 NOV 2018 16:08:52:000:000:000",
                            "dd MMM yyyy HH:mm:ss:fff:fff:fff", CultureInfo.InvariantCulture);

Учтите: количество входной строки (000) должно совпадать с форматом (fff),

000 = fff good

00 = fff не хорошо

000 = ff не хорошо

Возможно, вам придется манипулировать строкой ввода перед попыткой анализа.

См. Это для получения дополнительной информации об использованииспецификатор формата (fff)

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings

.NET Fiddle:

https://dotnetfiddle.net/5UxCkd

0 голосов
/ 13 ноября 2018

Ну, не правда ли это просто?

System.DateTime.ParseExact("12 NOV 2018 16:08:52:000:000:000", 
                           "dd MMM yyyy HH:mm:ss:fff:fff:fff", 
                           System.Globalization.CultureInfo.InvariantCulture)

Это работает, если все группы f имеют одинаковые значения, например, все 0 или 123.

Tbh, я не понимаю, почему вы думаете, что fff:ffffff:fffffffff соответствует 000:000:000

Для нужд моего бизнеса мне не нужна часть микро / нано секунд.

Вы можете заставить свой второй формат работать, обрезав микро / нано часть:

string date = "12 NOV 2018 16:08:52:000:000:000";
date = date.Remove(date.Remove(date.LastIndexOf(':')).LastIndexOf(':'));
DateTime result = System.DateTime.ParseExact(date, "dd MMM yyyy HH:mm:ss:fff", System.Globalization.CultureInfo.InvariantCulture);

Конечно, это предполагает, что всегда есть как минимум два двоеточия.Очевидно, что вам нужно try-catch для регистрации недопустимых значений и перехода к следующему.

...