#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
.