Я знаю вопрос.ответ уже получен, но я полагаю, что есть несколько примечаний, если можно:
Проблемы с использованием DateTime
Я бы посоветовал не использовать DateTime в вашем сценарии, как кажетсяскорее всего, вы хотите, чтобы представление было равным при округлении (т. е. при обратном преобразовании в строку представление должно быть равным).Проблема с DateTime заключается в том, что он не хранит точную информацию о часовом поясе.
При предлагаемом решении информация о часовом поясе может измениться.Это зависит от ввода, но при использовании инвариантной культуры вы получите объект DateTime со значением {4-8-2010 11:44:13}
.Я думал, что это можно исправить, используя DateTimeStyles.RoundtripKind
, как в следующем примере, но, учитывая, что в DateTime
нет информации о часовом поясе, это все равно не будет работать:
// DON'T DO THIS, dangerous code ahead:
DateTime time = DateTime.ParseExact(
"20100804T104413+0100",
"yyyyMMdd'T'HHmmssK",
CultureInfo.InvariantCulture,
DateTimeStyles.RoundtripKind);
// loosing data when converting back:
string convertedBack = time.ToString("yyyyMMdd'T'HHmmssK");
// convertedBack now contains "20100804T114413+02:00"
Вместо этого используйте DateTimeOffset
Эта проблема исчезнет, если вы вместо этого будете использовать DateTimeOffset
.Идея осталась прежней, но внезапно все работает:
// DO THIS instead:
DateTimeOffset parsedDate = DateTimeOffset.ParseExact(
"20100804T104413+0100",
"yyyyMMdd'T'HHmmsszzz",
CultureInfo.InvariantCulture,
DateTimeStyles.RoundtripKind);
// converting back is now easy:
convertedBack = parsedDate.ToString("yyyyMMdd'T'HHmmssK");
// convertedBack contains the string "20100804T104413+01:00"
Конечно, от вашей ситуации зависит, важна ли информация о часовом поясе.Но это будет не первый случай, когда 10 часов изменится на 11 часов, и найти ошибку тогда будет сложно.
Работа с двоеточием в часовом поясе
Как ДжонСкит упомянул, что в вашем выводе есть двоеточие ":", которого не было во входных данных.Таким образом, полный обход кажется невозможным.К сожалению, в то время как DateTimeFormatInfo
в любой культуре может быть изменен для изменения практически каждого вида, т. Е. Вы можете установить TimeSeparator
для пустой строки, и двоеточия исчезают в отформатированное время, этот уровень детализации недоступен во смещении часового пояса.Что еще хуже, Reflector показывает, что он намеренно жестко закодирован (у меня когда-то была та же проблема с удалением «+» для положительных смещений):
if (offset >= TimeSpan.Zero)
{
result.Append('+');
}
else
{
result.Append('-');
offset = offset.Negate();
}
result.AppendFormat(CultureInfo.InvariantCulture, "{0:00}:{1:00}", new object[] { offset.Hours, offset.Minutes });
Решение состоит в том, чтобы либо предоставить свой собственный IFormatProvider
или быть прагматичным и просто удалить это двоеточие:
convertedBack = parsedDate.ToString("yyyyMMdd'T'HHmmssK").Replace(":", "");