2015-08-14 12 views
11

मैं डेट-टाइम स्ट्रिंग को पार्स करने का प्रयास कर रहा हूं और परिणाम को std :: tm संरचना में डाल सकता हूं। नीचे दिए गए कोड है, कोड चलानेयह 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"); 

के बाद, when.tm_hour 27. यह एक बग है, या मैंने कुछ गलत किया?

मैं खिड़कियों पर विजुअल स्टूडियो 2013 का उपयोग कर रहा 7.

धन्यवाद।

+0

अजीब है, मैं उस ++ सब पर जी में काम करने के लिए नहीं मिल सकता है और Ideone पार्स करने के लिए विफल हो रहा है मूल तिथियां और समय। मैं उत्सुक हूं कि यहां क्या हो रहा है। – templatetypedef

+1

क्लैंग/libC++ कहते हैं 15. जीसीसी/libstdC++ पार्स करने में विफल रहता है। यह मजेदार है। –

+0

'get_time' से पहले एक अलग लोकेल को इम्बोइंग करने का प्रयास करें। यानी 'ss.imbue (std :: locale (" en_US ")); 'मुझे यकीन नहीं है कि विंडोज कौन से स्थानीय विंडोज का समर्थन करता है, या यदि यह' एन-यूएस 'बनाम' en_US' की अपेक्षा करता है। आपको एक खोजने के लिए चारों ओर खेलना पड़ सकता है। –

उत्तर

3

आप std::num_get::do_get समारोह के माइक्रोसॉफ्ट के कार्यान्वयन, विशेष खंड जो AM/PM (%p) समय के भाग को पार्स करता है में एक बग में चल रहे हैं:

_Getloctxt किसी पूर्णांक रिटर्न
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; 

समस्या है कि सीमा [0,3] में और अपेक्षित सीमा [0,1] में नहीं।

इस बग माइक्रोसॉफ्ट (आईडी: 808162) को सूचित कर दिया गया है जो यह दावा दृश्य स्टूडियो में यह तय कर दी है करने के लिए 2015

+0

ऐसा लगता है कि यह 'एम' या' पीएम' के साथ भी असफल हो सकता है, क्योंकि यह मामला संवेदनशील लगता है। –

+0

अच्छा बिंदु। 'एम' या' पीएम 'का उपयोग करने से धाराओं को' विफलता 'सेट किया जा सकता है। विडंबना यह है कि, 'एम' का उपयोग वास्तव में सही समय में सेट किया जा रहा है, 'am' के विपरीत। –

+0

धन्यवाद एंड्रयू, जिसने मेरे प्रश्न का उत्तर दिया। –

संबंधित मुद्दे