Mam aplikację WP8, która wyśle aktualny czas do usługi internetowej.
Otrzymuję ciąg daty i godziny, dzwoniąc
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")
Dla większości użytkowników działa świetnie i daje mi prawidłowy ciąg, taki jak "09/10/2013 04:04:31.415"
. Ale dla niektórych użytkowników wynikowy ciąg jest czymś w rodzaju "09/14/2013 07.20.31.371"
, co powoduje problem w mojej usłudze internetowej.
Czy to z powodu jakiegoś problemu z formatem kultury? Jak mogę się upewnić, że ciąg wynikowy jest oddzielony dwukropkiem, a nie kropką?
c#
windows-phone-8
Eldorado
źródło
źródło
Odpowiedzi:
Tak. Twój użytkownik musi znajdować się w kulturze, w której separatorem czasu jest kropka. Zarówno „:”, jak i „/” są interpretowane z uwzględnieniem kultury w niestandardowych formatach daty i godziny .
Proponuję określić
CultureInfo.InvariantCulture
:string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);
Alternatywnie, to mógłby tylko zacytować separatory czasu i daty:
string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");
... ale to da Ci „interesujące” wyniki, których prawdopodobnie nie spodziewasz się, jeśli uzyskasz użytkowników działających w kulturze, w której domyślny system kalendarza nie jest kalendarzem gregoriańskim. Na przykład weź następujący kod:
using System; using System.Globalization; using System.Threading; class Test { static void Main() { DateTime now = DateTime.Now; CultureInfo culture = new CultureInfo("ar-SA"); // Saudi Arabia Thread.CurrentThread.CurrentCulture = culture; Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff")); } }
To produkuje (18 września 2013):
11/12/1434 15:04:31.750
Domyślam się, że Twoja usługa internetowa byłaby tym zaskoczona!
Właściwie sugerowałbym nie tylko użycie niezmiennej kultury, ale także zmianę na format daty ISO-8601:
string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");
Jest to format bardziej akceptowany na całym świecie - można go również sortować, a porządek miesiąca i dnia jest oczywisty. (Natomiast 06/07/2013 można interpretować jako 7 czerwca lub 6 lipca, w zależności od kultury czytelnika).
źródło
useUserOverride
parametru na false, w przeciwnym razie niektóre ustawienia użytkownika mogą zastąpić ustawienia kultury. Na przykład w twoim przypadku proponuję użyć nowegoCultureInfo("ar-SA", false)
.:
ma specjalne znaczenie: jest to separator czasu. ( Ciągi niestandardowego formatu daty i godziny ).Użyj,
\
aby uciec:DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")
Lub użyj
CultureInfo.InvariantCulture
:DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)
Proponuję wybrać drugą, ponieważ
/
ma również specjalne znaczenie (jest to Separator daty ), więc możesz mieć z tym problemy.źródło
Możesz użyć InvariantCulture, ponieważ Twój użytkownik musi znajdować się w kulturze, która używa kropki zamiast dwukropka:
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);
źródło
Ostatnio natknąłem się na ten problem z Windows 10 z innego kierunku i znalazłem odpowiedź od @JonSkeet bardzo pomocną w rozwiązaniu mojego problemu.
Przeprowadziłem również dalsze badania z formularzem testowym i odkryłem, że gdy bieżąca kultura została ustawiona na
"no"
lub"nb-NO"
w czasie wykonywania (Thread.CurrentThread.CurrentCulture = new CultureInfo("no");
), wywołanie ToString („rrrr-MM-dd HH: mm: ss”) odpowiadało inaczej w systemie Windows 7 i Windows 10. Zwrócił to, czego oczekiwałem w Windows 7 i HH.mm.ss w Windows 10!Myślę, że to trochę przerażające! Ponieważ wierzyłem, że kultura jest kulturą przynajmniej w dowolnej wersji systemu Windows.
źródło
Możesz użyć String.Format:
DateTime d = DateTime.Now; string str = String.Format("{0:00}/{1:00}/{2:0000} {3:00}:{4:00}:{5:00}.{6:000}", d.Month, d.Day, d.Year, d.Hour, d.Minute, d.Second, d.Millisecond); // I got this result: "02/23/2015 16:42:38.234"
źródło
Konwertuj datę na ciąg
Użyj przestrzeni nazw
using System.Globalization;
Kod
string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");
źródło