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) по какой-то причудливой причине.
Ответы
Ответ 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);