2015-06-23 3 views
1

В .net, когда я знаю информацию о культуре, как узнать формат времени 12/24 часа? Есть ли простой способ определить формат времени, указанный пользователем culuter?.net Как узнать формат 12/24 часов, когда я знаю культуру Info

Что мне нужно знать, просто если культура должна использовать формат времени 12/24 часа. Я знаю, что некоторые культуры могут использовать формат времени 12/24 часа. Но каков формат времени по умолчанию, когда мы используем DateTime.ToShortTimeString()? Как мы узнаем, что формат по умолчанию - 12 или 24?

+0

Один из способов использования - использовать ShortTimePattern и проверять, соответствует ли он спецификатору «tt». Но большинство из них не содержат «tt». Это означает, что мы будем использовать формат времени 24 часа. Или мы можем знать, поддерживает ли рынок только 24-часовой формат времени? – pthread

ответ

1

Одним из способов было бы взглянуть на строку формата:

CultureInfo.GetCultureInfo("cs-CZ").DateTimeFormat.ShortTimePattern.Contains("H") 

Если строка формата содержит H, это означает, что она использует 24-часовой. Если он содержит h или tt, тем не менее - 12 часов.

Это скорее грязный взломать, чем правильное решение (хотя я не уверен, что он будет работать для всех культур - вам, возможно, придется справляться с побегом). Вопрос в том, почему вы даже пытаетесь определить 12/24-часовой? Просто используйте правильный формат для данной культуры и делайте это с ней.

+0

Это, вероятно, будет работать, но теоретически нечего сказать, что формат не может быть '' 7Hours 34Minutes'', где '7' составляет 12 часов. Теоретически это возможно и для использования как 12, так и 24 часа. Вы должны лишить литералы, а затем проверить, чтобы оба были уверены. –

+0

@JonHanna Да, поэтому я сказал, что вам, возможно, придется справиться с побегом. Это, наверное, не будет проблемой, но может быть. Однако снятие их немного сложнее, чем кажется: D – Luaan

+0

Это не так сложно. См. Мой ответ; 'new Regex (@" ('. *') | ("". * "") | (\\.) ")' ловит их всех. –

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") расскажет нам о длинной строке.

 Смежные вопросы

  • Нет связанных вопросов^_^