У меня возникла проблема, которая, вероятно, связана с моим неправильным пониманием того, как работает метод DateTime.ToShortTimeString(). При форматировании строки времени с помощью этой функции, я предполагал, что он будет уважать «Короткое время» настройки в настройках формата Windows 7.Почему DateTime.ToShortTimeString() не учитывает формат Short Time в «Regional and Language Settings»?
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)
я использовал эль-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();
}
Обновление: Основываясь на комментарии Майка ниже я приспособил выше метод со следующими изменениями:
Следующие две строки
string sixAmString = sixAm.ToShortTimeString();
string sixPmString = sixPm.ToShortTimeString();
изменено на
string sixAmString = sixAm.ToString("t", culture);
string sixPmString = sixPm.ToString("t", culture);
Я имею в виду o изменил переменную культуры для использования CultureInfo.CurrentUICulture.
Это несчастливо не работает так, как я надеялся, выход независимо от конфигурации короткий промежуток времени в Windows 7 вкладке Форматы был:
Culture: en-US, 6AM: 6:00 AM, 6PM: 6:00 PM
Кажется CultureInfo.CurrentUICulture всегда ен- НАС.
Спасибо, я сделаю некоторое тестирование с этим и внедряюсь. На что еще влияет культура, отличная от даты, времени, валюты, десятичной и тысячи разделителей? –
Месяц, названия дней недели. LTR/RTL. Сортировка строк. Операции верхнего и нижнего регистров со строками. Сериализация. –
CultureInfo.CurrentUICulture кажется en-US, где еще это можно настроить? Я попробовал репотировать после проверки, что все было установлено в Соединенном Королевстве. Я также заметил, что иногда после запуска программы он не сразу меняет культуру. Однако запуск его второй раз всегда подбирает его. –