Дата-время.TryParseExact игнорирует стили времени.NoCurrentDateDefault

#c# #datetime

Вопрос:

Я пытаюсь проанализировать дату и время, когда в строке формата указаны не месяц и год, а только время и день. Поэтому я предполагаю, что после приведенного ниже вызова месяц и год будут установлены на 01 и 0001. Однако результат показывает, что месяц установлен на 01, а год установлен на текущий 2021 год.

DateTime.TryParseExact("5 11:20", "d HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out dateTime);

Это возвращает: 01/05/2021 11:20:00

Кажется, это работает, когда я удаляю формат дня:

DateTime.TryParseExact("11:20", "HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out dateTime);

Код можно запустить здесь: https://dotnetfiddle.net/YADrwn

Есть идеи, почему это происходит?

Комментарии:

1. Похоже, именно так, как и ожидалось — из документов — «Если анализируемая строка содержит только время, а не дату…», но ваша анализируемая строка содержит не только время.

Ответ №1:

В справочном источнике мы видим, что существует вычисляемый флаг bTimeOnly , который является ложным, если у вас есть дни, месяцы или годы.

Вызов частной функции с помощью TryParseExact : https://referencesource.microsoft.com/#mscorlib/system/globalization/datetimeparse.cs,2558c4cbd566081b

Момент, когда проверяется, является ли это просто временем или датой тоже: https://referencesource.microsoft.com/#mscorlib/system/globalization/datetimeparse.cs,4134

Момент, когда предполагается, что только день = текущий год, первый месяц и день чтения : https://referencesource.microsoft.com/#mscorlib/system/globalization/datetimeparse.cs,ed47be441811082c

Итак, это именно то поведение, которое у вас есть. Похоже, так и было задумано.

В любом случае, вы можете получить часть времени с помощью dateTime.TimeOfDay .