2016-12-13 9 views
0

Pythonでは、私はタイムゾーンの間で変換するために次のことをしています。それは夏時間の調整も担当しているので、私はそれについて心配する必要はありません。夏時間について心配することなく、C++でこれを行う方法は何ですか?同等のC++タイムゾーン変換ですか?

import datetime 
from pytz import timezone 

# Create timezones 
londontz = timezone("Europe/London") 
nyctz = timezone("US/Eastern") 

# Set today as 5pm London time 
today = datetime.date.today() 
time = datetime.time(17, 0, 0) 
londondt = londontz.localize(datetime.datetime.combine(today, time)) 

# Convert the London close time to NYC time (this will auto-adjust for DST) 
nycdt = londondt.astimezone(nyctz) 
+3

日付/時刻ライブラリを入手して、それをあなたのために処理させてください。 – NathanOliver

+0

localtimeとtzsetを見てください。 – cup

+0

.NETを使用して開発している場合、datetimeを処理するためのTimeZoneInfoクラスを参照してください。 –

答えて

1

C++には、この種の機能は標準ライブラリには含まれていません(まだ、とにかく)。

それでも可能な限り、これをライブラリに残しておきます。そのライブラリは実際のアルゴリズムとしてすべてを正しくモデリングすることは本質的に不可能なので、実際には実際の作業をデータベースに委託します。

あなたが求めているところでは、Howard Hinnant's date libraryが最初の選択肢になります。

#include "tz.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    using namespace std::chrono; 

    // Set today as 5pm London time 
    auto londontz = locate_zone("Europe/London"); 
    auto today = floor<days>(make_zoned(londontz, 
             system_clock::now()).get_local_time()); 
    auto londondt = make_zoned(londontz, today + 17h); 

    // Convert the London close time to NYC time (this will auto-adjust for DST) 
    auto nycdt = make_zoned("US/Eastern", londondt); 

    // print it out 
    std::cout << "London : " << londondt << '\n'; 
    std::cout << "New York: " << nycdt << '\n'; 
} 

まず最初に行うには、「today」を見つけることです「ヨーロッパ/ロンドン」によると:

+0

gotcha、ありがとう。私は標準ライブラリを使うことしかできないでしょう。 – holtc

+0

@holtc 5ドルは、Howard Hinnantが合理的に可能な限り標準ライブラリの近くに固執していると言います。何らかの理由で自分のライブラリを直接使用することはできないとしても、おそらくそのライブラリからアイデアを得ることができます。 – user4581301

+1

@holtc:その場合、あなたは彼のライブラリを複製することにかなり悩まされています。私は代わりに彼のコードを使用する許可を得るために懸命に働いています。この機能は、現時点ではC++標準ライブラリには存在しません。標準ライブラリに追加されている場合は、インタフェースが彼のライブラリに基づいている可能性があります(あなたがそれを認識していない場合には、ハワードはC++委員会の図書館ワーキンググループの議長を務めましたが、委員会で)。 –

1

FWIWは、ここでの構文Howard Hinnant's library(MITオープンソースライセンス)は、この問題のために使用しています。これは、現在の時刻を取得し、それをロンドンの現在時刻に変換し、現在の現地時刻を現在の現地時刻(floor<days>())に切り詰めることによって行われます。

todayが一度確立されると、それに17時間を追加するのは非常に簡単です。

nycdtlondondtから構築することも非常に簡単です。私にとって

これだけ出力:

London : 2016-12-13 17:00:00 GMT 
New York: 2016-12-13 12:00:00 EST 

は、私は元のコードの厳格な翻訳は、コンピュータのローカルの日付としてtodayを定義することに注意してください。それも可能です:

ある
auto today = floor<days>(make_zoned(current_zone(), 
            system_clock::now()).get_local_time()); 

は、特定のタイムゾーンの代わりにcurrent_zone()を使用しています。しかし、私の最高の推測は、current_zone()の使用は実際には例の論理エラーであるということです。このライブラリは、このような論理エラーを見つけて簡単に修正するのに役立ちます。

数十年前に設計されたpre-multithreading C APIにstd :: libだけのドロップダウンを含むソリューション。コンピュータのタイムゾーンをロンドンに変更し、そのローカルとUTCの間の変換を行ってから、コンピュータのタイムゾーンをNYに変更し、ローカルとUTCの間の変換を行う必要があります。そのエラーが発生しやすいだけでなく、現在のローカルタイムゾーンに応じてスレッドが複数ある場合はスレッドセーフではありません。さらに、古いC APIを使って "ヨーロッパ/ロンドン"と "US/Eastern"を指定することも、本当に標準的な方法ではありません。 POSIX拡張機能を使用することができます。