2015-08-14 15 views
11

Próbuję parsować ciąg daty i czasu i umieścić wynik w strukturze std :: tm. Poniżej znajduje się kod,jest to błąd w std :: get_time?

#include <iomanip> 
#include <ctime> 
#include <sstream> 
#include <string> 

std::stringstream ss; 
struct std::tm when; 

ss.str("8/14/2015 3:04:23 PM"); 
ss >> std::get_time(&when, "%m/%d/%Y %r"); 

Po uruchomieniu tego kodu spowoduje when.tm_hour jest 27. Jest to błąd, czy zrobiłem coś złego?

Używam Visual Studio 2013 na Windows 7.

Dzięki.

+0

dziwne, nie mogę się, że do pracy w g ++ w ogóle i Ideone się niepowodzeniem do analizowania podstawowe daty i godziny. Ciekawi mnie, co tu się dzieje. – templatetypedef

+1

Clang/libC++ mówi, że 15. GCC/libstdC++ nie parsuje. To jest fajne. –

+0

Spróbuj wczytać inne ustawienia narodowe przed 'get_time'. tj. 'ss.imbue (std :: locale (" en_US "));' Nie jestem pewien, które locale obsługuje system Windows lub czy oczekuje on 'en-US' vs.' en_US'. Być może będziesz musiał się pobawić, aby je znaleźć. –

Odpowiedz

3

Uruchomiona w błąd w implementacji Microsoftu funkcji std::num_get::do_get, a konkretnie odcinka który analizuje AM/PM (%p) część czasu:

case 'p': 
     _Ans = _Getloctxt(_First, _Last, (size_t)0, ":AM:am:PM:pm"); 
     if (_Ans < 0) 
      _State |= ios_base::failbit; 
     else 
      _Pt->tm_hour += _Ans * 12; 
     break; 

Problemem jest to, że _Getloctxt zwraca int w zakresie [0,3], a nie w spodziewanym zakresie [0,1].

Ten błąd został zgłoszony do firmy Microsoft (ID: 808162), którzy twierdzą, że mają ustalone to w Visual Studio 2015.

+0

Wygląda na to, że może zawieść również z 'Am' lub' Pm', ponieważ wydaje się, że rozróżniana jest wielkość liter. –

+0

Dobra uwaga. Użycie 'Am' lub' Pm' powoduje ustawienie 'failbit' strumieni. Jak na ironię, użycie 'Am' faktycznie powoduje ustawienie właściwego czasu, w przeciwieństwie do' am'. –

+0

Dzięki Andrzej, że odpowiedział na moje pytanie. –

Powiązane problemy