我目前正在允许用户使用如下所示的完整模式设置首选的DateTime格式:
var formats = System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns('f').ToList();
formats.AddRange(System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns('F'));
formats.AddRange(System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns('g'));
formats.AddRange(System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns('G'));
这会生成如下所示的完整模式字符串:
dddd, MMMM d, yyyy h:mm tt
dddd, MMMM d, yyyy hh:mm tt
dddd, MMMM d, yyyy H:mm
dddd, MMMM d, yyyy HH:mm
MMMM d, yyyy h:mm tt
dddd, d MMMM, yyyy h:mm:ss tt
M/d/yyyy h:mm tt
UI中有一些我们不想显示时间的地方,因为它与上下文无关。
是否有文化感知的BCL类允许我从字符串中提取日期模式?
示例api:
var datePattern = System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.GetDatePattern("M/d/yyyy h:mm tt");
这会导致 datePattern 设置为:
M/d/yyyy
更新
基于@SteveWellens的评论,我意识到日期/时间模式本身并不是文化变体,这就是让我失望的原因。换句话说,无论最终用户处于何种文化状态,代表小时占位符的“h”总是“h”。我创建了一个简单的扩展方法来获得我想要的东西。 (希望这不一定是字符串扩展,因为它会使intellisense混乱)
public static string GetDatePattern(this string pattern)
{
// set a default pattern if none is specified
if (string.IsNullOrWhiteSpace(pattern))
pattern = System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.FullDateTimePattern;
var start = pattern.IndexOf("h", StringComparison.InvariantCultureIgnoreCase);
// cannot find the hour placeholder
if (start < 0)
return pattern;
return pattern.Substring(0, start -1);
}
注意: 我仔细检查了所有文化( CultureTypes.AllCultures ),并且standard date and time patterns都没有以任何时间模式开始,所以这是用于标准日期和时间模式的安全逻辑。自定义模式是另一个故事。
仅供参考,任何文化的最长标准日期和时间模式是48,以防您将其保存到数据库。
答案 0 :(得分:1)
如果框架自动提供这样的内容,我会感到惊讶。我似乎无法找到任何有关此事的内容。
如果您向用户提供的日期时间格式列表在您的控制之下(即您不允许自由格式),则可以选择从普通格式字符串创建一个查找表,而不是时间组件,如下:
var mapping = new Dictionary<string, string>() {
{ "dddd, MMMM d, yyyy h:mm tt", "dddd, MMMM d, yyyy" },
{ "dddd, MMMM d, yyyy hh:mm tt", "dddd, MMMM d, yyyy" },
...
};
繁琐,但非常简单,取决于您允许的格式数量。
或者,您可以选择创建一个简单的函数,尝试从格式字符串中删除时间组件。根据您的目标,这可能是一个有效的选项。日期时间格式字符串设计为具有文化适应性,如果不严格正确的话。
或者,只需要求您的用户也选择仅限日期字符串的格式。