C#,日期时间格式化,月份名称,CultureInfo

7

我正在开发一个小程序,希望能清晰地显示日期和时间,并根据文化信息进行调整,就像这样:2017年3月3日星期日 上午7:46:57

然而,我希望能够选择任何国家,并根据他们书写日期的方式输出日期。例如在丹麦,我想显示:2017年3月3日星期五 上午7:46:57(<-- 晚上会是 '19:46:57')

请注意,数字3在月份名称的另一侧。

我可以使用CultureInfo.GetCultures获取所有的文化信息,没有问题,但当我显示日期时间时,使用MyDateTime.ToString(MyCultureInfo)得到的结果是'Sunday 3/12/2017 7:46:57 AM'。

我知道如何提取月份名称,对于我已知的文化,我可以手动构建一个字符串,以我想要的方式显示所有这些数据,但是对于我不了解的文化,我无法做到这一点。如果有人选择“中文”或“阿拉伯语”,我将不知道该显示什么。

我在思考是否有一种方法可以获取任何文化中月份名称正确放置的完整日期?


1
有预定义的标准格式,参见:https://msdn.microsoft.com/zh-cn/library/az4se3k1(v=vs.110).aspx - Evan Trimboli
请展示 [MCVE] - 没有办法知道您如何错误地使用文化。 - Alexei Levenkov
@EvanTrimboli 这并不能帮助 OP,因为他们无法根据输出获得合理的 CultureInfo。 - Alexei Levenkov
1
你在这里要求两件相反的事情:你想使用文化格式,但你又不喜欢文化格式,并说“我希望它是这样的,但我希望它感觉像丹麦”……这相当荒谬。 - xanatos
谢谢。Xanatos,我可能没有在描述中足够准确。选择丹麦的CultureInfo应显示日期为标准的丹麦格式,包括月份名称。选择英国的CultureInfo应显示英国方式。同样包括月份的名称。所有其他国家也是如此。 - Mads Aggerholm
4个回答

11

我认为你所寻找的格式并不是所有文化的默认格式。下面的代码将以指定文化的默认Full格式显示日期。F代表FullDateTimePattern

var now = DateTime.Now;
var denmark = now.ToString("F", new CultureInfo("da-DK"));

根据该行代码,输出结果为:
12. marts 2017 03:34:12

因此,我的理解是:在丹麦,默认的完整日期时间格式如上所述。如果您想要另一种格式,请使用以下代码并根据需要进行调整,但请记住,在丹麦,人们可能会觉得这种模式很奇怪,因为他们不习惯它:
var denmarkCustomized = now.ToString("dddd, MMMM dd, yyyy h:mm:ss tt"
            , new CultureInfo("da-DK"));

谢谢,我相信这是我能做到的最接近的了。遗憾的是,在某些文化中,日期名称并不出现。如果它一直缺失,那么包含它就是一个简单的任务。 - Mads Aggerholm
1
不,日期名称未显示并不太糟糕:这是该文化的想法,我们不能代替他们做决定。 - CodingYoshi
如果这个回答解决了你的问题,请标记为已解决,这样其他人就知道你的问题已经得到了解答。否则,请保持开放状态。 - CodingYoshi

1

谢谢大家!你们的建议帮助我找到了解决方案:

public string fn_date(DateTime par_datetime, CultureInfo par_cultureinfo)
        {
            string st_day = par_datetime.ToString("dddd", par_cultureinfo);
            string st_date = par_datetime.ToString("T", par_cultureinfo);
            if (st_date.ToUpper().IndexOf(st_day.ToUpper()) == -1) st_date = st_day + ", " + st_date;

            return st_date;
        }

我知道这个日期的名称并不“标准”,但是我需要它是因为我正在为老年人和/或失智症患者制作一个应用程序,他们很难跟踪日期和月份。 最初,我为我的父亲做了这个应用程序,他正好有这个问题。我拿到了一台旧笔记本电脑,并在屏幕底部用大字清晰地写下了日期和时间。屏幕的其余部分显示了他孙子女的各种图片。这对他有很大的帮助。
所以我想改进它并使它国际化,这样每个人都可以从我的网站下载并使用它,如果他们需要的话。
再次感谢!

0

这个非定制的代码片段可以让你接近目标。

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("da-DK");
DateTime dt = DateTime.Now;
Console.WriteLine($"{dt.ToLongDateString()} {dt.ToLongTimeString()}");
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
Console.WriteLine($"{dt.ToLongDateString()} {dt.ToLongTimeString()}");
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("ar-AE");
Console.WriteLine($"{dt.ToLongDateString()} {dt.ToLongTimeString()}");
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("zh-CN");
Console.WriteLine($"{dt.ToLongDateString()} {dt.ToLongTimeString()}");

输出:

12. marts 2017 20:36:38
Sunday, March 12, 2017 8:36:38 PM
12 مارس, 2017 08:36:38 م
2017年3月12日 20:36:38

然而,要为特定语言环境获取定制化的输出,例如在丹麦语中显示日期,您将需要编写特殊情况的代码。


谢谢,我相信这是我能做到的最接近的了。遗憾的是,在某些文化中,日期名称并不会出现。如果它一直缺失,那么包含它就是一个简单的任务。 - Mads Aggerholm

0

大约有100种文化不在FullDateTimePattern中包含星期几。您可以使用类似this的简短程序查看它们:

var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);

foreach (var culture in cultures.OrderBy(x => x.EnglishName))
{
    if (!culture.DateTimeFormat.FullDateTimePattern.Contains("dddd"))
    {
        Console.WriteLine("{0} ({1}): {2}", culture.EnglishName, culture.Name, culture.DateTimeFormat.FullDateTimePattern);
    }
}

许多欧洲或欧洲后裔文化不包含它(我看到 Croatian (Croatia) (hr-HR), Danish (Denmark) (da-DK), English (United Kingdom) (en-GB), French (Canada) (fr-CA), Swedish (Sweden) (sv-SE)),此外还有日本、俄罗斯和中国等国家。世界是如此之大,在许多地方,星期几并不被视为日期的一部分。您有两个选择:接受它,或者对于您不喜欢日期格式的任何文化,创建包含您想要的内容的自己的FullDateTimePattern

例如,您可以:

public static CultureInfo DanishCultureInfo = InitCultureInfoWithWeek("da-DK");

private static CultureInfo InitCultureInfoWithWeek(string name)
{
    var ci = CultureInfo.GetCultureInfo(name);
    ci = (CultureInfo)ci.Clone();
    ci.DateTimeFormat.FullDateTimePattern = "dddd " + ci.DateTimeFormat.FullDateTimePattern;
    ci = CultureInfo.ReadOnly(ci);
    return ci;
}

public static CultureInfo GetCultureForPrinting(string name)
{
    var ci = CultureInfo.GetCultureInfo(name);

    if (string.Equals(name, "da-DK", StringComparison.InvariantCultureIgnoreCase))
    {
        return DanishCultureInfo;
    }
    else
    {
        return CultureInfo.GetCultureInfo(name);
    }
}

然后,当您想要使用某种文化去打印东西时,不要使用 CultureInfo.GetCultureInfo(),而是使用 GetCultureForPrinting()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接