如何确定当前文化/区域设置是使用上午/下午或24小时?

时间:2011-09-04 23:53:56

标签: .net time

我需要确定当前的culture / locale是否设置为使用am / pm时间或24小时时间。

起初我以为我可以这样做:

bool time24Hour = Thread.CurrentThread.CurrentCulture.DateTimeFormat.AMDesignator == "";

但后来我读到了关于这个帖子Get just the hour of day from DateTime using either 12 or 24 hour format as defined by the current culture的最后一个答案的评论,这似乎意味着这不起作用。

我想我可以格式化任意时间,然后分析结果,但肯定有一种更简单的方法吗?

编辑:

另请参阅下面的评论 - 我只想确定两个预先格式化的常量字符串中的哪一个包含我应该选择的小时列表,并希望避免许多不必要的扭曲 - 我只需要一个是/否答案无论这是上午/下午文化还是24小时文化。

该程序是WinForms程序,如果有任何帮助的话。

2 个答案:

答案 0 :(得分:10)

尝试检查DateTimeFormat.ShortTimePattern是否包含H。如果是,则系统使用24小时

答案 1 :(得分:2)

如果可以的话,只是一小部分。根据dario_ramos的回答,我把它变成了一个带有支持单元测试的扩展方法,它传递给我的系统(检查378种文化)。

public static class DateTimeExtensions
{
    public static bool Is24Hrs(this CultureInfo cultureInfo)
    {
        return cultureInfo.DateTimeFormat.ShortTimePattern.Contains("H");
    }
}

[TestClass]
public class DateTimeExtensionTests
{
    [TestMethod]
    public void Unit_Can_Determine_If_Culture_Uses_24HrTime()
    {
        var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
        foreach (var cultureInfo in cultures)
        {
            Thread.CurrentThread.CurrentCulture = cultureInfo;
            var datetime = new DateTime(2000, 1, 1, 23, 0, 0);
            var formatted = datetime.ToString("t");
            var is24Hrs = formatted.Contains("23");
            Assert.AreEqual(is24Hrs, cultureInfo.Is24Hrs());
        }
    }
}