DateTime.ToString(“MM/dd/yyyy UU:mm:ss.fff”) resulteerde in iets als “14/09/2013 07.20.31.371”

Ik heb een WP8-app die de huidige tijd naar een webservice stuurt.

Ik krijg de datetime string door

. te bellen

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")

Voor de meeste gebruikers werkt het geweldig en geeft het me de juiste string zoals "09/10/2013 04:04:31.415". Maar voor sommige gebruikers is de resulterende string zoiets als "09/14/2013 07.20.31.371", wat problemen veroorzaakt in mijn webservice.

Komt het door een probleem met het cultuurformaat? Hoe kan ik ervoor zorgen dat de resultaatreeks wordt gescheiden door een dubbele punt in plaats van een punt?


Antwoord 1, autoriteit 100%

Is het vanwege een probleem met de cultuurindeling?

Ja. Uw gebruiker moet zich in een cultuur bevinden waarin het tijdscheidingsteken een punt is. Zowel “:” als “/” worden op een cultuurgevoelige manier geïnterpreteerd in aangepaste datum en tijdnotaties.

Hoe kan ik ervoor zorgen dat de resultaatreeks wordt gescheiden door een dubbele punt in plaats van een punt?

Ik stel voor om CultureInfo.InvariantCultureop te geven:

string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
                                CultureInfo.InvariantCulture);

U kunt ook zougewoon de tijd- en datumscheidingstekens citeren:

string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");

… maar dat geeft je “interessante” resultaten die je waarschijnlijk niet verwacht als je gebruikers in een cultuur laat werken waar het standaard kalendersysteem niet de Gregoriaanse kalender is. Neem bijvoorbeeld de volgende code:

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"));
    }
} 

Dat levert output (op 18 september 2013) op van:

11/12/1434 15:04:31.750

Ik vermoed dat uw webservice daardoor verrast zou zijn!

Ik zou eigenlijk willen voorstellen om niet alleen de invariante cultuur te gebruiken, maar ookover te schakelen naar een ISO-8601 datumnotatie:

string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff", CultureInfo.InvariantCulture);

Dit is een meer wereldwijd geaccepteerde indeling – het is ook sorteerbaar en maakt de volgorde van maand en dag duidelijk. (Terwijl 06/07/2013 kan worden geïnterpreteerd als 7 juni of 6 juli, afhankelijk van de cultuur van de lezer.)


Antwoord 2, autoriteit 4%

:heeft een speciale betekenis: het is Het tijdscheidingsteken.(Aangepaste tekenreeksen voor datum- en tijdnotatie).

Gebruik \om te ontsnappen:

DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")

Of gebruik CultureInfo.InvariantCulture:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)

Ik zou voorstellen met de tweede, omdat /ook speciale betekenis heeft (het is de datumafscheider. ), zodat u daar ook problemen mee kunt hebben .


Antwoord 3, Autoriteit 3%

U kunt invariantcultuur gebruiken omdat uw gebruiker in een cultuur moet zijn die een punt gebruikt in plaats van een dikke darm:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);

Antwoord 4, Autoriteit 3%

Ik heb de laatste tijd in dit probleem gestoken met Windows 10 van Nog een richting, en vond het antwoord van @jonskeet zeer behulpzaam bij het oplossen van mijn probleem.

Ik heb ook een ander onderzoek gedaan met een testformulier en ontdekte dat wanneer de huidige cultuur is ingesteld op "no"of "nb-NO"bij runtime ( Thread.CurrentThread.CurrentCulture = new CultureInfo("no");), de TOSTRING (“YYYY-MM-DD HH: MM: SS”) Oproep reageerde anders in Windows 7 en Windows 10. IT Geretourneerd wat ik verwachtte in Windows 7 en HH.MM.SS in Windows 10!

Ik denk dat dit een beetje eng is! Sinds ik geloofde dat een cultuur in ieder geval een cultuur in een Windows-versie was.


Antwoord 5, Autoriteit 2%

U kunt string.format gebruiken:

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"

Antwoord 6

Datum omzetten in string

Gebruik naamruimte

using System.Globalization;

Code

string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");

Other episodes