Windowsで利用できるstrptime()
の同等の実装はありますか?残念ながら、このPOSIX関数は使用できないようです。
strptimeのオープングループの説明 -要約:_"MM-DD-YYYY HH:MM:SS"
_などのテキスト文字列を_tm struct
_に変換します。これはstrftime()
の反対です。
strptime()
のオープンソースバージョン(BSDライセンス)は、次の場所にあります。 http://cvsweb.netbsd.org/bsdweb.cgi/src/lib /libc/time/strptime.c?rev=HEAD
それを使用するには、次の宣言を追加する必要があります。
char *strptime(const char * __restrict, const char * __restrict, struct tm * __restrict);
コードを移植したり、プロジェクトを後押ししたりしない場合は、次のようにします。
sscanf
を使用して日付を解析しますstruct tm
にコピーします(月から1を減算し、年から1900を減算します。月は0〜11で、年は1900から始まります)mktime
を使用してUTCエポック整数を取得しますstruct tm
のisdst
メンバーを-1に設定することを忘れないでください。そうしないと、夏時間の問題が発生します。
Visual Studio 2015以降を使用していると仮定すると、これを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());
}
クロスプラットフォームアプリケーションの場合、std::get_time
はGCC 5.1まで実装されなかったため、std::get_time
を直接呼び出すように切り替えることはできない場合があることに注意してください。
これは仕事をします:
#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 );
ただし、入力文字列はYYYY-MM-DDです。