Я бы лично отформатировал его в двух частях: часть не-am / pm и часть am / pm с ToLower:
string formatted = item.PostedOn.ToString("dddd, MMMM d, yyyy a\\t h:mm") +
item.PostedOn.ToString("tt").ToLower();
Другой вариант (который я расскажу через секунду) - захват текущего DateTimeFormatInfo, создание копии и установка указателей am / pm в строчную версию. Затем используйте эту информацию о формате для нормального форматирования. Вы бы хотели кэшировать DateTimeFormatInfo, очевидно ...
РЕДАКТИРОВАТЬ: Несмотря на мой комментарий, я все равно написал бит кэширования. Вероятно, он не будет на быстрее , чем приведенный выше код (так как он включает в себя блокировку и поиск по словарю), но он делает вызывающий код проще:
string formatted = item.PostedOn.ToString("dddd, MMMM d, yyyy a\\t h:mmtt",
GetLowerCaseInfo());
Вот полная программа для демонстрации:
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;
}
}
}