设置本地化日期的格式,而不显示区域性可变的年份
本文关键字:区域性 显示 日期 本地化 格式 设置 | 更新日期: 2023-09-27 18:33:52
我需要根据当前设置的区域性将日期显示在 M/dd 或 dd/M 中。在我们的应用程序中,我们根据配置显式设置区域性。我们目前使用以下方法格式化日期:
string dateStringFormat =Thread.CurrentThread.CurrentUICulture.DateTimeFormat.ShortDatePattern;
someDate.ToString(dateStringFormat)
这将生成所需的日期字符串,格式设置为我们设置的区域性(即 10/4/2013 或 4.10.2013)。但是,如果我需要日期不包括年份,我该怎么做并且仍然使其可变?如果我做类似的事情someDate.ToString("dd/MM", dateStringFormat)
那么无论文化如何,它不会总是保持日/月格式吗?希望我的问题足够清楚。感谢您提供任何可能的帮助。
尝试使用月份格式说明符。例如,这个:
var d = new DateTime(2013, 10, 04);
var str = d.ToString("M");
Console.WriteLine(d);
将在 en-US 区域性中输出以下内容:
十月 04
在 pr-BR 文化中,以下内容:
4 de outubro
这是您可以做的最好的事情,因为可能没有定义的约定来仅将日期的月份和日期部分显示为数字。
您正在寻找的内容是不可能的,因为在文化中没有定义特定的日/月顺序(我认为在某些情况下,对于不同的格式,在同一文化中可以同时进行两种排序)。
您确实可以从中获取ShortDatePattern
并从中剥离年份部分,或者使用日/月顺序来构建自己的部分。
重新设计应用程序以显示完整格式、显示月份名称 + 日,或者以其他方式显式指定它是天还是月,可能会更安全。 13-10-04 :)
我正在寻找同样的东西并接受了这个(本质上是克里斯普拉特答案的变体)。
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项目(因此称为"模型")。您可能希望将model.Add
替换为 Console.WriteLine
。
此示例的输出为:
en-GB 日期 (日/月): 01/05美国日期(周一/日):5/1JA-JP 日期 (月/日): 05/01周五至周五日期 (日/月): 01/05
有点曲棍,但为什么不只在生成的字符串上使用Remove
呢?
var dateString = someDate.ToString(dateStringFormat);
var dateStringWithoutYear = dateString.Remove(dateString.Length - 5);
我从提问者那里得出这篇文章的原因完全相同。然而,在测试解决方案时,我在不同的文化中提出了问题。
只是想分享我的最终解决方案,它适用于 .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
...