在.net中,当我知道区域性信息时,我如何知道12/24小时的时间格式?有没有一种简单的方法来检测culoter信息指定的时间格式?
我需要知道的是,文化是否应该使用12/24小时的时间格式。我知道有些文化可以同时使用12/24小时制。但是当我们使用DateTime时,默认的时间格式是什么呢。ToShortTimeString()?我们如何知道默认的时间格式是12或24?
一种方法是查看格式字符串:
CultureInfo.GetCultureInfo("cs-CZ").DateTimeFormat.ShortTimePattern.Contains("H")
如果格式字符串包含H
,则表示它使用的是24小时。如果它包含h
或tt
,则为12小时。
不过,这更像是一个肮脏的破解,而不是一个合适的解决方案(我不确定它是否适用于所有文化——你可能需要处理转义)。问题是,你为什么还要决定12/24小时?只需为给定的区域性使用正确的格式即可。
两者都可以,因为没有什么可以阻止对ToShortTimeString()
使用12和对ToLongTimeString()
使用24的培养基,反之亦然。
然而,考虑到调用ToShortTimeString()
与调用DateTimeFormat.Format(this, "t", DateTimeFormatInfo.CurrentInfo)
相同,我们可以将其与以下答案中的方法一起使用:
[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")
会告诉我们关于长时间字符串的情况。