我需要将日期显示在M / dd或dd / M中,具体取决于当前设置的文化。在我们的应用程序中,我们基于配置明确设置文化。我们目前使用以下方法格式化日期:
string dateStringFormat =Thread.CurrentThread.CurrentUICulture.DateTimeFormat.ShortDatePattern;
someDate.ToString(dateStringFormat)
这将生成格式化为我们的设置文化的所需日期字符串(I.E. 10/4/2013或4.10.2013)。但是,如果我需要日期不包括年份,我该如何做,仍然可以变量?如果我做someDate.ToString("dd/MM", dateStringFormat)
这样的事情,那么无论文化如何,它都不会以日/月的形式保存吗?希望我的问题很清楚。感谢您提供任何可能的帮助。
答案 0 :(得分:3)
尝试使用Month format specifier。例如,这个:
var d = new DateTime(2013, 10, 04);
var str = d.ToString("M");
Console.WriteLine(d);
将在 en-US 文化中输出以下内容:
10月04日
pr-BR 文化中的以下内容:
4 de outubro
这是您可以做的最好的事情,因为可能没有定义的约定,只显示日期的月份和日期部分作为数字。
答案 1 :(得分:2)
我相信你所寻找的是不可能的,因为在文化中没有定义日/月的特定顺序(我认为有些情况下,不同格式的同一文化中的两种排序都是可能的。)
你确实可以从中获取ShortDatePattern
并删除年份部分,或者使用日/月顺序构建自己的部分。
将应用程序重新设计为显示完整格式,或显示月份名称+日期,或以其他方式明确指定是日期还是月份可能更安全。 04/10/13:)
答案 2 :(得分:1)
我一直在寻找相同的东西,并与之相关(基本上是Chris Pratt的回答)。
var model = new List<string>();
string pat;
string[] cultures = { "en-GB", "en-US", "ja-JP", "fr-FR" };
DateTime date1 = new DateTime(2011, 5, 1);
foreach (var culture in cultures)
{
DateTimeFormatInfo dtfi = CultureInfo.CreateSpecificCulture(culture).DateTimeFormat;
pat = dtfi.ShortDatePattern.Replace("/yyyy", "").Replace("yyyy/", "");
model.Add(
String.Format("{0} Date ({1}): {2}", culture, pat, date1.ToString(pat, dtfi))
);
}
可以根据需要添加更多Replace
次来电,以满足其他文化需求。
这是一个ASP MVC项目(因此&#34;模型&#34;)。您可能希望将model.Add
替换为Console.WriteLine
。
此示例的输出为:
en-GB Date (dd/MM): 01/05 en-US Date (M/d): 5/1 ja-JP Date (MM/dd): 05/01 fr-FR Date (dd/MM): 01/05
答案 3 :(得分:0)
有点好,但为什么不在结果字符串上使用Remove
?
var dateString = someDate.ToString(dateStringFormat);
var dateStringWithoutYear = dateString.Remove(dateString.Length - 5);
答案 4 :(得分:0)
出于提问者的相同原因,我来到了这篇文章。但是,在测试解决方案时,我通过不同的文化提出了问题。
只想分享我的最终解决方案,该解决方案适用于.Net中的所有中性文化:
private static string GetPatternWithoutYear(string pattern)
{
if (pattern.EndsWith("yyyy"))
pattern = pattern.Substring(0, pattern.Length - 5);
else if (pattern.StartsWith("yyyy"))
pattern = pattern.Substring(5);
// some even end with yyyy.
else if (pattern.EndsWith("yyyy."))
pattern = pattern.Substring(0, pattern.Length - 5);
else if (pattern.EndsWith("yy"))
pattern = pattern.Substring(0, pattern.Length - 3);
// and some seldom with yy.
else if (pattern.EndsWith("yy."))
pattern = pattern.Substring(0, pattern.Length - 3);
// bul
else if (pattern.EndsWith("yyyy 'г.'"))
pattern = pattern.Substring(0, pattern.Length - 9);
// tuk
else if (pattern.EndsWith(".yy 'ý.'"))
pattern = pattern.Substring(0, pattern.Length - 8);
return pattern;
}
经过以下测试(我不会将结果粘贴太长):
var cultures = CultureInfo.GetCultures(CultureTypes.NeutralCultures);
foreach (var culture in cultures)
{
string pattern = culture.DateTimeFormat.ShortDatePattern;
pattern = GetPatternWithoutYear(pattern);
Console.WriteLine($"{culture.ThreeLetterISOLanguageName}: {culture.DateTimeFormat.ShortDatePattern.PadRight(12)} {pattern.PadRight(8)} {DateTime.Now.ToString(pattern)}");
}
结果的第一行:
ivl: MM/dd/yyyy MM/dd 03.05
aar: dd/MM/yyyy dd/MM 05.03
afr: yyyy-MM-dd MM-dd 03-05
agq: d/M/yyyy d/M 5.3
aka: yyyy/MM/dd MM/dd 03.05
amh: dd/MM/yyyy dd/MM 05.03
ara: dd/MM/yy dd/MM 05.03
arn: dd-MM-yyyy dd-MM 05-03
asm: dd-MM-yyyy dd-MM 05-03
asa: dd/MM/yyyy dd/MM 05.03
ast: d/M/yyyy d/M 5.3
aze: dd.MM.yyyy dd.MM 05.03
aze: dd.MM.yyyy dd.MM 05.03
aze: dd.MM.yyyy dd.MM 05.03
bak: dd.MM.yy dd.MM 05.03
...