gpt4 book ai didi

c# - 从完整的日期时间模式中仅提取日期模式

转载 作者:太空宇宙 更新时间:2023-11-03 13:29:01 26 4
gpt4 key购买 nike

我目前允许用户使用像这样的完整模式来设置他们喜欢的 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”。我创建了一个非常简单的扩展方法来获得我想要的东西。 (但愿这不必是字符串扩展,因为它会扰乱智能感知)

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,以防您将其保存到数据库中。

最佳答案

如果框架自动提供这样的东西,我会感到惊讶。我似乎找不到与此相关的任何信息。

如果您向用户提供的日期时间格式列表在您的控制之下(即您不允许自由格式),一种选择是创建一个从正常格式字符串到没有时间组件,像这样:

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

乏味,但非常简单,具体取决于您允许的格式数量。

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

或者,只需让您的用户也为仅限日期的字符串选择一种格式。

关于c# - 从完整的日期时间模式中仅提取日期模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21316896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com