Wpadłem na problem, który prawdopodobnie wynika z mojego błędnego zrozumienia sposobu działania metody DateTime.ToShortTimeString(). Podczas formatowania ciągów czasowych z tej funkcji, byłem przy założeniu, że będzie respektować „Short Time” ustawienie w ustawieniach formatu Windows 7 zaDlaczego DateTime.ToShortTimeString() nie uwzględnia formatu Short Time w "Ustawienia regionalne i językowe"?
Control Panel -> Clock, Language and Region -> Region and Language -> Formats Tab.
Jednak NET wydaje się wybrać krótki format czasu nie w oparciu o to ustawienie, ale w oparciu przy obecnej kulturze:
Region and Language -> Location -> Current Location
zrobiłem kilka testów na 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)
użyłem el-GR jako że była kultura, że użytkownik, który repor Z tym problemem testował to również w Vista SP2 i Win 7 RC z tym samym wynikiem.
Pytanie jest naprawdę dwojakie: 1) Jakie są moje nieporozumienia dotyczące formatów .NET i Windows? 2) Jakie jest najlepsze rozwiązanie do utworzenia krótkiego łańcucha czasu formatowania (HH: mm lub gg: mm tt) w oparciu o system operacyjny, najlepiej powinien działać w Mono, więc wolałbym uniknąć czytania z rejestru lub P/Odwołać się.
Metoda użyta do wygenerowania powyższego, do wykorzystania w przyszłości i do testowania.
[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();
}
Aktualizacja: Na podstawie uwag Mike'a poniżej I dostosowany powyższy sposób, z następującymi zmianami:
następujące dwa wiersze
string sixAmString = sixAm.ToShortTimeString();
string sixPmString = sixPm.ToShortTimeString();
zmieniona na
string sixAmString = sixAm.ToString("t", culture);
string sixPmString = sixPm.ToString("t", culture);
I als o zmieniono zmienną hodowlaną, aby używać CultureInfo.CurrentUICulture.
To niestety nie działa tak jak miałem nadzieję, wyjście niezależnie od konfiguracji krótki czas w zakładce Windows 7 za formatów było:
Culture: en-US, 6AM: 6:00 AM, 6PM: 6:00 PM
Wydaje się CultureInfo.CurrentUICulture jest zawsze en- NAS.
Dzięki, przeprowadzę z tym testowanie i wdrożę. Na co jeszcze wpływa kultura inna niż Data, Czas, Waluta, Dziesiętny i Tysiąc separatorów? –
Miesiąc, nazwy w dni powszednie. Kierunki LTR/RTL. Sortowanie ciągów. Operacje typu upper/lower z ciągami. Serializacja. –
CultureInfo.CurrentUICulture wydaje się być en-US, gdzie jeszcze można to skonfigurować? Próbowałem rebotowania po sprawdzeniu, że wszystko było ustawione na Wielką Brytanię. Zauważyłem też, że czasami po uruchomieniu programu nie pobieram natychmiast zmiany kultury. Jednak uruchomienie go po raz drugi zawsze podnosi. –