2008-11-25 4 views
16

Не уверен, что здесь происходит.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: дд: ММ: ГГГГ}, она возвращает 24: 05: 1967 - это только/в строке формата, который получает изменен на - полукокса.


Разрешение:

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

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

ответ

24

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

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

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

+0

Спасибо, что работает - я не думаю, что вы знаете, когда это изменилось (между 1.1 и 3.5) и где это документально? – chris 2008-11-25 17:10:01

+0

См. .NET Framework 3.5: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx (.NET 3.5) и .NET Framework 1.1: http://msdn.microsoft.com/en-us /library/8kb3ddd4(VS.71).aspx (.NET 1.1). API не изменился для пользовательских строк формата DateTime. – Oppositional 2008-11-25 20:46:45

0

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

0

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

1

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

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

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

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

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

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

0

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

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

Интересная нить!

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

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

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

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

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

Update

Я всегда нахожу это забавным, когда я отвечаю на вопрос 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);