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

时间:2017-03-12 07:10:51

标签: c# datetime cultureinfo

我正在制作一个小程序,我希望根据cultureinfo明确显示日期和时间,如下所示: 星期日,3月3日2017年7:46:57

但是,我希望可以选择任何国家/地区,并根据其编写日期的方式获取日期输出。以丹麦为例,我想表明: Søndag,3。marts 2017 7:46:57 (< - 晚上会是'19:46:57')

请注意,' 3 '位于月份名称的另一侧。

我可以使用CultureInfo.GetCultures获取所有cultureinfo,没问题,但是当我显示日期时间时,我会使用MyDateTime.ToString(MyCultureInfo);'/ p获得'Sunday 3/12/2017 7:46:57 AM' >

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

我在想是否有办法在任何文化的正确位置获取月份名称的完整日期?

4 个答案:

答案 0 :(得分:3)

我认为您所寻找的格式并不是所有文化的默认格式。以下代码将以指定区域性的默认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"));

答案 1 :(得分: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

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

答案 2 :(得分:0)

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)< / em>,英语(英国)(en-GB)法语(加拿大)(fr-CA)瑞典语(瑞典)(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()

答案 3 :(得分:0)

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

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

我知道这一天的名字不是标准的,但我之所以需要这个,是因为我为那些难以跟踪的老人和/或痴呆症的人制作应用程序这是什么日子和月份。 最初我是为我的父亲做的,他有这个确切的问题。我抓住了一台旧笔记本电脑,并在屏幕底部用大字写清楚了日期和时间。屏幕的其余部分显示了他孙子的各种照片。这是一个很大的帮助。

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

再次感谢!