在.net中,当我知道文化信息时,我怎么知道12/24小时的时间格式?有没有一种简单的方法来检测指定时间格式的贪婪信息?
我需要知道的是文化应该使用12/24小时时间格式。我知道有些文化可以使用12/24小时的时间格式。但是当我们使用DateTime.ToShortTimeString()时,默认的时间格式是什么?我们怎么知道默认时间格式是12还是24?
答案 0 :(得分:1)
一种方法是查看格式字符串:
CultureInfo.GetCultureInfo("cs-CZ").DateTimeFormat.ShortTimePattern.Contains("H")
如果格式字符串包含H
,则表示它使用24小时。如果它包含h
或tt
,那么它是12小时。
这更像是一个肮脏的黑客而不是一个正确的解决方案(但我不确定它是否适用于所有文化 - 你可能需要处理转义)。问题是 - 为什么你甚至试图确定12/24小时?只需使用适当的格式来完成给定的文化即可。
答案 1 :(得分:0)
可能两者兼而有之,因为没有什么可以阻止文化使用12代表ToShortTimeString()
而24代表ToLongTimeString()
,反之亦然。
但是,考虑到调用ToShortTimeString()
与调用DateTimeFormat.Format(this, "t", DateTimeFormatInfo.CurrentInfo)
相同,我们可以将其与this answer中的方法一起使用:
[Flags]
public enum HourRepType
{
None = 0,
Twelve = 1,
TwentyFour = 2,
Both = Twelve | TwentyFour
}
public static HourRepType FormatStringHourType(string format, CultureInfo culture = null)
{
if(string.IsNullOrEmpty(format))
format = "G";//null or empty is treated as general, long time.
if(culture == null)
culture = CultureInfo.CurrentCulture;//allow null as a shortcut for this
if(format.Length == 1)
switch(format)
{
case "O": case "o": case "R": case "r": case "s": case "u":
return HourRepType.TwentyFour;//always the case for these formats.
case "m": case "M": case "y": case "Y":
return HourRepType.None;//always the case for these formats.
case "d":
return CustomFormatStringHourType(culture.DateTimeFormat.ShortDatePattern);
case "D":
return CustomFormatStringHourType(culture.DateTimeFormat.LongDatePattern);
case "f":
return CustomFormatStringHourType(culture.DateTimeFormat.LongDatePattern + " " + culture.DateTimeFormat.ShortTimePattern);
case "F":
return CustomFormatStringHourType(culture.DateTimeFormat.FullDateTimePattern);
case "g":
return CustomFormatStringHourType(culture.DateTimeFormat.ShortDatePattern + " " + culture.DateTimeFormat.ShortTimePattern);
case "G":
return CustomFormatStringHourType(culture.DateTimeFormat.ShortDatePattern + " " + culture.DateTimeFormat.LongTimePattern);
case "t":
return CustomFormatStringHourType(culture.DateTimeFormat.ShortTimePattern);
case "T":
return CustomFormatStringHourType(culture.DateTimeFormat.LongTimePattern);
default:
throw new FormatException();
}
return CustomFormatStringHourType(format);
}
private static HourRepType CustomFormatStringHourType(string format)
{
format = new Regex(@"('.*')|("".*"")|(\\.)").Replace(format, "");//remove literals
if(format.Contains("H"))
return format.Contains("h") ? HourRepType.Both : HourRepType.TwentyFour;
return format.Contains("h") ? HourRepType.Twelve : HourRepType.None;
}
并致电FormatStringHourType("t")
,了解它是12小时或24小时(或可能不是或两者兼有,但这很奇怪)。
同样FormatStringHourType("T")
会告诉我们长时间的字符串。