2017-08-12 4 views
3

Exemple: l'analyse date/heure de la chaîne, puis je veux décomposer les composants de la date/heure .. Il semble que je reçois tout mais je suis coincé sur les secondes fractionnaires. Code suitComment obtenez-vous secondes fractionnaires de Howard Hinnant date

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; 

// suit est incorrect

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

erreur C2039: '' microsecondes: n'est pas un membre de la 'Date :: TIME_OF_DAY'

+0

qu'est-ce qui est incorrect? – Swift

+0

'microseconds()' n'est pas membre de 'date :: time_of_day ' –

Répondre

1

Ah, juste obtenu l'édition .

Correct, microseconds n'est pas un membre de date::time_of_day. Le documentation pour time_of_day<Duration> donne ce résumé lorsque Duration a sous-seconde précision:

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; 
}; 

Si je change:

the_time.microseconds().count() 

à:

the_time.subseconds().count() 

Ensuite, la sortie que je reçois est:

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

Est-ce ce que vous obtenez? Si c'est le cas, vous obtenez la bonne réponse. Si vous n'obtenez pas ceci, s'il vous plaît dites-nous ce que vous sont voir. Des bugs surviennent, et j'apprécie les rapports de bogues et j'essaie de les corriger le plus rapidement possible.

Si ce est ce que vous voyez, et vous ne le croyez pas correct, vous pouvez être dérouté par l'arrondissement. Vous lisez 7 chiffres décimaux décimaux, puis vous demandez que cela soit arrondi à 6 chiffres décimaux décimaux. Si vous désirez la pleine précision de l'horodatage dans la chaîne, vous aurez besoin d'utiliser une unité au moins aussi fine que 100ns, par exemple:

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

Et la sortie se termine maintenant avec:

Nanoseconds: 99991900 

Mise à jour

la raison pour laquelle le nom subseconds par opposition au nom plus évidente est que le microsecondsprecision (et donc le type de retour) de ce membre est trop va Ried pour moi de donner un nom plus précis pour retourner les secondes fractionnaires. Cela pourrait être nanoseconds comme démontré ci-dessus. Ou il pourrait même être quelque chose de fou comme microfortnights.

Dans les commentaires ci-dessous lorsque j'ai noté que cette question a trouvé un bug. Il s'avère que quand j'ai essayé d'analyser microfortnights j'ai eu une erreur de compilation, que je viens de corriger.

+0

C'est exactement ce que je cherchais. BTW est donc le bon forum pour les questions sur cette bibliothèque? –

+0

Je suis heureux d'avoir pu aider. Et tu m'as aidé aussi. En répondant à votre question, j'ai trouvé un bug. Fixer maintenant, et mettra à jour ma réponse avec cette information sous peu. –

+0

SO est bien pour les questions sur ma date lib. Il y a aussi des installations sur le site GitHub telles que la liste des problèmes et le chat gitter. Tout ce que vous êtes à l'aise est bien avec moi. –