Пользовательский формат DateTime отличается от ожидаемого - PullRequest
2 голосов
/ 05 октября 2011

Я использовал пользовательские форматы для отображения даты и времени, как показано здесь: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

, например

new DateTime(2011,10,5).ToString("dd");

Возвращает: "05"

и

new DateTime(2011,10,5).ToString("d MM");

Возвращает "5 10"

И то, и другое, как я и ожидал, но:

new DateTime(2011,10,5).ToString("d");

Возвращает: "05/10/2011"

Когда я ожидал, что он вернется: "5"

На практике это не имеет значения, поскольку вы используете: new DateTime(2011,10,5).Day, чтобы получить день, но меня интересует, почему пользовательский формат не работает так, как я ожидал.

Ответы [ 2 ]

5 голосов
/ 05 октября 2011

Попробуйте прочитать здесь Стандартные строки формата даты и времени "d" Short date pattern..Да, возможно, было немного глупо повторно использовать d :-), к счастью, это угловой случай.

В общем, вы всегда должны использовать CultureInfo.InvariantCulture для вещей, которые не являются вводом / выводомпользователю, если вы точно не знаете, что делаете, и знаете, что ваша программа не будет продана за границу.Поэтому, если вы показываете дату пользователю, используйте его культуру / местную культуру.Если вы запрашиваете дату для пользователя то же самое.Но если вы используете дату для присвоения имени файлу или выполнения каких-либо внутренних операций, обычно лучше использовать CultureInfo.InvariantCulture.

Попробуйте:

Console.WriteLine(DateTime.Now.ToString("MM", new System.Globalization.CultureInfo("ar-SA")));
Console.WriteLine(DateTime.Now.ToString("yyyy", new System.Globalization.CultureInfo("ar-SA")));

Console.WriteLine(DateTime.Now.ToString("MM", System.Globalization.CultureInfo.InvariantCulture));
Console.WriteLine(DateTime.Now.ToString("yyyy", System.Globalization.CultureInfo.InvariantCulture));

и скажите, что высм: -)

4 голосов
/ 05 октября 2011

Как сказал xanatos, он рассматривает "d" как стандартную строку формата даты и времени.

Если вы хотите, чтобы пользовательская строка формата даты и времени, состоящая из «d», вам нужно эффективно экранировать ее, чтобы сказать «не рассматривайте это как стандартный шаблон!»

new DateTime(2011, 10, 5).ToString("%d");

Здесь % - это «переход от стандартной к пользовательской».

Из документации Пользовательские строки формата даты и времени , раздел "Использование отдельных спецификаторов формата":

Пользовательская строка формата даты и времени состоит из двух или более символов. Методы форматирования даты и времени интерпретируют любую односимвольную строку как стандартную строку формата даты и времени. Если они не распознают символ как допустимый спецификатор формата, они генерируют исключение FormatException. Например, строка формата, которая состоит только из спецификатора "h", интерпретируется как стандартная строка формата даты и времени. Однако в данном конкретном случае выдается исключение, поскольку отсутствует стандартный спецификатор формата даты и времени «h».

Чтобы использовать любой из пользовательских спецификаторов формата даты и времени в качестве единственного спецификатора в строке формата (то есть использовать "d", "f", "F", "g", "h", " H "," K "," m "," M "," s "," t "," y "," z ",": "или" / "спецификатор пользовательского формата сам по себе), включают пробел перед или после спецификатора, или включать спецификатор формата в процентах ("%") перед единым пользовательским спецификатором даты и времени.

Например, «% h» интерпретируется как строка пользовательского формата даты и времени, которая отображает часы, представленные текущими значениями даты и времени. Вы также можете использовать строку формата «h» или «h», хотя это включает пробел в строке результата вместе с часом.

...