C# C、 日期时间格式、月份名称、文化信息

C# C、 日期时间格式、月份名称、文化信息,c#,datetime,cultureinfo,C#,Datetime,Cultureinfo,我目前正在开发一个小程序,我想根据cultureinfo清楚地显示日期和时间,如下所示: 3月3日,星期日。2017年7:46:57上午 但是,我希望它能够选择任何国家,并根据其写入日期的方式获得日期输出。以丹麦为例,我想展示: 桑达格,3。marts 2017 7:46:57这段非定制的代码片段让您接近 Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("da

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

但是,我希望它能够选择任何国家,并根据其写入日期的方式获得日期输出。以丹麦为例,我想展示:
桑达格,3。marts 2017 7:46:57这段非定制的代码片段让您接近

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

但是,要获得区域设置的自定义输出,例如,以丹麦语显示的日期,您必须对特殊情况进行编码。

我不认为您正在寻找的格式是所有区域性的默认格式。下面的代码将以指定区域性的默认完整格式显示日期。F代表

根据该代码行,输出为:

12. marts 2017 03:34:12
因此,我的结论是:丹麦默认的全日制模式如上所示。如果您想要另一种格式,请使用下面的代码并根据需要进行调整,但请记住,丹麦人可能会发现这种模式很奇怪,因为他们可能不习惯这种模式:

var denmarkCustomized = now.ToString("dddd, MMMM dd, yyyy h:mm:ss tt"
            , new CultureInfo("da-DK"));

大约有100种文化在FullDateTimePattern中不包括星期天。您可以通过以下简短程序查看它们:

许多欧洲或欧洲后裔文化不包括它,我看到克罗地亚hr hr,丹麦da DK,英国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

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

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;
        }
我知道这一天的名称不是“标准”,但我之所以需要它,是因为我正在为老年人和/或精神错乱的人制作一个应用程序,他们很难记住这一天是哪一天、哪一个月。 最初我是为我的父亲做的,他有这个问题。我找到一台旧笔记本电脑,让它在屏幕底部用大写字母清楚地写下日期和时间。屏幕的其余部分显示了他孙子孙女的各种照片。这是一个很大的帮助

所以我想改进它,使它国际化,这样每个人都可以从我的网站下载它,如果他们需要的话可以使用它


再次感谢

有预定义的标准格式,请看:请显示-没有办法知道您是如何将区域性弄错的。@Evantimboli这对OP没有帮助,因为他们无法根据输出获得合理的cultureInfo。您在这里要求的是两件相反的事情:您想使用区域性格式,但不喜欢区域性格式,并说我希望它是这样,但我想让它感觉像。。。这完全没有道理。谢谢你。Xanatos,我的描述可能不够准确。选择cultureinfo for Denmark时,在包含月份名称时,应将日期显示为丹麦标准的日期显示方式。为英格兰选择文化应该向它展示英国的方式。同样,包括月份的名称。其他国家也是如此。谢谢你,我相信这是我能做到的最接近的。糟糕的是,那天的名字没有出现在所有文化中。如果它一直都不见了,那么包括它将是一项简单的任务。谢谢你,我相信这是我能做到的最接近的。糟糕的是,那天的名字没有出现在所有文化中。如果它一直没有出现,那么包括它将是一项简单的任务。不,这一天的名称没有出现也不太糟糕:这就是文化想要的,因此我们无法为他们做出决定。此外,如果这回答了你的问题,那么请标记它,让其他人知道你的问题已经得到了回答。否则,请保持打开状态。
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);
    }
}
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;
        }