2016-06-17 8 views
1

私は現在の日/月/年の時間:分:秒を取得したい C++は、このような簡単な問題になると、かなり嫌です(よく、それ自体です)。C++は現在の日付を取得します

私はすべてインターネットを検索しましたが、私が得ることができるのは廃止予定のc関数または関数がスレッドセーフであることです。私は、このような方法を見つけました:

std::time_t const now_c = std::time(0); 
auto strTime = std::put_time(std::localtime(&now_c), "%F %T"); 

はしかし、私もそれをコンパイルできるように

#pragma warning(disable : 4996) 

を使用する必要があります(Visual Studioは言う:エラーC4996: 'をlocaltimeの':この機能をか

現在の日付は、機能しなくても効率的で賢明なC++の方法で、現代の日付を取得するにはどうすればよいですか?

+1

この優れた[C++ 11 onwards date library](https://github.com/HowardHinnant/date)を調べることをおすすめします。 – ArchbishopOfBanterbury

+0

[std :: tm](http://en.cppreference.com/w/cpp/chrono/c/tm)がお手伝いできますか?ローカル時間が廃止予定だと知っていますが、それはC++ 11に準拠しています – kirinthos

+3

'localtime'は何らかの形で廃止されることはなく、単にMicrosoftによって「安全でない」とみなされます。それに同意しない場合は、プロジェクトのマクロに '_CRT_SECURE_NO_WARNINGS'を追加してください。 –

答えて

2

std::localtimeは、非推奨単にマイクロソフトのコンパイラによる「安全でない」と呼び、

#define _CRT_SECURE_NO_WARNINGS 
1

どのように私は非推奨ではない、エレガント、作業中に現在の日付を取得しない、効率的な、良識を避けるために、これを適用していませんとC + +の方法ですか?ここで

あなたはコメントでArchbishopOfBanterbury言及free, open-source C++11/14 libraryを使用してこれを行う方法は以下のようになります

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

int 
main() 
{ 
    auto const now = date::make_zoned(date::current_zone(), 
             std::chrono::system_clock::now()); 
    auto strTime = date::format("%F %T", now); 
} 

これはスレッドセーフであり、その基盤として、現代のC++ 11月14日<chrono>ライブラリを使用しています。これにより、精度はsystem_clock::time_point(VSの100ns)の精度で出力されます。あなたは秒にそれを切り捨てることを好む場合は、そのは、そのように実現されます。

using namespace std::chrono; 
using namespace date; 
auto const now = make_zoned(current_zone(), floor<seconds>(system_clock::now())); 
auto strTime = format("%F %T", now); 

あなたはどこか別のローカルタイムを取得したい場合は、単にcurrent_zone()の代わりに、その時間帯のためにIANA nameを入力します。

auto const now = make_zoned("Europe/London", floor<seconds>(system_clock::now())); 
関連する問題