Подтвердить что ты не робот

String.Format(формат, дата) игнорирует формат

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

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

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

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

"24-05-1967"

Я хочу

"24/05/1967"

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

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

Update:

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


Разрешение:

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

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

4b9b3361

Ответ 1

Фактически/является разделителем дат для вашей конкретной культуры, который может быть, другими словами, строка формата не игнорируется, а фактически используется правильно. Посмотрите, что 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);

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

Это даст вам требуемый вывод

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

Ответ 8

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

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

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

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

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);