Ответ 1
Как указано в документации, одна из отличий между спецификаторами формата DateTime.ToString
и TimeSpan.ToString
заключается в следующем: пользовательские спецификации формата TimeSpan не включают разделитель разделителей символы, такие как символы, которые отделяют дни от часов, часов от минут или секунд от дробных секунд. Вместо этого эти символы должны быть включены в строку пользовательского формата в виде строковых литералов.
В контраст с TimeSpan
(см. таблицу спецификаторов формата в документах), спецификаторы формата DateTime
включают в себя предопределенные символы для разделителя даты /
и для Сепаратор времени :
. Это означает, что, например, для итальянской культуры точка с запятой будет распознана как разделитель времени (а не буквальная) и будет заменена символом .
:
// outputs 09.57.18 instead of 09:57:18 because of Italian culture.
Console.WriteLine(DateTime.Now.ToString("hh:mm:ss", CultureInfo.GetCultureInfo("it-IT")));
Я думаю, что разработчики .NET сделали такую разницу между DateTime
и TimeSpan
строковыми формами намеренно, и это разумно. Это потому, что исторически дата/время были отформатированы по-разному для разных культур. И .NET попытался предоставить средства глобализации в этом отношении вместе с типом DateTime
. Но TimeSpan
не получал таких "глобализационных" обязанностей, это всего лишь тип, представляющий период времени, и его форматирование не привязано к какой-либо специфике культуры (если они когда-либо существовали), но вместо этого форматирование ее постоянно различные настройки культуры.