2008-11-26 16 views

Odpowiedz

14

ta spełnia swoje zadanie :

#include "stdafx.h" 
#include "boost/date_time/posix_time/posix_time.hpp" 
using namespace boost::posix_time; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::string ts("2002-01-20 23:59:59.000"); 
    ptime t(time_from_string(ts)); 
    tm pt_tm = to_tm(t); 

Zauważ jednak, że ciąg wejściowy jest YYYY-MM-DD

+2

+1 za wskazanie rozwiązania wieloplatformowego. – stinky472

28

Jeśli nie chcesz portu dowolnego kodu lub potępiać swój projekt, aby zwiększyć, można to zrobić:

  1. analizowania datę używając sscanf
  2. skopiuj liczby całkowite w struct tm (odjąć 1 od miesiąc i 1900 z roku - miesiąc i rok są 0-11 rozpocznie się w 1900 roku)
  3. wreszcie korzystać mktime aby uzyskać liczbę całkowitą UTC epoki

Wystarczy pamiętać, aby ustawić o isdst użytkownika f struct tm do -1, lub będziesz mieć problemy z oświetleniem dziennym.

+3

Pamiętaj, że 'mktime' działa z datami w zakresie około 1970 ~ 2038, ale możesz użyć [' _mktime64'] (http://msdn.microsoft.com/en-us/library/d1y53h2a%28v=vs.80 % 29.aspx), który działa z datami w zakresie 1970 ~ 3000 :) – LihO

+1

Czasami warto wypełniać 'isdst' z jego bieżącą wartością, można uzyskać to za pomocą' localtime (& current_time) -> tm_isdst; ', gdzie' current_time 'jest bieżącym czasem w formacie' time_t', zwracanym przez 'time (& current_time)'. – user

-3

Jedną z opcji jest użycie GetSystemTime i wysłanie informacji o czasie do funkcji, która analizuje je zgodnie z formatem, używając vsnprintf_s. W poniższym przykładzie jest jedna funkcja, która tworzy ciąg czasu z milli sekundą dokładności . Następnie wysyła ciąg do funkcji, która formatuje je zgodnie z żądanym formacie:

#include <string> 
#include <cstdio> 
#include <cstdarg> 
#include <atlstr.h> 

std::string FormatToISO8601 (const std::string FmtS, ...) { 
    CStringA BufferString; 
    try { 
     va_list VaList; 
     va_start (VaList, FmtS); 
     BufferString.FormatV (FmtS.c_str(), VaList); 
    } catch (...) {} 
    return std::string (BufferString); 
} 

void CreateISO8601String() { 
    SYSTEMTIME st; 
    GetSystemTime(&st); 
    std::string MyISO8601String = FormatToISO8601 ("%4u-%02u-%02uT%02u:%02u:%02u.%03u", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); 
} 
+0

Masz rzeczy do tyłu. Pytanie dotyczy sposobu konwersji ** reprezentacji łańcuchowej ** na 'struct tm', podczas gdy przedstawiłeś (słabą) implementację [strftime] (https://msdn.microsoft.com/en-us /library/fe06s4ak.aspx). – IInspectable

11

Zakładając, że używasz Visual Studio 2015 lub powyżej, można to wykorzystać jako zamiennik dla strptime:

#include <time.h> 
#include <iomanip> 
#include <sstream> 

extern "C" char* strptime(const char* s, 
          const char* f, 
          struct tm* tm) { 
    // Isn't the C++ standard lib nice? std::get_time is defined such that its 
    // format parameters are the exact same as strptime. Of course, we have to 
    // create a string stream first, and imbue it with the current C locale, and 
    // we also have to make sure we return the right things if it fails, or 
    // if it succeeds, but this is still far simpler an implementation than any 
    // of the versions in any of the C standard libraries. 
    std::istringstream input(s); 
    input.imbue(std::locale(setlocale(LC_ALL, nullptr))); 
    input >> std::get_time(tm, f); 
    if (input.fail()) { 
    return nullptr; 
    } 
    return (char*)(s + input.tellg()); 
} 

Należy pamiętać, że w przypadku aplikacji wieloplatformowych std::get_time nie został zaimplementowany do GCC 5.1, więc przełączanie się na wywoływanie std::get_time bezpośrednio może nie być możliwe.

+0

Dzięki za kopiowanie. –

+1

ale std :: get_time jest uszkodzony na VS2015 [tutaj] (http://stackoverflow.com/questions/35041344/trying-to-use-stdget-time-to-parse-yymmdd-and-failing#comment69466398_35041344) – dashesy

+0

It nie jest zepsuty; to, co próbowali zrobić, nie działa również z GCC lub Clang, i chociaż nie testowałem tego specjalnie, prawdopodobnie nie będzie działać również ze strptime. –