C#、日期时间格式、mont 名称、cultureinfo

C#, datetime formatting, mont name, cultureinfo

我目前正在开发一个小程序,我想根据 cultureinfo 清楚地显示日期和时间,如下所示: 2017 年 3 月 3 日星期日7:46:57上午

但是,我希望可以select任何国家,并根据他们的日期书写方式得到日期输出。以丹麦为例,我想展示: Søndag, 3. marts 2017 7:46:57(<-- 晚上应该是“19:46:57”)

请注意,“3”在月份名称的另一边。

我可以使用 CultureInfo.GetCultures 获取所有文化信息,没问题,但是当我显示日期时间时,我使用 MyDateTime.ToString(MyCultureInfo);

获取 'Sunday 3/12/2017 7:46:57 AM'

我知道如何提取月份名称,我可以手动构建一个字符串,其中所有这些数据都以我想要的方式显示我知道的文化,但我不能为我不知道的文化。如果有人选择 'Chinese' og 'Arabic',我不知道要显示什么。

我在想是否有某种方法可以在任何文化的正确位置获取带有月份名称的完整日期?

这个非定制的代码片段让你接近。

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

但是,要获得区域设置的自定义输出,例如丹麦语出现的那一天,你必须编写特殊情况的代码。

我不认为您要查找的格式是所有区域性的默认格式。下面的代码将以默认 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"));

FullDateTimePattern 中有大约 100 种文化不包括工作日。你可以用像 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);
    }
}

许多欧洲或欧洲后裔文化不包括它(我看到 克罗地亚语(克罗地亚)(hr-HR)丹麦语(丹麦)( da-DK)英语(英国)(en-GB)法语(加拿大)(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);
    }
}

然后当你想使用一种文化来打印某些东西时,你可以使用 GetCultureForPrinting()

而不是 CultureInfo.GetCultureInfo()

谢谢大家!你的意见引导我找到这个解决方案:

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;
        }

我知道今天的名字不是 'standard',但我需要这个的原因是我正在为 and/or 痴呆的老人制作一个应用程序,他们很难记住现在是几月几日。 最初我是为我父亲做的,他有这个问题。我弄来一台旧笔记本电脑,让它在屏幕底部用大写字母清楚地写下日期和时间。屏幕的其余部分显示了他孙子们的各种照片。这是一个很大的帮助。

所以我想改进它并使它国际化,这样每个人都可以从我的网站下载它并在需要时使用它。

再次感谢!