最終更新日時:
が更新

履歴 編集

function template
<iomanip>

std::get_time(C++11)

namespace std {
  template <class CharT>
  unspecified get_time(struct tm* tmb, const CharT* fmt); // (1) C++11
}

概要

日時書式から入力する。

要件

  • tmbは、有効なtm型オブジェクトを指すポインタであること。
  • fmtは、char_traits<CharT>::length(fmt)個の要素を持つ、有効なCharT型の配列を指すポインタであること。

戻り値

未規定の型のオブジェクトを返す。inbasic_istream<CharT, Traits>型のオブジェクトとして、式in >> get_time(tmb, fmt)は以下の関数ff(in, tmb, fmt)と呼び出したかのように振る舞う:

template <class CharT, class Traits>
void f(basic_ios<CharT, Traits>& str, struct tm* tmb, const CharT* fmt)
{
  using Iter    = istreambuf_iterator<CharT, Traits>;
  using TimeGet = time_get<CharT, Iter>;

  ios_base::iostate err = ios_base::goodbit;
  const TimeGet& tg = use_facet<TimeGet>(str.getloc());

  tg.get(Iter(str.rdbuf()), Iter(), str, err, tmb,
         fmt, fmt + Traits::length(fmt));

  if (err != ios_base::goodbit)
    str.setstate(err);
}

in >> get_time(tmb, fmt)は、basic_istream<CharT, Traits>&型を持ち、その値はinである。

備考

fmtに指定する書式はstd::strftime()と同じものであり、どの書式指定子が扱えるかはストリームに設定されているロケールのtime_getファセットに依存する。

tmbが指すオブジェクトのうち、書式に現れなかったメンバは変更されない。そのため、あらかじめ値初期化しておくとよい。

この関数は書式化入力関数として振る舞う。

#include <iostream>
#include <iomanip>
#include <sstream>
#include <ctime>

int main()
{
  std::istringstream ss("2014-12-25 15:12:30");

  std::tm t{};
  ss >> std::get_time(&t, "%Y-%m-%d %H:%M:%S");

  if (ss.fail()) {
    std::cout << "parse error" << std::endl;
  }
  else {
    std::cout << t.tm_year + 1900 << '/' << t.tm_mon + 1 << '/' << t.tm_mday << std::endl;
    std::cout << t.tm_hour << ':' << t.tm_min << ':' << t.tm_sec << std::endl;
  }
}

出力

2014/12/25
15:12:30

バージョン

言語

  • C++11

処理系

関連項目

参照