C++ ako naformátovať std::chrono::system_clock::time_point?

Robím si triedu, ktorá by mala zvládať všetky bežné úkony a konverzie dátumu a času. Pôvodne som si jednu triedu napísal, ale postavil som ju nad štruktúrou tm, ktorú som prasiacky podedil do public časti (urobil som to koli možnosti implicitnej konverzie) a rozšíril ju o helper metódy.

Dedenie premenných, tak aby boli prístupné z vonku nepovažujem za čisté riešenie (imho premenné do public časti nepatria (ak nejde o options objekt), lebo sa tým porušuje zapúzdrenie... takže som dedičnosť chcel nahradiť kompozíciou. A z tm urobiť private member.

narazil som, ale aj na vážnejší technický problém. štruktúra tm má najmenšiu jednotku sekunda. Takže ak DateTime postavím na tm s menším intervalom ako sekunda si neporadí. Rozhodol som s teda, že to celé prepíšem a postavím to nad:

std::chrono::system_clock::time_point a std::chrono::system_clock

ten  si pordí fakt s maličkými intervalmi, akurát nevidím spôsob ako čas naformátovať na string (okrem manuálnej konverzie). C++ 20 by malo obsahovať std::chrono::format akurát moja preview draft verzia C++ 20 std::chrono::format zatiaľ neobsahuje. Ako teda std::chrono::system_clock::time_point prekonvertovať na string ak nemám k dispozícii std::chrono::format? Vygooglil som si nejaké príklady ktoré ale používajú konverziu na tm tomu sa práve chcem vyhnúť. Lebo potom vlastne tým std::chrono::system_clock::time_point nič nezískam . Takže prosím o radu akým spôsobom naformátovať  std::chrono::system_clock::time_point (alebo v horšom prípade aspoň time_t) na string (alebo const char*)? Ale aby sa dala používať presnosť na milisekundy prípadne ešte menej?


RDa

  • *****
  • 2 465
    • Zobrazit profil
    • E-mail
Re:C++ ako naformátovať std::chrono::system_clock::time_point?
« Odpověď #1 kdy: 26. 12. 2020, 01:22:24 »
Ad "bezne ukony" - kdyz mas DT precision nastavenej jinej nez sekundu (cca enum rok/mesic/den/hodina/minuta/sekunda/ms/us/ns), tak tva trida konverti na string (napr. dle ISO) jako kratsi, nebo s 00, nebo se zastupnym znakem? :)

(tohle je jeden z duvodu pro me mit vlastni tridu na cas - aby sla definovat presnost)

Btw C++ neumi nic mezi private a public? Ja jedu tedy PHP a tam mame "protected", coz je pristupno pro blizke tridy, ale ne pro externi kod.

nula

Re:C++ ako naformátovať std::chrono::system_clock::time_point?
« Odpověď #2 kdy: 26. 12. 2020, 09:56:55 »
Pred c++20 bohuzel nic ve stl neni. A to co je ve 20 jsem tbh nezkousel(a ani si nebyl jisty, ze se to tam dostalo).

Nicmene, co se tyka praci s datumem. Je tady od toho knihovna: https://github.com/HowardHinnant/date
Ma u toho dokumentaci, ale i prednasku ze cppconu, na to se oplati kouknout.

Ono to neni az tak uplne jednoduche, si to delat sam, kvuli vsech moznych prestupnych casovych useku(nejen obcas 29. unor. Je treba pocitat napriklad s prestupnyma sekundama).

nula

Re:C++ ako naformátovať std::chrono::system_clock::time_point?
« Odpověď #3 kdy: 26. 12. 2020, 10:41:41 »
Jinak, co se tyka protected. Mno nevim. Protected data membry jsou v podstate zamaskovany public. Zas jsou soucasti verejneho rozhrani pro kohokoli, kdo ze tridy podedi. Takze opet nemuzete menit jejich vyznam, nebo si s nima interne v base tride delat co potrebujete, protoze zas se tim rozbije "externi svet".

Samozrejme muze to mit sve vyjimecne vyuziti interne v nakem vlastnim kodu, ktery navenek vystavuje tridy uz jako final, takze se dedit nedaji. Ale stejne, kdyz se ten kod rozroste, tak stejne je potreba si v nem udrzovat trochu poradek a tohle k tomu neprispeje.

RDa

  • *****
  • 2 465
    • Zobrazit profil
    • E-mail
Re:C++ ako naformátovať std::chrono::system_clock::time_point?
« Odpověď #4 kdy: 26. 12. 2020, 11:50:10 »
Samozrejme muze to mit sve vyjimecne vyuziti interne v nakem vlastnim kodu, ktery navenek vystavuje tridy uz jako final, takze se dedit nedaji. Ale stejne, kdyz se ten kod rozroste, tak stejne je potreba si v nem udrzovat trochu poradek a tohle k tomu neprispeje.

Vidis, tohle me privadi na myslenku - lze menit viditelnost memberu v hierarchii dedeni, ze to co bylo protected, uz bude od urcite urovne private? (marne si vzpominam, ze v necem byl konstrukt kde viditelnost byla jen pro urcitou skupinu trid..)


Re:C++ ako naformátovať std::chrono::system_clock::time_point?
« Odpověď #5 kdy: 26. 12. 2020, 18:44:22 »
Ad "bezne ukony" - kdyz mas DT precision nastavenej jinej nez sekundu (cca enum rok/mesic/den/hodina/minuta/sekunda/ms/us/ns), tak tva trida konverti na string (napr. dle ISO) jako kratsi, nebo s 00, nebo se zastupnym znakem? :)

Btw C++ neumi nic mezi private a public? Ja jedu tedy PHP a tam mame "protected", coz je pristupno pro blizke tridy, ale ne pro externi kod.

C++ Umi aj protected... A umí toho ešte oveľa viac. C++ podporuje aj viacnásobnú dedičnosť a dokonca máte k dispozícii aj rôzne typy dedenia https://www.programiz.com/cpp-programming/public-protected-private-inheritance , viete dediť nie len tak ako v iných jazykoch (public dedičnosť), ale môžete dediť aj maximálne do protected časti alebo maximálne do private časti. Akurát ja sa snažím dedičnosť používať podľa možnosti čo najmenej (ak nepotrebujem aby boli typy navzájom kompatibilné). Okrem toho v C++ sa dá kompatibilita medzi typmi zbezpečiť aj inak ako dedičnosťou (napr implicitnou prípadne explicitnou konverziou)

Pred c++20 bohuzel nic ve stl neni. A to co je ve 20 jsem tbh nezkousel(a ani si nebyl jisty, ze se to tam dostalo).

Nicmene, co se tyka praci s datumem. Je tady od toho knihovna: https://github.com/HowardHinnant/date
Ma u toho dokumentaci, ale i prednasku ze cppconu, na to se oplati kouknout.

Ďakujem za tip idem pozrieť. A asi ju aj použijem.

Ono to neni az tak uplne jednoduche, si to delat sam, kvuli vsech moznych prestupnych casovych useku(nejen obcas 29. unor. Je treba pocitat napriklad s prestupnyma sekundama).

Ja som to nechcel delat celé úplne sám, chcel som použiť štandartné C/C++ funkcie a obaliť ich do objektového wrapperu, aby bola práca s dátumom rovnako pohodlná ako práca so štruktúrou DateTime (ktorú poznám z .NETe). Z dátumom som robil už na viacerých platformách (v JSku používam moment, v PHP objekt DateTime) ale najviac mi vyhovuje DateTime z .NETu - ten sa blíži dokonalosti. Ale asi nakoniec použijem tú knižnicu od Howarda Hinnanta

Mimochodom keď už sme pri tých libkách ja som včera (pri hladaní formátovača) našiel zaujímavú formátovaciu libku pre C++ https://fmt.dev/ ktorá vyzerá byť inšpirovaná Rustom a mala by čiastočne nahradiť streamy. Žiaľ tá tiež využíva tm (pri formátovaní času a dátumu)

Re:C++ ako naformátovať std::chrono::system_clock::time_point?
« Odpověď #6 kdy: 26. 12. 2020, 23:15:49 »
..............
Btw C++ neumi nic mezi private a public? Ja jedu tedy PHP a tam mame "protected", coz je pristupno pro blizke tridy, ale ne pro externi kod.
mužeš to tam mezi sebou všecko skamarádit hele :o :o :D :)
lidi postižený environmentálním žalem hele choděj za ekopsycholožkama hele 🤡 💆 🤡 💆

nula

Re:C++ ako naformátovať std::chrono::system_clock::time_point?
« Odpověď #7 kdy: 28. 12. 2020, 15:47:19 »
Jj, fmt je zname a bylo inspiraci (melo byt) pro stl format. Podobne fajn je i spdlog. Pro takove zakladni prace.