仅使用date时间格式以小写forms获取AM / PMdate时间

我要获得一个自定义的date时间格式,包括AM / PM指示符,但是我希望“AM”或“PM”是小写的, 而不使其余的字符小写。

这可能使用单一的格式,而不使用正则expression式?

这是我现在所拥有的:

item.PostedOn.ToString("dddd, MMMM d, yyyy a\\th:mmtt") 

现在输出的例子是2009年1月31日星期六下午1:34

我将亲自将其格式化为两部分:非am / pm部分,以及toLower的am / pm部分:

 string formatted = item.PostedOn.ToString("dddd, MMMM d, yyyy a\\th:mm") + item.PostedOn.ToString("tt").ToLower(); 

另一个选项(我将在一秒内调查)是获取当前的DateTimeFormatInfo,创build一个副本,并将am / pm指示符设置为小写版本。 然后使用该格式信息进行正常格式化。 你想cachingDateTimeFormatInfo,显然…

编辑:尽pipe我的评论,我已经写了caching位。 它可能不会比上面的代码更快 (因为它涉及锁和字典查找),但它确实使调用代码更简单:

 string formatted = item.PostedOn.ToString("dddd, MMMM d, yyyy a\\th: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\\th: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; } } } 

您可以将格式string分成两部分,然后小写AM / PM部分,如下所示:

 DateTime now = DateTime.Now; string nowString = now.ToString("dddd, MMMM d, yyyy a\\th:mm"); nowString = nowString + now.ToString("tt").ToLower(); 

不过,我认为更优雅的解决scheme是使用您构build的DateTimeFormatInfo实例 ,并PMDesignator用“am”和“pm”replaceAMDesignatorPMDesignator属性:

 DateTimeFormatInfo fi = new DateTimeFormatInfo(); fi.AMDesignator = "am"; fi.PMDesignator = "pm"; string nowString = now.ToString("dddd, MMMM d, yyyy a\\th:mmtt", fi); 

您可以使用DateTimeFormatInfo实例来自定义将DateTime转换为string许多其他方面。

编辑 :乔恩的例子是好得多,但我认为扩展方法仍然是要走的路,所以你不必到处重复的代码。 我已经删除了replace,并在扩展方法中replace乔恩的第一个例子。 我的应用程序通常是内联网应用程序,我不必担心非美国文化。

添加一个扩展方法为你做这个。

 public static class DateTimeExtensions { public static string MyDateFormat( this DateTime dateTime ) { return dateTime.ToString("dddd, MMMM d, yyyy a\\th:mm") + dateTime.ToString("tt").ToLower(); } } ... item.PostedOn.MyDateFormat(); 

编辑 :如何在C#中如何格式化date时间,如“2008年10月10日上午10时43分CST”的其他想法。

上述方法的问题在于,使用格式string的主要原因是为了实现本地化,到目前为止所给出的方法会打破任何国家或文化,不希望包括最后的上午或下午。 所以我所做的是写出一个扩展方法,它理解一个额外的格式序列“TT”,它表示一个小写的am / pm。 下面的代码是针对我的情况进行debugging的,但可能还不完美:

  /// <summary> /// Converts the value of the current System.DateTime object to its equivalent string representation using the specified format. The format has extensions over C#s ordinary format string /// </summary> /// <param name="dt">this DateTime object</param> /// <param name="formatex">A DateTime format string, with special new abilities, such as TT being a lowercase version of 'tt'</param> /// <returns>A string representation of value of the current System.DateTime object as specified by format.</returns> public static string ToStringEx(this DateTime dt, string formatex) { string ret; if (!String.IsNullOrEmpty(formatex)) { ret = ""; string[] formatParts = formatex.Split(new[] { "TT" }, StringSplitOptions.None); for (int i = 0; i < formatParts.Length; i++) { if (i > 0) { //since 'TT' is being used as the seperator sequence, insert lowercase AM or PM as appropriate ret += dt.ToString("tt").ToLower(); } string formatPart = formatParts[i]; if (!String.IsNullOrEmpty(formatPart)) { ret += dt.ToString(formatPart); } } } else { ret = dt.ToString(formatex); } return ret; } 

这应该是所有这些选项中性能最高的。 但是,太糟糕了,他们不能在小写选项中使用DateTime格式(TT与TT相反)。

  public static string AmPm(this DateTime dt, bool lower = true) { return dt.Hour < 12 ? (lower ? "am" : "AM") : (lower ? "pm" : "PM"); }