3

std::time_get get_dateそれが何世紀であるかを知る方法はありますか?1900年より前の日付を扱います。これを可能にするより良いC++日時ライブラリはありますか?いくつかの文化を扱う社内ソリューションがありますが、get_dateすべての文化を処理しているように見えるので、最後の手段としてすべてをキャッチするのに適しています...

4

2 に答える 2

3

Boost.Gregorianを見てみることができます

于 2013-02-01T22:51:13.117 に答える
1

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::datetimeRapptz が言及したのは良い提案です。

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 変換指定子 (リンクされた提案で指定) を変更するためのオプションが含まれています。

于 2013-03-03T23:38:50.607 に答える