У меня возникла проблема, которая, вероятно, связана с моим неправильным пониманием того, как работает метод DateTime.ToShortTimeString(). При форматировании строк времени с этой функцией я предполагал, что он будет соблюдать настройку "Короткое время" в настройках формата Windows 7
Control Panel -> Clock, Language and Region -> Region and Language -> Formats Tab.
Однако .NET, кажется, выбирает короткий формат времени, не основанный на этом параметре, а на основе текущей культуры:
Region and Language -> Location -> Current Location
Я провел некоторое тестирование на Windows 7 RC:
Culture: en-GB, 6AM: 06:00, 6PM: 18:00 // HH:mm (United Kingdom) Culture: en-GB, 6AM: 06:00, 6PM: 18:00 // hh:mm (United Kingdom) Culture: en-US, 6AM: 6:00 AM, 6PM: 6:00 PM // HH:mm (United States) Culture: en-US, 6AM: 6:00 AM, 6PM: 6:00 PM // hh:mm (United States) Culture: el-GR, 6AM: 6:00 πμ, 6PM: 6:00 μμ // HH:mm (Greece) Culture: el-GR, 6AM: 6:00 πμ, 6PM: 6:00 μμ // hh:mm (Greece)
Я использовал el-GR, так как это была культура, с которой пользователь сообщил об этой проблеме, он также тестировал это на Vista SP2 и Win 7 RC с тем же результатом.
Вопрос в два раза: 1) Каково мое непонимание форматов .NET и Windows? 2) Какое лучшее решение для создания короткой временной строки (HH: mm или hh: mm tt) на основе операционной системы, в идеале это должно работать в Mono, поэтому я предпочел бы не читать из реестра или P/Invoke.
Метод, используемый для создания вышеуказанного, для будущей справки и тестирования.
[STAThread]
static void Main(string[] args)
{
CultureInfo culture = CultureInfo.CurrentCulture;
DateTime sixAm = new DateTime(2009, 07, 05, 6, 0, 0); // 6AM
DateTime sixPm = new DateTime(2009, 07, 05, 18, 0, 0); // 6PM
string sixAmString = sixAm.ToShortTimeString();
string sixPmString = sixPm.ToShortTimeString();
string format = "Culture: {0}, 6AM: {1}, 6PM: {2}";
string output = String.Format(format, culture, sixAmString, sixPmString);
Console.WriteLine(output);
Clipboard.Clear();
Clipboard.SetText(output);
Console.ReadKey();
}
Update: Основываясь на комментариях Майка ниже, я адаптировал вышеуказанный метод со следующими изменениями:
Следующие две строки
string sixAmString = sixAm.ToShortTimeString();
string sixPmString = sixPm.ToShortTimeString();
Изменено на
string sixAmString = sixAm.ToString("t", culture);
string sixPmString = sixPm.ToString("t", culture);
Я также изменил переменную культуры для использования CultureInfo.CurrentUICulture.
Это, к сожалению, не сработало так хорошо, как я надеялся, вывод вне зависимости от конфигурации Short Time в закладке Windows 7 Formats:
Culture: en-US, 6AM: 6:00 AM, 6PM: 6:00 PM
Кажется, что CultureInfo.CurrentUICulture всегда en-US.