2010-05-07 2 views
3

Je voudrais formater un DateTime en une chaîne contenant le nom abrégé du mois et la date à utiliser dans les étiquettes d'axe dans un graphique.Comment mettre en forme une date comme localisée Short MonthDay chaîne

Les chaînes de format DateTime par défaut ne contiennent pas de mois abrégé. Je suppose qu'il n'y a pas de standard mais je pourrais prendre une sous-chaîne des 3 premiers caractères du nom du mois et le remplacer par le format MonthDay. La raison pour laquelle j'utiliserais MonthDay est que l'ordre du mois et de la date dépend des paramètres régionaux.

Quelqu'un a-t-il une meilleure idée?

http://msdn.microsoft.com/en-us/library/az4se3k1.aspx#MonthDay

Répondre

15

Vous pouvez prendre le modèle MonthDay et remplacer « MMMM » par « mmm » - puis appliquer ce modèle:

string pattern = CultureInfo.CurrentCulture.DateTimeFormat.MonthDayPattern; 
pattern = pattern.Replace("MMMM", "MMM"); 
string formatted = dateTime.ToString(pattern); 

Il est un peu brut, mais je crois que cela fonctionnerait.

+0

Cela ne fonctionnera pas, si il y a (ou sera) un pattern "MMMMM" :) Dommage, les substituts n'ont pas de limiteur explicite. –

+0

bonne solution Jon Skeet à propos comment ça arrive avec quelque chose comme 2014-sep-10 (aaaa-MMM-jj) – Gayan

+0

@GayanRanasinghe: Qu'entendez-vous par "comment ça se fait avec"? –

1

Modifié: Utilisez date.ToString("d MMM"). Il montrera 7 sep.

+0

Il veut en fait la version raccourcie, il devrait donc être Date.toString (« d mmm ») –

2

Vous pouvez utiliser les formatteurs de chaîne personnalisée pour ce faire:

DateTime now = DateTime.Now; 
Console.WriteLine("{0}", now.ToString("ddd MMMM dd")); 

Voir la section « Format Standard Strings travail » sur la page vous avez accédé à pour plus d'informations.

+1

@Matt: Cela ne donnera pas un ordre dépendant des paramètres régionaux: "La raison pour laquelle j'utiliserais MonthDay est que l'ordre du mois et de la date dépend des paramètres régionaux." –

+0

@Jon ouais bon point, j'ai raté ce peu. –

0

Voici la solution que je suis venu avec la même situation de vouloir une version localisée de 01/29:

Regex.Replace(c.DateTimeFormat.ShortDatePattern, @"(yy(yy)?[/\.\- ]|[/\.\- ]yy(yy)?)", "") 

Voici la sortie de format pour toutes les cultures, de sorte que vous pouvez voir si cela fonctionnera pour vous :

CultureInfo.GetCultures(CultureTypes.AllCultures) 
    .Select(c => new { 
     c.Name, 
     c.DateTimeFormat.MonthDayPattern, 
     c.DateTimeFormat.ShortDatePattern, 
     DayMonth1 = Regex.Replace(c.DateTimeFormat.ShortDatePattern, @"[/\.\- ]?yy[/\.\- ]?", ""), 
     DayMonth2 = Regex.Replace(c.DateTimeFormat.ShortDatePattern, @"(yyyy[/\.\- ]|[/\.\- ]yyyy|yy[/\.\- ]|[/\.\- ]yy)", ""), 
     DayMonth3 = Regex.Replace(c.DateTimeFormat.ShortDatePattern, @"(yy(yy)?[/\.\- ]|[/\.\- ]yy(yy)?)", "") 
    }) 
    .OrderBy(x => x.Name) 
    .Dump(); 

Le DateMonth1 rEMPLACER supprimer un caractère de remplissage supplémentaire pour une culture couple (en particulier 'bg').

0

Rapide, facile et fait le travail.

CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(Month).Substring(0,3); 
+0

La sortie devrait inclure également l'année et la date et l'ordre de ces éléments devrait être déterminée par la culture actuelle. – Wouter

1

Vous pouvez transmettre un objet CultureInfo dans la méthode Date.ToString(). Soit vous avez une info culture spécifique ou vous pouvez utiliser le CultureInfo.CurrentCulture:

var date = DateTime.Now; 
var ci = new CultureInfo("de-CH"); 
var output = date.ToString("d MMM", ci); 
Questions connexes