std::time_get get_date
それが何世紀であるかを知る方法はありますか?1900年より前の日付を扱います。これを可能にするより良いC++日時ライブラリはありますか?いくつかの文化を扱う社内ソリューションがありますが、get_date
すべての文化を処理しているように見えるので、最後の手段としてすべてをキャッチするのに適しています...
2 に答える
Boost.Gregorianを見てみることができます
C++11 環境 (少なくとも std::lib 実装) がある場合は、新しいstd::get_time
マニピュレーターを利用できます。
template <class charT>
unspecified
get_time(struct tm* tmb, const charT* fmt);
例えば:
#include <iomanip>
#include <sstream>
#include <iostream>
#include <ctime>
int
main()
{
std::istringstream infile("1799-03-03");
std::tm tm = {0};
infile >> std::get_time(&tm, "%Y-%m-%d");
std::cout << tm.tm_year + 1900 << '\n';
}
これにより、次のように出力されます。
1799
%Y
変換指定子は、「10 進数としての年 (例: 1997)」として指定されます。に格納するstd::tm
と、1900 年を過ぎた年数になりますが、値は によって保持され、int
負数を受け入れます。
変換指定子の完全なセットは、C++11 によって、ISO/IEC 9945 関数で有効なセットとして指定されていますstrptime
。
フル機能の日付ライブラリを探しているなら、boost::datetime
Rapptz が言及したのは良い提案です。
C++ 委員会に提案され、却下された単一のヘッダーと単一のソースである、私の個人的な日付ライブラリを使用することも歓迎します。ソースはまだ名前空間 std::chrono にあるので (提案目的で)、それを使用する場合は名前空間を変更する必要があります。 これは、ライブラリを文書化し、単一のヘッダーとソースの実装にリンクする提案です。
上記の例を翻訳すると、次のようになります。
#include "date"
#include <iostream>
#include <sstream>
int
main()
{
std::istringstream infile("1799-03-03");
std::chrono::date date;
infile >> date;
std::cout << date.year() << '\n';
}
再び出力します:
1799
実装されたこのライブラリは、入力用の C++11 マニピュレータにも依存しstd::get_time
、I/O 変換指定子 (リンクされた提案で指定) を変更するためのオプションが含まれています。