2013-08-06 3 views
4

В моем сценарии я получаю стандартный формат, такой как «D», «f», «R» или другие. Это стандартный формат DateTime, согласно MSDN.Получить пользовательский формат даты и времени из стандартного формата

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

Пример, скажем мой пользователь из Франции (FR-FR):

"d" = "дд/мм/гггг"

"D" = "дддд д MMMM гггг"

"F" = "дддд d MMMM гггг чч: мм: сс"

ответ

7

Вам нужна версия этого формата char, но тогда вы могли бы сделать это так :

CultureInfo culture = //get your culture 
var patterns = culture.DateTimeFormat.GetAllDateTimePatterns(yourFormatChar); 
+0

Простой и чистый! Отлично работает!И я предполагаю, что я всегда беру первый элемент, поскольку GetAllDateTimePatterns() возвращает строку [] ?. – NLemay

+2

@NLemay Это зависит, если вы хотите других, я думаю, что некоторые строки формата возвращают более одного. Однако я предполагаю, что первый элемент безопасен. –

+0

Хорошо! Не уверен, чтобы понять, в каком случае я могу получить более одного настраиваемого формата для уникального стандартного формата. Как C# справится с этим при использовании DateTime.toString()? Но, во всяком случае, первый, вероятно, хороший! – NLemay

2

Вот код, действительно получают шаблоны:

var c = new CultureInfo("fr-FR"); 
Console.WriteLine(c.DateTimeFormat.LongDatePattern); 
Console.WriteLine(c.DateTimeFormat.ShortDatePattern); 
Console.WriteLine(c.DateTimeFormat.FullDateTimePattern); 

Результат из консольного приложения является следующая

dddd d MMMM yyyy 
dd/MM/yyyy 
dddd d MMMM yyyy HH:mm:ss 
+0

Это не дает ответа на вопрос: ему нужно для строк формата. –

+1

Этот пример позволяет ему получить формат, ему просто нужно адаптировать код для его использования. – Fabio

+0

Чем ты для своего времени. Но, как я уже сказал, Тим С. и Д. Стэнли, я искал более простое решение (с меньшим количеством кода). Извините, мой вопрос мог быть более ясным. – NLemay

2
DateTimeFormatInfo dtf = CultureInfo.CurrentCulture.DateTimeFormat; 
switch (standardFormat) 
{ 
    case "d": 
     return dtf.ShortDatePattern; 
    case "D": 
     return dtf.LongDatePattern; 
    case "F": 
     return dtf.FullDateTimePattern; 
    // add other standard formatters 
    default: 
     throw new ArgumentException("Say what?", "standardFormat"); 
} 

standard formatter documentation говорит, что свойства вам нужно будет искать.

+0

Это работает (улучшение от другого ответа), но было бы болью для написания, отладки и mantain. –

+0

Благодарим вас за ответ. Я думал об этом решении, но я ищу более чистый способ сделать это. Как и It'sNotALie, этот код является болью для поддержания. Извините за то, что я недостаточно ясно в своем вопросе. – NLemay

2

Используйте различные свойства DateTimeFormat текущего потока (или Thread UI, в зависимости от случая):

"d" = Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern 

"D" = Thread.CurrentThread.CurrentCulture.DateTimeFormat.LongDatePattern 

"F" = Thread.CurrentThread.CurrentCulture.DateTimeFormat.FullDateTimePattern 
+0

Это работает, но было бы больно писать, отлаживать и mantain. –

+0

@ Это NotALie. В каком смысле? Эти три свойства представляют собой стандартные строки формата для «d», «D» и «F» соответственно - он даже говорит об этом в [документации] (http://msdn.microsoft.com/en-us/library/system .globalization.datetimeformatinfo.shortdatepattern.aspx). –

+0

Да, но для строк дополнительного формата это было бы болью. И если вы опечатали его, вам нужно открыть интернет, пойти в документы, охотиться за правильным, исправить свой код. И затем сделайте это снова для других. –

1

Некоторые отражения может гарантировать, что вы получите те же самые расширенные форматные строки, которые используются внутри:

string GetRealFormat(string format, DateTimeFormatInfo dtfi) 
{ 
    MethodInfo method = Type.GetType("System.DateTimeFormat") 
     .GetMethod("GetRealFormat", 
        BindingFlags.Static | BindingFlags.NonPublic); 

    return method.Invoke(null, new object[] { format, dtfi }) as string; 
} 
string format = GetRealFormat("d", DateTimeFormatInfo.CurrentInfo) // dd.MM.yyyy 
+0

Если я хорошо понимаю, с этим решением, я уверен, чтобы получить наилучшее соответствие вместо строки []? Это не самый простой, но, безусловно, аккуратный и приятный ответ! Спасибо! – NLemay