18

年/月/日の値を印刷または抽出したいと思います。

2038年問題があるので使いたくないのですtime_tが、インターネットで見つけた例はすべてそれを使っtime_pointtm.

time_point から tm に変換する簡単な方法はありますか (できれば boost なし)?


libcのtimesubのような実装は、私の最後の手段です: http://www.opensource.apple.com/source/Libc/Libc-262/stdtime/localtime.c


編集:提案されたリンクを読み、さらに調査を行った後、次の結論に達しました。

  1. 64 ビット長の time_t を使用しても問題ありません (ほとんどの場合)。
  2. 移植可能なコードに Boost.Date_Time を使用します。

Boost.Date_Time がヘッダーのみのライブラリになる可能性があることは注目に値します。ソース: http://www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.html#header-only-libraries

4

3 に答える 3

4

に基づく C ライブラリ関数を除いて、標準ライブラリでカレンダーの日付をサポートするものは何もありませんtime_t

オプションは、私の好みの順序で次のとおりです。

  • Boost.Date_Time、あなたが避けたいと言う
  • 他のサードパーティの日付/時刻ライブラリ (Boost を使用するため、推奨事項はありません)
  • のオープンソース実装を変更するgmtime()
  • 正しいことを確認してから、このアルゴリズムを使用してください。
于 2013-05-27T12:50:22.443 に答える
1

Howard Hinnant の日付ライブラリを使用して、 からtime_pointに変換する関数を作成しましたstruct tm

template <typename Clock, typename Duration>
std::tm to_calendar_time(std::chrono::time_point<Clock, Duration> tp)
{
    using namespace date;
    auto date = floor<days>(tp);
    auto ymd = year_month_day(date);
    auto weekday = year_month_weekday(date).weekday_indexed().weekday();
    auto tod = make_time(tp - date);
    days daysSinceJan1 = date - sys_days(ymd.year()/1/1);

    std::tm result;
    std::memset(&result, 0, sizeof(result));
    result.tm_sec   = tod.seconds().count();
    result.tm_min   = tod.minutes().count();
    result.tm_hour  = tod.hours().count();
    result.tm_mday  = unsigned(ymd.day());
    result.tm_mon   = unsigned(ymd.month()) - 1u; // Zero-based!
    result.tm_year  = int(ymd.year()) - 1900;
    result.tm_wday  = unsigned(weekday);
    result.tm_yday  = daysSinceJan1.count();
    result.tm_isdst = -1; // Information not available
    return result;
}

これによりtime_t、32 ビット システムに潜んでいる Y2038 問題が効果的に回避されます。この関数は、このGitHub wikiに寄稿されています。他の人が他の有用な例やレシピに寄稿してくれることを願っています。

于 2015-07-31T22:08:00.390 に答える