从完整的DateTime模式中提取Date模式

时间:2014-01-23 18:51:38

标签: c# datetime

我目前正在允许用户使用如下所示的完整模式设置首选的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,以防您将其保存到数据库。

1 个答案:

答案 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" },
    ...
};

繁琐,但非常简单,取决于您允许的格式数量。

或者,您可以选择创建一个简单的函数,尝试从格式字符串中删除时间组件。根据您的目标,这可能是一个有效的选项。日期时间格式字符串设计为具有文化适应性,如果不严格正确的话。

或者,只需要求您的用户也选择仅限日期字符串的格式。