String.Format (формат, дата) игнорирует формат - PullRequest
16 голосов
/ 25 ноября 2008

Не уверен, что здесь происходит.

У меня есть объект DateTime, и когда я пытаюсь:

String.Format( "{0:dd/MM/yyyy}", _date)

Возвращаемое значение:

"24-05-1967"

То, что я хочу, это

"24/05/1967"

Может кто-нибудь объяснить, почему моя строка формата игнорируется?

Немного больше предыстории: Это веб-приложение, которое начало свою жизнь как .net 1.1, и я нахожусь в процессе его перехода на 2.0 / 3.5.

Обновление:

Если я изменяю формат на {0: dd: MM: гггг}, он возвращает 24: 05: 1967 - только / в строке формата изменяется на - char.


Разрешение:

При обновлении приложения до версии 2.0, настройки глобализации asp.net были испорчены.

Из свойств веб-сайта, вкладки ASP.NET, Редактировать конфигурацию, Вкладка приложения - культура и культура интерфейса пользователя были установлены в качестве первого элемента в списке (af-ZA) по какой-то странной причине.

Ответы [ 8 ]

24 голосов
/ 25 ноября 2008

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

System.Threading.Thread.CurrentThread.CurrentCulture

Если вы попробуете это:

String.Format(new CultureInfo("en-US"), "{0:dd/MM/yyyy}", DateTime.Now);

Вы получите дату в формате /, поскольку это правильный разделитель для en-US. Что вы, вероятно, должны сделать, это использовать строку формата короткой даты и убедиться, что с потоком связана соответствующая культура, тогда это даст вам то, что вы хотите, и это также будет работать в глобализированном приложении:

DateTime.Now.ToString("d", Thread.CurrentThread.CurrentCulture);

Надеюсь, это поможет!

9 голосов
/ 25 ноября 2008

Возможно, вы захотите использовать метод ToString () вашего объекта DateTime, чтобы получить строковое представление, которое вам нужно. Строка формата "dd '/' MM '/' yyyy" даст вам формат, который вы описали. Обратите внимание, что вам нужно экранировать буквенные символы в строке формата, используя одинарные кавычки.

Пример: DateTime.Now.ToString("dd'/'MM'/'yyyy");

1 голос
/ 25 ноября 2008

Символ "/" является нейтральным для культуры местозаполнителем для символа разделителя даты и времени, который определен в региональных настройках. Так же и символ ":" для времени.

Чтобы встраивать символ "/" буквально, а не в качестве заполнителя, необходимо заключить его в одинарные кавычки '/' в строке формата.

1 голос
/ 25 ноября 2008

Если вы не укажете IFormatProvider (обычно это объект CultureInfo), он по умолчанию будет использовать форматирование даты / времени Thread.CurrentThread.CurrentCulture, которое даст вам изменяющиеся результаты.

И да, это изменится / но не:.

Решением в этом случае является указание поставщика формата, например так:

String.Format(CultureInfo.InvariantCulture, "{0:dd/MM/yyyy}", _date)
0 голосов
/ 31 января 2012

Интересная тема!

У меня есть приложение, которое читает файл Excel и позволяет пользователю экспортировать данные в файл .csv в определяемом пользователем формате .

Я специально хотел предоставить пользователям возможность экспортировать даты в (точно) формат, например, гггг / мм / дд, независимо от информации о культуре их ноутбука.

Я попробовал некоторые из этих предложений, но единственное, что сработало, было предложение Поп-Каталина обернуть любые символы в апострофы:

outputFormat = outputFormat.Replace("/", "'/'");
valueToExport = ImportedDate.ToString(outputFormat);

Похоже, что это единственный способ заставить ToString () использовать точную строку формата, не пытаясь что-либо сделать для конкретной культуры.

Обновление

Я всегда нахожу забавным, когда отвечаю на вопрос StackOverflow, а затем сталкиваюсь с той же ошибкой несколько лет спустя и натыкаюсь на свой собственный ответ!

Как упоминалось во многих из этих ответов, решение заключается в переносе символов косой черты в апострофах, чтобы заставить ToString() игнорировать настройки культуры.

Итак, если в ваших настройках Культуры в качестве символа разделителя даты используется символ полной остановки (например, "20.07.2015"), то вот что вы увидите при попытке правильно отформатировать дату Рождества и как Вы можете легко заставить его всегда использовать косую черту:

DateTime dtChristmas = new DateTime(2015, 12, 31);

//  This might return "31/12/2015", "31.12.2015", etc, depending on Culture settings
string str1 = dtChristmas.ToString("dd/MM/yyyy");

//  ...but these two statements will both *always* return "31/12/2015"
string str2 = dtChristmas.ToString("dd'/'MM'/'yyyy");
string str3 = dtChristmas.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
0 голосов
/ 20 ноября 2009

Это даст вам необходимый вывод

String.Format( "{0:dd/MM/yyyy}", Convert.ToDateTime(_date));
0 голосов
/ 25 ноября 2008

В региональных настройках (на веб-сервере?) Разделители даты установлены на '-'. В моей локали (EE) вывод будет "24.05.1967":)

0 голосов
/ 25 ноября 2008

Странно. Это форматирование работает правильно для меня. Возможно, вы захотите попробовать _date.ToString ("dd / MM / yyyy") вместо этого (хотя это всего лишь выстрел в темноте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...