DateTime.ToString ("MM / dd / yyyy HH: mm: ss.fff") zaowocowało czymś w rodzaju " 09/14/2013 07.20.31.371"
Mam aplikację WP8, która wyśle bieżący czas do serwisu internetowego.
Otrzymuję łańcuch datetime przez wywołanie
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")
Dla większości użytkowników działa świetnie i daje mi poprawny ciąg jak "09/10/2013 04:04:31.415"
. Ale dla jakiegoś użytkownika wynikowy ciąg znaków jest czymś w rodzaju "09/14/2013 07.20.31.371"
, co powoduje problemy w moim serwisie internetowym.
6 answers
Tak. Twój użytkownik musi znajdować się w kulturze, w której separatorem czasu jest kropka. Zarówno":", jak i "/" są interpretowane w sposób wrażliwy na kulturę w niestandardowych formatach daty i czasu.Czy to dlatego, że jakiś problem z formatem Kultury?
Jak mogę się upewnić, że łańcuch wynikowy jest oddzielony dwukropkiem zamiast kropką?
Proponuję podać CultureInfo.InvariantCulture
:
string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
CultureInfo.InvariantCulture);
Alternatywnie, możnamożna po prostu zacytować czas i datę separatory:
string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");
... ale to da ci "interesujące" wyniki, których prawdopodobnie nie oczekujesz, jeśli masz 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"));
}
}
, która produkuje (18 września 2013):
11/12/1434 15:04:31.750
Zgaduję, że Twój serwis internetowy byłby tym zaskoczony!
Sugerowałbym nie tylko użycie Kultury niezmienniczej, ale również zmianę do formatu daty ISO-8601:
string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");
Jest to bardziej globalnie Akceptowany format - jest również sortowalny i sprawia, że kolejność miesięcy i dni jest oczywista. (Natomiast 06/07/2013 można interpretować jako 7 czerwca lub 6 lipca w zależności od kultury czytelnika.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 14:04:49
:
ma specjalne znaczenie: jest separatorem czasu. (niestandardowe ciągi formatu daty i czasu).
Użyj \
, aby uciec:
DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")
Lub CultureInfo.InvariantCulture
:
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)
Sugerowałbym użycie drugiego, ponieważ /
ma również specjalne znaczenie (jest to separator daty.), więc ty też możesz mieć z tym problemy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 13:56:29
Możesz używać Kultury Niezmienniczej, ponieważ twój użytkownik musi być w kulturze, która używa kropki zamiast dwukropka:
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 13:56:39
Wpadłem ostatnio na ten problem z Windows 10 z w innym kierunku, i znalazłem odpowiedź od @JonSkeet bardzo pomocną w rozwiązaniu mojego problemu.
Zrobiłem również SOM dalsze badania z formularzem testowym i okazało się, że gdy obecna kultura została ustawiona na "no"
lub "nb-NO"
w czasie wykonywania (Thread.CurrentThread.CurrentCulture = new CultureInfo("no");
), wywołanie ToString("yyyy-MM-dd HH:mm:ss") odpowiedziało inaczej w 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 to trochę przerażające! Ponieważ wierzyłem, że kultura jest kulturą przynajmniej w każdej wersji systemu Windows.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:37
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"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-23 14:43:34
Konwertuj Datę Na Łańcuch Znaków
Użyj przestrzeni nazw
using System.Globalization;
Kod
string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-29 10:57:08