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.

Czy to dlatego, że jakiś problem z formatem Kultury? Jak mogę się upewnić, że łańcuch wynikowy jest oddzielony dwukropkiem zamiast kropką?
Author: Max, 2013-09-18

6 answers

Czy to dlatego, że jakiś problem z formatem Kultury?

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.

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.)

 203
Author: Jon Skeet,
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.

 9
Author: MarcinJuraszek,
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);
 7
Author: Jon La Marr,
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.

 6
Author: Håkon Seljåsen,
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"
 3
Author: Cosmin,
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");
 0
Author: Hafsal,
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