2017-08-12 15 views
3

例:文字列から日付/時刻を解析して、日付/時刻のコンポーネントを分解したいと思っています。コードはハワードの小数点以下の桁数を取得する方法

std::wistringstream in{ L"2016-12-11 15:43:22.0999919" }; 
date::sys_time<std::chrono::microseconds> tp; 
in >> date::parse(L"%F %T", tp); 
assert(!in.fail()); 
assert(!in.bad()); 

date::sys_days dp = date::floor<date::days>(tp); 
date::year_month_day the_date = date::year_month_day{ dp }; 
date::time_of_day<std::chrono::microseconds> the_time = date::make_time(tp - dp); 
std::cout << the_date << ' ' << the_time << std::endl; 

std::cout << "Year: " << the_date.year() << std::endl; 
std::cout << "Month: " << (unsigned)the_date.month() << std::endl; 
std::cout << "Date: " << the_date.day() << std::endl; 

std::cout << "Hour: " << the_time.hours().count() << std::endl; 
std::cout << "Minutes: " << the_time.minutes().count() << std::endl; 
std::cout << "Seconds: " << the_time.seconds().count() << std::endl; 

//の後に、次の正しくない

std::cout << "Micro Seconds: " << the_time.microseconds().count() << std::endl; 

エラーC2039: 'マイクロ秒':のメンバーではない '日:: TIME_OF_DAY'

+0

何が間違っていますか? – Swift

+0

'microseconds()'は 'date :: time_of_day 'のメンバーではありません –

答えて

1

ああ、ちょうど編集しました。

正解、microsecondsは、date::time_of_dayのメンバーではありません。

time_of_day<std::chrono::duration<Rep, Period>> 
{ 
public: 
    using precision = The decimal-based duration used to format 

    constexpr time_of_day() noexcept; 
    constexpr explicit time_of_day(std::chrono::duration<Rep, Period> since_midnight) noexcept; 

    constexpr std::chrono::hours hours() const noexcept; 
    constexpr std::chrono::minutes minutes() const noexcept; 
    constexpr std::chrono::seconds seconds() const noexcept; 
    constexpr precision subseconds() const noexcept; 
    constexpr unsigned mode() const noexcept; 

    constexpr explicit operator precision() const noexcept; 
    constexpr precision to_duration() const noexcept; 

    void make24() noexcept; 
    void make12() noexcept; 
}; 

私が変更した場合::Durationはサブ秒の精度を持っている場合time_of_day<Duration>ためdocumentationは、この概要を与える

the_time.microseconds().count() 

へ:

the_time.subseconds().count() 

その後、私が手出力は次のようになります。

2016-12-11 15:43:22.099992 
Year: 2016 
Month: 12 
Date: 11 
Hour: 15 
Minutes: 43 
Seconds: 22 
Micro Seconds: 99992 

これはあなたが手に入れたものですか?そうであれば、正しい答えが得られます。あなたがこれを取得していない場合は、見ることを教えてください。バグが発生し、バグレポートを感謝し、できるだけ早く修正しようとしています。

このの場合、正しく表示されていないと思われる場合は、丸めによって混乱することがあります。あなたは7桁の小数点以下の桁を読み、それを小数点以下の6桁に四捨五入することを求めています。あなたは、文字列にタイムスタンプの完全な精度を希望する場合は、例えば、100nsのと少なくとも同じ細かい単位を使用する必要があります:

date::sys_time<std::chrono::nanoseconds> tp; 
// ... 
auto the_time = date::make_time(tp - dp); 
// ... 
std::cout << "Nanoseconds: " << the_time.subseconds().count() << std::endl; 

、出力は今で終了します。

Nanoseconds: 99991900 

更新

より明白名microsecondsとは対照的に名前subsecondsの根拠は、このメンバーのprecision(及び従って戻り型)があまりにもVAであることです分数秒を返すためのより正確な名前を与えるために私のためにried。上記のようにnanosecondsになる可能性があります。それとも、microfortnightsのような狂ったものでもあります。

以下のコメントでこの質問にバグが見つかりました。 microfortnights私はちょうど修正したコンパイル時のエラーを得ました。

+0

これはまさに私が探していたものです。 BTWはこのライブラリに関する質問のための正しいフォーラムですか? –

+0

うれしい私は助けることができます。そして、あなたも私を助けてくれました。あなたの質問に答えて、私はバグを見つけました。それを今すぐ修正して、すぐにその情報で私の答えを更新します。 –

+0

私の日付のlibについての質問は、大丈夫です。また、問題リストやジッターチャットなどのGitHubサイトにも機能があります。あなたが慣れているものは何でも私と同じです。 –

関連する問題