是否有一种文化安全的方法来获取带有前导零的ToShortDateString()和ToShortTimeString()?

我知道我可以使用格式字符串,但我不想丢失日期/时间格式的特定于文化的表示。 例如

5/4/2011 | 2:06 PM | ... 5/4/2011 | 2:06 PM | ...应该是05/04/2011 | 02:06 PM | ... 05/04/2011 | 02:06 PM | ...

但是当我把它改成不同的文化时,我希望它成为现实

04.05.2011 | 14:06 | ...

不改变格式字符串。 那可能吗?

我只看到一个解决方案 – 你应该获得当前的文化显示格式,修补它以满足你的要求,最后使用修补的格式字符串格式化你的DateTime值。 以下是一些示例代码:

 string pattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern; DateTime dt = DateTime.Now; string[] format = pattern.Split(new string[] { CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator }, StringSplitOptions.None); string newPattern = string.Empty; for(int i = 0; i < format.Length; i++) { newPattern = newPattern + format[i]; if(format[i].Length == 1) newPattern += format[i]; if(i != format.Length - 1) newPattern += CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator; } 

正如所承诺的,这是改进版本:

 ///  /// Extensions for the  class. ///  public static class DateTimeExtensions { ///  /// Provides the same functionality as the ToShortDateString() method, but /// with leading zeros. ///  /// ToShortDateString: 5/4/2011 | /// ToShortDateStringZero: 05/04/2011 ///  ///  /// Source date. /// Culture safe short date string with leading zeros. public static string ToShortDateStringZero(this DateTime source) { return ToShortStringZero(source, CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern, CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator); } ///  /// Provides the same functionality as the ToShortTimeString() method, but /// with leading zeros. ///  /// ToShortTimeString: 2:06 PM | /// ToShortTimeStringZero: 02:06 PM ///  ///  /// Source date. /// Culture safe short time string with leading zeros. public static string ToShortTimeStringZero(this DateTime source) { return ToShortStringZero(source, CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern, CultureInfo.CurrentCulture.DateTimeFormat.TimeSeparator); } private static string ToShortStringZero(this DateTime source, string pattern, string seperator) { var format = pattern.Split(new[] {seperator}, StringSplitOptions.None); var newPattern = string.Empty; for (var i = 0; i < format.Length; i++) { newPattern = newPattern + format[i]; if (format[i].Length == 1) newPattern += format[i]; if (i != format.Length - 1) newPattern += seperator; } return source.ToString(newPattern, CultureInfo.InvariantCulture); } } 

您可以使用DateTimeFormatInfo.CurrentInfo ShortDatePatternShortTimePattern进行转换:

 // Change the culture to something different Thread.CurrentThread.CurrentCulture = new CultureInfo("de-AT"); DateTime test_datetime = new DateTime(2008, 10, 2, 3, 22, 12); string s_date = test_datetime.ToString(DateTimeFormatInfo.CurrentInfo); // For specifically the short date and time string s_date1 = test_datetime.ToString(DateTimeFormatInfo.CurrentInfo.ShortDatePattern); string s_time1 = test_datetime.ToString(DateTimeFormatInfo.CurrentInfo.ShortTimePattern); // Results // s_date1 == 02.10.2008 // s_time1 == 03:22 

您还可以覆盖CurrentThread.CurrentCulture类。 在程序开头,您可以调用此方法:

  private void FixCurrentDateFormat() { var cc = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone(); var df = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat; df.FullDateTimePattern = PatchPattern(df.FullDateTimePattern); df.LongDatePattern = PatchPattern(df.LongDatePattern); df.ShortDatePattern = PatchPattern(df.ShortDatePattern); //change any other patterns that you could use //replace the current culture with the patched culture System.Threading.Thread.CurrentThread.CurrentCulture = cc; } private string PatchPattern(string pattern) { //modify the pattern to your liking here //in this example, I'm replacing "d" with "dd" and "M" with "MM" var newPattern = Regex.Replace(pattern, @"\bd\b", "dd"); newPattern = Regex.Replace(newPattern, @"\bM\b", "MM"); return newPattern; } 

这样,无论您在程序中将日期显示为字符串,它都将具有新格式。

我写了一个方法来做这种转换:

 ///  /// Transform DateTime into short specified format ///  /// string : input DateTime ///  /// string - optional : ouput format - default "d" ///  public static string ConvertDateTimeToShortDate(string strDateTime, CultureInfo cultureInfo, string strFormat="d") { var dateTime = DateTime.MinValue; return DateTime.TryParse(strDateTime, out dateTime) ? dateTime.ToString(strFormat, cultureInfo) : strDateTime; } 

要调用它,时间格式:

 DateTimeTools.ConvertDateTimeToShortDate(DateTime.Today.ToString(), CultureInfo.InvariantCulture,"t"); 

希望它可以帮助你