C# 从标准格式获取自定义日期时间格式

C# 从标准格式获取自定义日期时间格式,c#,datetime,datetime-format,C#,Datetime,Datetime Format,在我的脚本中,我收到一个标准格式,如“D”、“f”、“R”或其他格式。根据MSDN,这是一种标准的日期时间格式 考虑到用户的当前文化,我希望获得此标准格式的自定义格式 例如,假设我的用户来自法国(fr): “d”=“日/月/年” “D”=“dddd D MMMM yyyy” “F”=“dddd d MMMM yyyy HH:mm:ss”以下是一些代码,您可以获得这些模式: var c = new CultureInfo("fr-FR"); Console.WriteLine(c.DateTime

在我的脚本中,我收到一个标准格式,如“D”、“f”、“R”或其他格式。根据MSDN,这是一种标准的日期时间格式

考虑到用户的当前文化,我希望获得此标准格式的自定义格式

例如,假设我的用户来自法国(fr):

“d”=“日/月/年”

“D”=“dddd D MMMM yyyy”


“F”=“dddd d MMMM yyyy HH:mm:ss”

以下是一些代码,您可以获得这些模式:

var c = new CultureInfo("fr-FR");
Console.WriteLine(c.DateTimeFormat.LongDatePattern);
Console.WriteLine(c.DateTimeFormat.ShortDatePattern);
Console.WriteLine(c.DateTimeFormat.FullDateTimePattern);
控制台应用程序的结果如下

dddd d MMMM yyyy
dd/MM/yyyy
dddd d MMMM yyyy HH:mm:ss

说明需要查找哪些属性。

使用当前线程(或UI线程,以适当的为准)的
日期时间格式的各种属性:


您需要该格式的
char
版本,但您可以这样做:

CultureInfo culture = //get your culture
var patterns = culture.DateTimeFormat.GetAllDateTimePatterns(yourFormatChar);

一些反射可能会确保您获得内部使用的相同扩展格式字符串:

string GetRealFormat(string format, DateTimeFormatInfo dtfi)
{
    MethodInfo method = Type.GetType("System.DateTimeFormat")
        .GetMethod("GetRealFormat", 
                   BindingFlags.Static | BindingFlags.NonPublic);

    return method.Invoke(null, new object[] { format, dtfi }) as string;
}

这并不能回答问题:他需要它来格式化字符串。这个例子使他能够得到格式,他只需要修改代码以适应他的使用。而不是你的时间。但正如我所说的,我正在寻找一个更简单的解决方案(代码越少越好)。对不起,我的问题本可以更清楚。是的,我同意塔利的回答比我和其他人的好。看到他的作品(从另一个答案的改进),但将是一个痛苦的写作,调试和mantain。谢谢你的回答。我考虑过这个解决方案,但我正在寻找一种更干净的方法。正如Notalie所说,这个代码很难维护。对不起,我的问题不够清楚。@It'sNotALie。以什么方式?这三个属性分别代表“d”、“d”和“F”的标准格式字符串,甚至在中也这么说。是的,但是对于额外的格式字符串,这将是一个难题。如果你打错了,你需要打开互联网,查阅文档,寻找合适的,修改代码。然后再为其他人做一次。我同意这是徒劳的。我更喜欢让C#来处理这项工作,如果可以的话,也不要在我的应用程序中添加太多代码。不过,还是要谢谢你的回答!简单干净!它就像一个符咒!我猜我总是使用第一个元素,因为GetAllDateTimePatterns()返回字符串[]?。@NLemay这取决于是否需要其他元素,我认为一些格式字符串返回多个。但是我认为第一个元素是安全的,好吧!不知道在什么样的情况下,我可以为一个唯一的标准格式获得多个自定义格式。当使用DateTime.toString()时,C#将如何处理这个问题?但无论如何,第一个可能是好的@NLemay我真的不知道,我会做一些测试,然后回来。@NLemay LINQPad说,可以返回更多结果的是d、d、f、f、g、g、t、t和U(至少在英国是这样)。但是,第一个是最常见的,所以我总是选择第一个。如果我理解得很好,使用这个解决方案,我肯定会得到最佳匹配,而不是字符串[]?这不是最简单的答案,但肯定是一个简洁而漂亮的答案!非常感谢。此解决方案在.netstandart中不起作用:“System.String”类型的对象无法转换为“System.ReadOnlySpan`1[System.Char]类型
CultureInfo culture = //get your culture
var patterns = culture.DateTimeFormat.GetAllDateTimePatterns(yourFormatChar);
string GetRealFormat(string format, DateTimeFormatInfo dtfi)
{
    MethodInfo method = Type.GetType("System.DateTimeFormat")
        .GetMethod("GetRealFormat", 
                   BindingFlags.Static | BindingFlags.NonPublic);

    return method.Invoke(null, new object[] { format, dtfi }) as string;
}
string format = GetRealFormat("d", DateTimeFormatInfo.CurrentInfo) // dd.MM.yyyy