是否有一种文化安全的方法来获取带有前导零的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
ShortDatePattern
和ShortTimePattern
进行转换:
// 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");
希望它可以帮助你