2013-08-06 3 views
4

Dans mon script, je reçois un format standard comme "D", "f", "R" ou autres. Ceci est un format DateTime standard, selon MSDN.Obtenir un format datetime personnalisé à partir du format standard

En tenant compte de la culture actuelle de l'utilisateur, j'aimerais obtenir le format personnalisé de ce format standard.

exemple, disons que mon utilisateur est de la France (fr-FR):

"d" = "jj/mm/aaaa"

"D" = "dddd d MMMM yyyy"

"F" = "dddd d MMMM yyyy HH: mm: ss"

Répondre

7

Vous avez besoin d'une version char de ce format, mais vous pourriez le faire comme ça :

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

Simple et propre! Il fonctionne comme un charme!Et je suppose que je prends toujours le premier élément puisque GetAllDateTimePatterns() retourne une chaîne [] ?. – NLemay

+2

@NLemay Cela dépend si vous voulez les autres, je pense que certaines chaînes de format renvoient plus d'un. Cependant, je suppose que prendre le premier élément est sûr. –

+0

Ok! Pas sûr de comprendre dans quel genre de cas je peux obtenir plus d'un format personnalisé pour un format standard unique. Comment C# traiterait-il cela en utilisant DateTime.toString()? Mais de toute façon, le premier est probablement le bon! – NLemay

2

Voici un code ne se les modèles:

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

Le résultat à partir d'une application de la console est la suivante

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

Cela ne répond pas à la question: il en a besoin pour les chaînes de format. –

+1

Cet exemple lui permet d'obtenir le format, il lui suffit d'adapter le code pour son utilisation. – Fabio

+0

Que vous pour votre temps. Mais comme je l'ai dit, Tim S. et D Stanley, je cherchais une solution plus simple (avec moins de code possible). Désolé, ma question aurait pu être plus claire. – 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"); 
} 

Le standard formatter documentation dit que les propriétés que vous aurez besoin de chercher.

+0

Cela fonctionne (amélioration de l'autre réponse) mais serait une douleur à écrire, déboguer et maintenir. –

+0

Merci pour votre réponse. J'ai pensé à cette solution, mais je cherche une façon plus propre de le faire. Comme It'sNotALie dit, ce code est une douleur à maintenir. Désolé de ne pas être assez clair dans ma question. – NLemay

2

Utilisez les différentes propriétés du DateTimeFormat du thread courant (ou l'interface utilisateur fil, selon le cas):

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

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

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

Cela fonctionne mais serait une douleur à écrire, déboguer et maintenir. –

+0

@ It'sNotALie. De quelle façon? Ces trois propriétés représentent les chaînes de format standard pour "d", "D" et "F" respectivement - il le dit même dans [la documentation] (http://msdn.microsoft.com/fr-fr/library/system .globalization.datetimeformatinfo.shortdatepattern.aspx). –

+0

Oui, mais pour les chaînes de format supplémentaires ce serait une douleur. Et si vous l'avez tapé, vous devez ouvrir Internet, aller aux docs, chercher le bon, corriger votre code. Et puis recommencez pour tous les autres. –

1

Une réflexion pourrait assurer, que vous obtiendrez les mêmes chaînes de format élargi qui sont utilisés en interne:

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

Si je comprends bien, avec cette solution, je suis sûr d'obtenir la meilleure correspondance au lieu d'une chaîne []? Ce n'est pas le plus simple, mais sûrement une bonne réponse! Je vous remercie! – NLemay