Как насчет этого решения:
// Get a default DateTimeFormat
var dateTimeFormat = CultureInfo.GetCultureInfo("en-US").DateTimeFormat;
// Clone it to make it writeable
dateTimeFormat = (DateTimeFormatInfo)dateTimeFormat.Clone();
// Change the DateSeparator
dateTimeFormat.DateSeparator = "-";
// Output it as normal
var output = DateTime.Now.ToString("g", dateTimeFormat);
Я думаю, что большинство людей не знают, что вы можете получить доступную для записи версию культуры, создав новый объект, вызвав метод Clone()
.
Обновление
Как сказал Тим, вы также можете назвать это так:
// Get a default DateTimeFormat
var dateTimeFormat = new CultureInfo("en-US").DateTimeFormat;
// Change the DateSeparator
dateTimeFormat.DateSeparator = "-";
// Output it as normal
var output = DateTime.Now.ToString("g", dateTimeFormat);
Это работает, потому что мы создали новый CultureInfo
, полученный из данной культуры. Причина, по которой первый доступен только для чтения, заключается в том, что в первом случае мы получим ссылку на какой-то статически созданный экземпляр где-то в глубине фреймворка и с помощью вызова Clone()
мы создадим новый класс с такими же настройками. Во втором подходе мы создаем непосредственно новый класс, но говорим, что хотели бы получить все настройки из определенной культуры.
Итак, в конце концов, обе версии делают то же самое, что описано другими словами. Если есть разница в производительности между двумя версиями, я не могу сказать, но я думаю, что этим можно пренебречь.
Обновление 2
Прочитав последний комментарий Томса, он пытается что-то вроде этого:
// Get a default DateTimeFormat
var dateTimeFormat = new CultureInfo("en-US").DateTimeFormat;
// Change the DateSeparator
dateTimeFormat.DateSeparator = "-";
// Output it as normal
var output = DateTime.Now.ToString(dateTimeFormat.ShortDatePattern);
Что приводит к неправильному выводу. Это происходит потому, что внутри dateTimeFormat.ShortDatePattern
есть обычная строка, содержащая M/d/yyyy
. То же самое, что звонить DateTime.Now.ToString("M/d/yyyy")
.
В связи с тем, что /
будет заменен DateSeparator, и в настоящее время нет IFormatProvider
, он принимает текущую культуру, которая в вашем случае является немецкой. Поэтому, чтобы решить эту проблему, вы должны попробовать следующий код:
// Get a default DateTimeFormat
var dateTimeFormat = new CultureInfo("en-US").DateTimeFormat;
// Change the DateSeparator
dateTimeFormat.DateSeparator = "-";
// Output it as normal
var output = DateTime.Now.ToString(dateTimeFormat.ShortDatePattern, dateTimeFormat);
И с помощью этой информации вы также сможете сделать некоторые предположения о том, что быстрее:
var output = DateTime.Now.ToString(dateTimeFormat.ShortDatePattern, dateTimeFormat);
var output = DateTime.Now.ToString("M/d/yyyy", dateTimeFormat);
Из-за того, что они точно такие же, не должно быть разницы в производительности