web-dev-qa-db-ja.com

Windowsではstrptime()と同等ですか?

Windowsで利用できるstrptime()の同等の実装はありますか?残念ながら、このPOSIX関数は使用できないようです。

strptimeのオープングループの説明 -要約:_"MM-DD-YYYY HH:MM:SS"_などのテキスト文字列を_tm struct_に変換します。これはstrftime()の反対です。

38
An̲̳̳drew

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);
17
Adam Rosenfield

コードを移植したり、プロジェクトを後押ししたりしない場合は、次のようにします。

  1. sscanfを使用して日付を解析します
  2. 次に、整数をstruct tmにコピーします(月から1を減算し、年から1900を減算します。月は0〜11で、年は1900から始まります)
  3. 最後に、mktimeを使用してUTCエポック整数を取得します

struct tmisdstメンバーを-1に設定することを忘れないでください。そうしないと、夏時間の問題が発生します。

30
amwinter

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を直接呼び出すように切り替えることはできない場合があることに注意してください。

16
Orvid King

これは仕事をします:

#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です。

13
ravenspoint