Вы зациклены на полуночи, но aDate
не относится к моменту времени, который является полуночным UTC. Ваши человеческие глаза читают первую часть строки и видят «1944-12-12», которая является только частью строки. Это заставляет вас ошибочно думать, что рассматриваемый день - 12 декабря 1944 года по Гринвичу. Но фактический момент времени , на который ссылаются , составляет 13:00 11 декабря 1944 года в 13:00. Здесь нужно кое-что дать: либо вы принимаете, что синтаксический анализ выполнен правильно, а правильный день - 11 декабря, либо вы преобразовываете входную строку, чтобы ссылаться на другой момент времени.
Поскольку все устройства отправляют строку в формате туда и обратно (см. ISO 8601 ), вы можете ослабить строгость формата ввода и использовать TryParse
. Это позволило бы строки, такие как:
- 1944-12-12T00: 00: 00,000 + 11: 00
- 1944-12-11T13: 00: 00.000Z
- 1944-12-11T00: 00: 00Z
- 1944-12-11Z
Кстати, первые 2 строки:
- 1944-12- 12 T00: 00: 00,000 + 11: 00
- 1944-12- 11 T13: 00: 00.000Z
Обратитесь к тому же моменту времени . Когда строка написана с Z, вы ясно видите, что рассматриваемый день - 11 декабря. Разница между двумя при разборе состоит в том, что первая строка анализирует с DateTimeKind of Local, а вторая строка с Kind of Utc.
Как вы возвращаете DateTime, немного неловко. Было бы проще просто вернуть parsedDate.ToUniversalTime()
. Это позволяет избежать любых локальных проблем людей, выполняющих код в разных часовых поясах и видящих разное время, потому что они смотрят на местное время вместо Utc.
Если у вас есть объект DateTime и вы хотите видеть только соответствующий день, т. Е. Сфокусироваться на полуночи этого дня, вы должны использовать свойство DateTime.Date
.
Если вы абсолютно настаиваете на преобразовании входной строки времени в неправильную полночь, вы можете использовать простой метод, такой как:
private static string MutateToMidnight(string source)
{
var pieces = source.Split(new char[] { 'T' });
if (pieces.Length == 0 && pieces[0].EndsWith("Z", StringComparison.InvariantCultureIgnoreCase))
{
return pieces[0];
}
return pieces[0] + "Z";
}
Как упоминалось ранее, вы можете использовать TryParse, чтобы приспособить вариации к формату туда и обратно. Вот одна имплементация:
public static DateTime? TryParseDateTime(string source)
{
if (DateTime.TryParse(source, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var parsedDate))
{
return parsedDate.ToUniversalTime(); // .Date;
}
return null;
}
Тем не менее, я думаю, что изменять исходную строку времени неправильно. Вы бы имели в виду момент времени, который отличается от того, что было отправлено.