logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Algorytm] Odliczanie czasu od określonej daty do chwili obecnej.

FastProject 12 Cze 2011 12:20 6726 11
REKLAMA
  • #1 9602744
    FastProject
    Poziom 28  
    Witam,
    poszukuję łatwego algorytmu do zaaplikowania w Bascom AVR do odliczania ilości lat, miesięcy, dni, godzin, minut i sekund od zadanej daty, do chwili obecnej.

    Powiedzmy, ze datą startową jest 1 stycznia 2000r godzina 00:00:00. Jak obliczyć ile czasu minęło od tamtej chwili z uwzględnieniem lat przystępnych?

    Z góry dziękuje za pomoc.
    P.S. przejrzałem internet i znalazłem tylko obliczanie dni i to czasami bez uwzględniania lat przystępnych.
  • REKLAMA
  • #2 9602779
    robert-gd
    Poziom 11  
    No to jak znalazłeś obliczanie bez lat przestępnych, to wystarczy sprawdzić ile lat przestępnych było w tym okresie i dodać magiczne 24h do każdego z nich ;), jak masz jakiś gotowy kod to Ci poprawię

    Bedzie to coś takiego :

    
    if ((rok%4 = 0 and rok%100 <> 0) or rok%400 = 0) then czas+=24 //(h)
    endif
    
    


    Podobnie zrobi się z przeliczeniem na czas :)
  • #3 9602868
    FastProject
    Poziom 28  
    A możesz podać całą procedurę przeliczania, nie w postaci kodu, w postaci przykładu i zwykłych operacji matematycznych?
    Nie znam na tyle C, żeby dobrze to zrozumieć o opracować własny kod w Bascom

    Czyli mamy datę startową 01.01.2000 godzina 00:00:00 i datę dzisiejszą powiedzmy: 12.06.2011 godzina 13:00:30.

    Jak to policzyć tak na chłopski rozum, na kartce papieru?
  • REKLAMA
  • #5 9603329
    FastProject
    Poziom 28  
    No dobrze trafiłem też na tego typu zamiany z kalendarza gregoriańskiego na juliański i faktycznie można daty i godziny zapisać w postaci ułamkowej juliańskiej, a później odejmujemy je od siebie.

    I mamy ilość czasu jaka minęła od tych dat ale w postaci juliańskiej:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Można zrobić teraz konwersję odwrotną z juliańskiego na gregoriański, ale nigdzie nie widzę żeby ta konwersja podawała też godziny minuty i sekundy...Link
  • REKLAMA
  • #6 9604220
    robert-gd
    Poziom 11  
    Kod: text
    Zaloguj się, aby zobaczyć kod


    To powinno zwrócić Ci ilosc dni od roku 0 do wyznaczonej daty, wystarczy ze obliczysz sobie dla dwoch wybranych dni i ladnie sobie odejmiesz :) i juz masz ilosc dni pomiedzy datami, przemnozysz *24h i masz już w godzinach :)
  • REKLAMA
  • #7 9605043
    FastProject
    Poziom 28  
    nie jestem pewien czy warunek if(miesiac >2 ...) jest właściwy...nie powinno być if (miesiąc=2 ....)?

    Narazie zrobiłem sobie zwiększanie zmiennych (począwszy od sekund do lat) od zadanej daty i godziny do aktualnej daty i godziny...

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodam, że po obliczeniu jaki czas minął, stoper ma odliczać dalej czas. Powyższe kalkulacje wykonywane są więc tylko na początku włączenia zasilania. Później zwiększanie co sekundę realizować zamierzam za pomocą przerwania co 1s z RTC. W RTC przechowywać będę aktualną datę i godzinę. Czas-data początkowa zapisana będzie na stałe w programie.
  • #8 9638112
    FastProject
    Poziom 28  
    No niestety powyższy kod nie działa poprawnie..nie ma sensu szukać błędu, bo sama procedura zwiększania czasu od daty startowej podczas do aktualnej trwa zbyt długo, bo obliczane jest to na starcie programu.

    A więc czy ktoś jest mi w stanie powiedzieć jak zamienić datę i godzinę z kalendarza juliańskiego na "nasz" gregoriański?
  • #9 9638251
    tmf
    VIP Zasłużony dla elektroda
    Widzę, że Bascom jest jak socjalizm, dzielnie walczy z problemami niewystępującymi w innych językach :)
    Kolega robert-gd podał ci proste i dobre rozwiązanie twojego problemu, z czym masz kłopot?
    A jeśli ten opis cię nie przekonuje, to w C w nagłówku time.h masz funkcje realizujące takie przeliczenia, poszukaj ich źródeł (są w libc) i masz gotowce.
  • #10 9640640
    FastProject
    Poziom 28  
    Mówiąc, że kod nie działa poprawnie miałem na myśli swój "wymysł".
    Kod kolegi robert-gd po małej zmianie pewnie zadziała bo widywałem już takie przykłady. Ale nie obliczę z tego czasu(godzin, minut i sekund)-żeby to zrobić można łatwo wykonać dodatkowe przeliczenia..jednak ja szukam czegoś uniwersalnego.

    I dlatego pytam czy można za pomocą zamian z kalendarza gregoriańskiego na juliański obliczać także różnice między 2 odległymi datami i godzinami.

    Czyli jeżeli datę i godzinę (w naszym kalendarzu gregoriańskim) można zamienić tak jak pisałem tu https://www.elektroda.pl/rtvforum/topic2017411.html#9603329 na postać juliańska...TO CZY ISTNIEJE PRZELICZNIK ODWROTNY BEZ STRATY CZĘŚĆ I UŁAMKOWEJ ZAWIERAJĄCEJ GODZINY MINUTY I SEKUNDY.?
  • #11 9640798
    tmf
    VIP Zasłużony dla elektroda
    Hmm, spójrz jeszcze raz na kod kolegi robert-gd, a potem na ten swój - nieźle pokręcony. Jak myślisz, który jest bardziej uniwersalny? Nie wiem po co chcesz korzystać z daty juliańskiej? Tak jak kolega robert pokazał, należy dowolną datę przeliczyć na jednostki które cie interesują, np. sekundy, następnie przeprowadzić zwykłe odejmowanie i ponowne przeliczanie z sekund na to co chcesz, np. lata, miesiące itd. Stosowanie daty juliańskiej jest tu niewygodne, bo wartości mniejsze niż dzień przechowujesz jako część ułamkową daty, co przy liczbie sekund na dobę, powoduje, że nie da się tego precyzyjnie przechować w 32-bitowej zmiennej o typie float. Zakładając możliwy błąd zaokrągleń, to stosowne przeliczenie z daty juliańskiej można przeprowadzić oczywiście w obie strony.
  • #12 9640858
    FastProject
    Poziom 28  
    Nie zamierzam korzystać z swojego kodu..to byłą tylko przymiarka i już wcześniej pisałem że nie zamierzam korzystać z tego co stworzyłem.

    tmf napisał:
    Zakładając możliwy błąd zaokrągleń, to stosowne przeliczenie z daty juliańskiej można przeprowadzić oczywiście w obie strony.


    I właśnie o tą drugą stronę z ułamkami mi chodzi? Znasz sposób-algorytm na ten 2 sposób-z juliańskich na gregoriański z zachowaniem części doby? Pytam już tak z ciekawości...bo możliwe, że wykorzystam metodę kolegi roberta...

    tmf napisał:
    Tak jak kolega robert pokazał, należy dowolną datę przeliczyć na jednostki które cie interesują, np. sekundy, następnie przeprowadzić zwykłe odejmowanie i ponowne przeliczanie z sekund na to co chcesz, np. lata, miesiące itd.


    Ok, łatwo policzę liczbę dni, godzin minut i sekund...ale jak policzyć liczbę miesięcy? Tu przecież muszę uwzględnić to, że mają one różną ilość dni...?

    Przybliżę może jaśniej co mnie interesuje...
    Mam 2 daty:
    - 03.06.209 godzina 14:30
    - 22.06.2011 godzina 22.20 (aktualnie)

    Na wyświetlaczu potrzebuje wyświetlić różnicę między tymi 2 czasami w takim formacie:
    ILOŚĆ: |LAT|MIESIĘCY|DNI|GODZIN|MINUT|SEKUND|

    Czyli ma to być taki stoper odliczający ile dni, miesięcy i lat minęło od daty w 2009r do aktualnej chwili.

    Czyli jak będzie 03.06.2012 14:30 to na wyświetlaczu ma być: 3lata, 0 miesięcy, 0 dni, 0 godzin, 0 minut.

    Być może źle się zabrałem do tematu...?

    Dodano po 2 [godziny] 11 [minuty]:

    Tak dla ćwiczenia przełożyłem kod na Bascoma i tak to wygląda:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Kod poprawnie oblicza ilość dni między datami.

    [Algorytm] Odliczanie czasu od określonej daty do chwili obecnej.

    Dlaczego w jednym z warunków jest If Miesiac > 2... a nie If Miesiac = 2....? Gdy wklepie =2 to też liczy poprawnie...

    Ale teraz co ważne, jak z tej różnicy w dniach wyłuskać ilość lat, miesięcy i dni. Nie takie to proste bo lata mają 365 lub 366 dnia a miesiące 28-31 dni...trza pomyśleć i się z tym przespać.

    Ma ktoś pomysł jakie operacje wykonać aby ilość dni (dla przykładu 750) wyświetlić w poprawnym formacie: |LAT|MIESIĘCY|DNI|GODZIN|MINUT|SEKUND|
REKLAMA