5

現在のUTCオフセットを取得するにはどうすればよいですか(タイムゾーンの場合と同様ですが、現在の瞬間のUTCオフセットのみ)。

「+02:00」のような答えが必要です。

4

2 に答える 2

15

この質問には2つの部分があります。

  1. UTCオフセットをboost::posix_time::time_duration
  2. 指定どおりにフォーマットtime_durationします

明らかに、ローカルタイムゾーンの取得は、広く実装されているAPIではあまり公開されていません。ただし、次のように、UTCを基準にしたモーメントと、現在のタイムゾーンを基準にした同じモーメントの差をとることで取得できます。

boost::posix_time::time_duration get_utc_offset() {
    using namespace boost::posix_time;

    // boost::date_time::c_local_adjustor uses the C-API to adjust a
    // moment given in utc to the same moment in the local time zone.
    typedef boost::date_time::c_local_adjustor<ptime> local_adj;

    const ptime utc_now = second_clock::universal_time();
    const ptime now = local_adj::utc_to_local(utc_now);

    return now - utc_now;
}

指定されたようにオフセットをフォーマットすることは、権利を吹き込むことの問題ですtime_facet

std::string get_utc_offset_string() {
    std::stringstream out;

    using namespace boost::posix_time;
    time_facet* tf = new time_facet();
    tf->time_duration_format("%+%H:%M");
    out.imbue(std::locale(out.getloc(), tf));

    out << get_utc_offset();

    return out.str();
}

これでget_utc_offset_string()、目的の結果が得られます。

于 2010-10-04T10:54:03.423 に答える
4

C ++ 11以降、chronoおよびstd :: put_time:を使用できます。

#include <chrono>
#include <iomanip>
#include <iostream>
int main ()
{

  using sc = std::chrono::system_clock;
  auto tm = sc::to_time_t(sc::now());

  std::cout << std::put_time(std::localtime(&tm), "formatted time: %Y-%m-%dT%X%z\n");

  std::cout << "just the offset: " << std::put_time(std::localtime(&tm), "%z\n");

}

これにより、次の出力が生成されます。

フォーマットされた時間:2018-02-15T10:25:27 + 0100

オフセットのみ:+0100

于 2018-02-15T09:26:59.660 に答える