2013-04-29 11 views
5

Używam usługi sieci web, która zwraca mi niektóre daty jako ciąg, a ja używam DateTime.Parse, aby uzyskać obiekty korespondente DateTime. Działa, ale obawiam się, że użycie DateTime.Parse może być podatne na błędy spowodowane przez różne ustawienia narodowe. Data zwrócony jest w następującym formacie:Jak poprawnie przeanalizować DateTime w tym formacie: "2013-04-29T00: 00: 00"

2014-04-24T00:00:00 

Kod Używam go zanalizować:

DateTime d = DateTime.Parse(strValue); 

Czy istnieje jakiś sposób (np przekazując dostawcy formacie lub innej metody), w którym Gwarantuję, że moja procedura analizy będzie działała niezależnie od ustawień regionalnych urządzenia?

+2

Jest to format daty ISO8601, który * nie * zmienia się w zależności od ustawień urządzenia. Przekazywanie kultury nie zaszkodzi, ale opcjonalnie. –

+0

Należy również pamiętać, że wynik któregokolwiek z nich będzie miał wartość '.Kind' z' Nieokreślony' - która może być lub nie jest tym, czego oczekiwałeś. –

Odpowiedz

5

Jeśli chcesz analizować datę niezależnie od lokalizacji użytkownika, a następnie użyć invariant culture:

DateTime d = DateTime.Parse(strValue, CultureInfo.InvariantCulture); 
+0

Tak, twoja odpowiedź zadziała, ale zadziała z każdą kulturą. –

+0

@MartinMulder Nie jest jasne, co masz na myśli. Kod ten będzie zachowywał się tak samo w kontekście każdej kultury: przeanalizuje liczby zgodnie z kulturą niezmienną i zignoruje zasady kultury dla obecnego kontekstu. Wygląda na to, czego chce OP. – cdhowie

+0

Tak, ale to więcej niż chce. Sprawdź moją odpowiedź. Nie ma znaczenia, jakiej kultury używa (en-US, nl-NL, Invaruant itp.). Format, którego używa, jest ZAWSZE poprawnie przetwarzany, więc nie musisz wyraźnie dostarczać kultury. –

1

Skoro masz dokładny format, będę używać non-niejednoznaczne ciąg formatu:

DateTime.ParseExact("2014-04-24T00:00:00", "yyyy\\-MM\\-dd\\THH\\:mm\\:ss", null) 
// or to reduce the C#-escaped backslashes: 
DateTime.ParseExact("2014-04-24T00:00:00", @"yyyy\-MM\-dd\THH\:mm\:ss", null) 

Zliczone łączniki i dwukropki, a także znak zrzeknięcia T oznaczają, że są to wartości stałe. Tak więc ta linia powinna działać niezależnie od innych czynników.

+0

Duże rozwiązanie, podczas gdy "s" byłoby znacznie krótsze! –

+1

Jeśli "s" działa dla Ciebie, idź do niego. Uważam jednak, że przejrzystość jej oznaczania jest przydatna dla każdego, kto przeczyta kod lub rozwiąże problem w przyszłości. Usuwa wszelkie niejasności i nie opiera się na żadnych wbudowanych standardach - po prostu działa i nigdy nie zadziała, a ty nigdy nie będziesz musiał przeglądać dokumentacji, aby dowiedzieć się, dlaczego działa lub nie działa. –

0
string dateString; 
    DateTime dateValue; 

    // Parse a string. 
    dateString = "2014-04-24T00:00:00"; 
    if (DateTime.TryParseExact(dateString, "o", CultureInfo.InvariantCulture, 
       DateTimeStyles.None, out dateValue)) 
    Console.WriteLine("Converted '{0}' to {1} ({2}).", dateString, dateValue, 
      dateValue.Kind); 
+0

Nie powiedzie się, ponieważ format "o" wymaga siedmiu miejsc dziesiętnych ułamkowych sekund. –

1

Tak, można użyć DateTime.ParseExact

string dateString, format; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 

dateString = "2013-04-29T00:00:00"; 
format = "s"; 

result = DateTime.ParseExact(dateString, format, provider); 

Miejsce, w którym ciąg znaków "s" reprezentuje sortowalną datę i godzinę (MSDN na Format Strings)

Powiązane problemy