我需要在Windows手机上显示一些日期和月份的日期。
例如,1月1日,对于美国用户,我希望文本为“1/31”,对于英国用户,我希望它为“31/1”。
实现这样的最简单方法是什么?
更新 我的应用程序将在很多国家/地区推出。我是否必须指定每种文化才能得到我想要的东西?
例如,
de-DE Culture 01.10
en-US Culture 10/1
es-ES Culture 01/10
fr-FR Culture 01/10
左栏包含我的应用支持的一些国家/地区,右栏是我希望日期文字的方式。
有没有通用的方法可以实现这个目标?
答案 0 :(得分:5)
// 13 August
string americanDate = theDate.ToString("m", new CultureInfo("en-us"));
// August 13
string ukDate = theDate.ToString("m", new CultureInfo("en-gb"));
有关可用格式的完整列表,请参阅MSDN。
编辑:
在您的应用中,不要手动指定CultureInfo
实例:使用DateTime.ToString
的默认文化,这是执行线程的文化。
所以你的代码变成了:
string cultureSpecificDate = theDate.ToString("m");
其中"m"
是您在可用格式列表中选择的日期格式。您想要的那个似乎不是DateTimeFormatInfo
类提供的标准。你不能在下面的列表中选择支持的模式吗?
/*
This code produces the following output.
FORMAT en-US EXAMPLE
CHAR VALUE OF ASSOCIATED PROPERTY, IF ANY
d 1/3/2002
M/d/yyyy (ShortDatePattern)
D Thursday, January 03, 2002
dddd, MMMM dd, yyyy (LongDatePattern)
f Thursday, January 03, 2002 12:00 AM
F Thursday, January 03, 2002 12:00:00 AM
dddd, MMMM dd, yyyy h:mm:ss tt (FullDateTimePattern)
g 1/3/2002 12:00 AM
G 1/3/2002 12:00:00 AM
m January 03
MMMM dd (MonthDayPattern)
M January 03
MMMM dd (MonthDayPattern)
o 2002-01-03T00:00:00.0000000
r Thu, 03 Jan 2002 00:00:00 GMT
ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern)
R Thu, 03 Jan 2002 00:00:00 GMT
ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern)
s 2002-01-03T00:00:00
yyyy'-'MM'-'dd'T'HH':'mm':'ss (SortableDateTimePattern)
t 12:00 AM
h:mm tt (ShortTimePattern)
T 12:00:00 AM
h:mm:ss tt (LongTimePattern)
u 2002-01-03 00:00:00Z
yyyy'-'MM'-'dd HH':'mm':'ss'Z' (UniversalSortableDateTimePattern)
U Thursday, January 03, 2002 8:00:00 AM
y January, 2002
MMMM, yyyy (YearMonthPattern)
Y January, 2002
MMMM, yyyy (YearMonthPattern)
*/
答案 1 :(得分:3)
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正确提到的那样,这个解决方案也存在缺陷(并且比实际预期的要多得多)。这是完整测试套件(compile as console application):
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的有限框架也增加了复杂性)并且不清楚这种日期表示在某些文化中是否有意义。例如,在某些文化中,日期部分分隔符是两个字符序列:
hu-HU,2012。08. 14. => 08. 14
08. 14
实际上看起来不错吗?或者它应该是08. 14.
?我不确定。如果我是你,我真的想要处理最大量的文化,我会坚持使用标准的“d”格式说明符。