
An̲̳̳ zeichnete
Gibt es eine gute gleichwertige Implementierung von strptime()
für Windows verfügbar? Leider scheint diese POSIX-Funktion nicht verfügbar zu sein.
Öffnen Sie die Gruppenbeschreibung von strptime – Zusammenfassung: Es konvertiert eine Textzeichenfolge wie z "MM-DD-YYYY HH:MM:SS"
in ein tm struct
das Gegenteil von strftime()
.

amwinter
Wenn Sie keinen Code portieren oder Ihr Projekt zum Boosten verurteilen möchten, können Sie dies tun:
- Analysieren Sie das Datum mit
sscanf
- Kopieren Sie dann die ganzen Zahlen in a
struct tm
(subtrahieren Sie 1 vom Monat und 1900 vom Jahr – Monate sind 0-11 und Jahre beginnen im Jahr 1900)
- endlich nutzen
mktime
um eine UTC-Epochen-Ganzzahl zu erhalten
Denken Sie daran, die einzustellen isdst
Mitglied von struct tm
auf -1, sonst haben Sie Probleme mit der Sommerzeit.

Orvid König
Angenommen, Sie verwenden Visual Studio 2015 oder höher, können Sie dies als Drop-In-Ersatz für strptime verwenden:
#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());
}
Beachten Sie nur, dass für plattformübergreifende Anwendungen std::get_time
wurde erst mit GCC 5.1 implementiert, also Umstellung auf Calling std::get_time
direkt ist vielleicht keine Option.
Eine Open-Source-Version (BSD-Lizenz) von strptime()
finden Sie hier: http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=HEAD
Sie müssen die folgende Deklaration hinzufügen, um sie zu verwenden:
char *strptime(const char * __restrict, const char * __restrict, struct tm * __restrict);
Das macht die Arbeit:
#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 );
Beachten Sie jedoch, dass die Eingabezeichenfolge YYYY-MM-DD ist
Eine Alternative ist die Verwendung GetSystemTime
und senden Sie die Zeitinformationen an eine Funktion, die sie gemäß Ihrem Format analysiert vsnprintf_s
. Im Beispiel unten gibt es eine Funktion, die eine Zeitzeichenfolge mit Millisekunden-Präzision erstellt. Anschließend sendet es die Zeichenfolge an eine Funktion, die sie gemäß dem gewünschten Format formatiert:
#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);
}
9862100cookie-checkstrptime()-Äquivalent unter Windows?yes
Es würde helfen, wenn Sie eine Beschreibung von strptime hinzufügen, damit ich es nicht googeln muss 🙂
– JaredPar
26. November 2008 um 19:21 Uhr