哇,这个问题特别有趣!我没有找到一些明显的解决方案,所以这里是:
char[] trimmer = DateTimeFormatInfo.CurrentInfo.DateSeparator.ToCharArray();
string dateStr = date.ToString("d").Replace(date.ToString("yyyy"), string.Empty).Trim(trimmer);
如果你不能使用DateTimeFormatInfo
,那么下面的代码应该可以解决问题:
string tmp = date.ToString("d").Replace(date.ToString("yyyy"), string.Empty);
char last = tmp[tmp.Length - 1];
char[] trimmer = char.IsDigit(last) ? new char[] { tmp[0] } : new char[] { last };
string dateStr = tmp.Trim(trimmer);
正如@ken2k正确提到的,这个解决方案也有缺陷(而且比我实际预期的要多得多)。这是完整的测试套件(编译为控制台应用程序):
using System;
using System.Diagnostics;
using System.Globalization;
class Program
{
static void Main(string[] args)
{
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
DateTime date = DateTime.Now;
foreach (CultureInfo culture in cultures)
{
string tmp = date.ToString("d", culture).Replace(date.ToString("yyyy", culture), string.Empty);
char last = tmp[tmp.Length - 1];
char[] trimmer = char.IsDigit(last) ? new char[] { tmp[0] } : new char[] { last };
string dateStr = tmp.Trim(trimmer);
Console.WriteLine(string.Format("{0,12}, {1,15} => {2,10}", culture.IetfLanguageTag, date.ToString("d", culture), dateStr));
}
if (Debugger.IsAttached)
{
Console.WriteLine();
Console.WriteLine("Press any key to exit..");
Console.ReadKey();
}
}
}
进一步的优化是可能的(至少在完整的框架中),但是它变得相当复杂(Windows Phone 的有限框架也增加了复杂性)并且不清楚这种日期表示在某些文化中是否有意义。例如,在某些文化中,日期部分分隔符是两个字符序列:
胡胡, 2012. 08. 14. => 08. 14
实际上08. 14
看起来不错吗?或者应该是08. 14.
?我不知道。如果我是你,并且我真的想处理最大数量的文化,我会坚持使用标准的“d”格式说明符。