Personnellement, je ne format en deux parties: la non-am/pm, et le am/pm de la partie avec ToLower:
string formatted = item.PostedOn.ToString("dddd, MMMM d, yyyy a\\t h:mm") +
item.PostedOn.ToString("tt").ToLower();
Une autre option (je vais étudier dans une seconde), c'est de prendre le courant DateTimeFormatInfo, créer une copie, et l'ensemble de l'am/pm indicatifs pour le bas du cas de la version. Ensuite utiliser ce format de l'info pour la mise en forme normale. Vous souhaitez mettre en cache les DateTimeFormatInfo, évidemment...
EDIT: en Dépit de mon commentaire, j'ai écrit la mise en cache peu de toute façon. Il ne sera probablement pas plus rapide que le code ci-dessus (car il implique une serrure et d'une recherche dans le dictionnaire), mais elle permet de faire le code appelant de plus simple:
string formatted = item.PostedOn.ToString("dddd, MMMM d, yyyy a\\t h:mmtt",
GetLowerCaseInfo());
Voici un programme complet pour le démontrer:
using System;
using System.Collections.Generic;
using System.Globalization;
public class Test
{
static void Main()
{
Console.WriteLine(DateTime.Now.ToString("dddd, MMMM d, yyyy a\\t h:mmtt",
GetLowerCaseInfo());
}
private static readonly Dictionary<DateTimeFormatInfo,DateTimeFormatInfo> cache =
new Dictionary<DateTimeFormatInfo,DateTimeFormatInfo>();
private static object cacheLock = new object();
public static DateTimeFormatInfo GetLowerCaseInfo()
{
DateTimeFormatInfo current = CultureInfo.CurrentCulture.DateTimeFormat;
lock (cacheLock)
{
DateTimeFormatInfo ret;
if (!cache.TryGetValue(current, out ret))
{
ret = (DateTimeFormatInfo) current.Clone();
ret.AMDesignator = ret.AMDesignator.ToLower();
ret.PMDesignator = ret.PMDesignator.ToLower();
cache[current] = ret;
}
return ret;
}
}
}