Datum korrigieren

  • 1
  • 2
  • Page 1 of 2
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2077
Registered: 03 / 2003
Subject:

Datum korrigieren

 · 
Posted: 30.04.2019 - 06:24  ·  #1
Hallo Zusammen,

hat einer von euch eine Idee, wie man zu einem Datum eine bestimmte Anzahl Tage addiert, so daß als Ergebnis das richtige Datum heraus kommt? Es geht um ca. 19.x Jahre :D.
Ich habe hier GPS-Empfänger rum liegen, bei denen an einer internen Variablen gespart wurde, so daß diese jetzt überläuft und das Datum falsch ist. Heute ist z.B. der 14.09.1999. GPS-intern wird nämlich nicht das korrekte Datum, sondern die Differenz zu einem bestimmten Datum übertragen.

Gruss
Harry
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2077
Registered: 03 / 2003
Subject:

Re: Datum korrigieren

 · 
Posted: 01.05.2019 - 12:22  ·  #2
Also ich muß immer 7168 Tage addieren. Unter (Turbo-)Pascal/Delphi gibt es anscheinend einen Variablentyp der das einfach zulässt (TDateTime bzw. TDate). Leider gibt es sowas in AVRCo nicht. Hat jemand mal was dafür geschrieben?

Harry
berndk
Benutzer
Avatar
Gender: n/a
Location: Leipzig
Posts: 23
Registered: 02 / 2006
Subject:

Re: Datum korrigieren

 · 
Posted: 03.05.2019 - 06:47  ·  #3
Hallo Harry,

es könnte im Umweg über das Julianische Datum gehen, d.h. D,M,Y in Julian, dann Tage dazu addieren, dann Julian zurück in D,M,Y

Hier ist Julian Tage seit 2000

Bernd

const
Date2000 : word = 36526; {= 01/01/2000}
First2Months : word = 59; {2000 was a leap year}
MinYear : word = 2000;



procedure DateToDMY(Julian : word; var Day, Month : byte; var Year : word);
var
I : LongInt;
begin
if Julian <= First2Months then
Year := MinYear;
if Julian <= 30 then
Month := 1;
Day := byte(Succ(Julian));
else
Month := 2;
Day := byte(Julian - 30);
endif;
else
I := (4 * LongInt(Julian - First2Months)) - 1;
Year := word(I div 1461);
I := (5 * ((I mod 1461) div 4)) + 2;
Month := byte(I div 153);
Day := byte(((I mod 153) + 5) div 5);
if Month < 10 then
Month := Month + 3;
else
Month := Month - 9;
Inc(Year);
endif;
Year := Year + MinYear;
endif;
end;

function DMYtoDate(Day, Month : byte; Year : word) : word;
var
Res : word;
t1, t2 : word;
begin
if (MinYear = word(Year)) and (Month < 3) then
if Month = 1 then
Res := word(pred(Day));
else
Res := word(Day + 30);
endif;
else
if Month > 2 then
Month := Month - 3;
else
Month := Month + 9;
Dec(Year);
endif;
Year := Year - MinYear;
t1 := (word(Year) * 1461) div 4;
t2 := (153 * word(Month) + 2) div 5;
Res := t1 + t2 + word(Day) + First2Months;
endif;
Return(Res);
end;
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2077
Registered: 03 / 2003
Subject:

Re: Datum korrigieren

 · 
Posted: 03.05.2019 - 10:27  ·  #4
Hallo Bernd,

herzlichen Dank, aber irgendwie haut das nicht hin oder ich blick die Anwendung nicht.
Hab das mal so gemacht:
Code

Const
  Date2000        : Word = 36526; {= 01/01/2000}
  First2Months    : Word = 59; {2000 was a leap year}
  MinYear         : Word = 2000;

Var
  JYear           : Word;
  DK,MK           : Byte;
  YK              : Word;

Procedure DateToDMY(Julian:Word; Var Day,Month:Byte; Var Year:Word);
  Var I : LongInt;
  Begin
    If Julian<=First2Months
      then
        Year:=MinYear;
        If Julian<=30
          then
            Month:=1;
            Day:=Byte(Succ(Julian));
          else
            Month:=2;
            Day:=Byte(Julian-30);
          EndIf;
      else
        I:=(4*LongInt(Julian-First2Months))-1;
        Year:=Word(I div 1461);
        I:=(5*((I mod 1461) div 4))+2;
        Month:=Byte(I div 153);
        Day:=Byte(((I mod 153)+5) div 5);
        If Month<10
          then
            Month:=Month+3;
          else
            Month:=Month-9;
            Inc(Year);
          EndIf;
        Year:=Year+MinYear;
      EndIf;
  End DateToDMY;


Function DMYtoDate(Day,Month:Byte;Year:Word):Word;
  Var Res    : Word;
      t1, t2 : word;
  Begin
    If (MinYear=word(Year)) and (Month<3)
      then
        If Month=1
          then
            Res:=Word(Pred(Day));
          else
            Res:=Word(Day+30);
          EndIf;
      else
        If Month>2
          then
            Month:=Month-3;
          else
            Month:=Month+9;
            Dec(Year);
          EndIf;
        Year:=Year-MinYear;
        t1:=(Word(Year)*1461) div 4;
        t2:=(153*Word(Month)+2) div 5;
        Res:=t1+t2+Word(Day)+First2Months;
      EndIf;
    Return(Res);
  End DMYtoDate;

Process ReadGPS;
..
..
    TempSD:=Copy(NMEA.RMCDate,1,2);
    DK:=StrToInt(TempSD);
    TempSD:=Copy(NMEA.RMCDate,3,2);
    MK:=StrToInt(TempSD);
    TempSD:='20'+Copy(NMEA.RMCDate,5,2);
    YK:=StrToInt(TempSD);
    JYear:=(DMYtoDate(DK,MK,YK)+7168);
    DateToDMY(JYear,DK,MK,YK);
    YK:=YK-2000;
    NMEA.RMCDate:=ByteToStr(DK)+ByteToStr(MK)+IntToStr(YK);
  End ReadGPS;


Das Datum liegt als String in NMEA.RMCDate im Format z.B. '140599' vor.
Das Datum soll korrigiert und wieder in den String geschrieben werden.

So wie das jetzt ist, ist heute der '15829' (also der 15.82.09) :D
Ohne die Korrektur ist der 17.09.99
Schon richtig, daß das Jahr 4-stellig übergeben werden muß?

Ok ich sehs: deine Funktion ist für nach 2000 :( (jetzt hab ich das geschrieben und schicks auch ab :D)

Gruss
Harry

[Edit]Ich muß ja einfach nur 3 1/2 Monate warten, dann funktioniert es.

[Edit #2]Moment vielleicht heißt das ja auch 15.08.(20)29 ..... 7168 Tage sind grob 19.6 Jahre, d.h. Übergabedatum wäre dann etwa 03/2010 ..... hmmmm bring auch nix.

[Edit #3]Da ich ja nur das Jahr und '20' davor gestellt habe, habe ich den 17.09.2099 übergeben. +7168 Tage sind dann grob 04/2129 .... paßt ja in etwa.
berndk
Benutzer
Avatar
Gender: n/a
Location: Leipzig
Posts: 23
Registered: 02 / 2006
Subject:

Re: Datum korrigieren

 · 
Posted: 03.05.2019 - 16:05  ·  #5
Hallo Harry,

sorry dass ich Jahr < 2000 übersehen habe. Ich habe Jahr 2000 gewählt, um im Integer Bereich für unsere Anwendungen zu bleiben (Julianisches Datum beginnt 1.1. 4713 v. Chr.). Delphi nimmt 30.12.1899 als Date=0, Unix 1.1. 1970 = Tag 25569 in Delphi. Der Algorithmus sollte mit jedem der 2 MinDate (1899 oder 1970) funktionieren, aber ungeprüft.

Grüsse, Bernd
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2077
Registered: 03 / 2003
Subject:

Re: Datum korrigieren

 · 
Posted: 03.05.2019 - 17:12  ·  #6
Hallo Bernd,

heißt das, daß ich nur z.B.
Code
Date2000        : Word = 36526; {= 01/01/2000} 

auf z.B.
Code
Date1999        : Word = 36526+365; {= 01/01/1999} 

ändern muß und es sollte funktionieren?

Gruss
Harry

..... ach nein, der angegebene Tag ist der Tag nach dem 30.12.1899?
berndk
Benutzer
Avatar
Gender: n/a
Location: Leipzig
Posts: 23
Registered: 02 / 2006
Subject:

Re: Datum korrigieren

 · 
Posted: 04.05.2019 - 08:31  ·  #7
genau, Tag seit 1899. Also für 1999 Date2000 minus 365,

Grüsse, Bernd
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2077
Registered: 03 / 2003
Subject:

Re: Datum korrigieren

 · 
Posted: 04.05.2019 - 18:17  ·  #8
Hallo Bernd,

ich hab es jetzt mal so versucht:
Code

Date1992        : Word = 33604; // Original 36526 - 8x365 - 2 (wegen 2 Schaltjahre)
First2Months    : Word = 58;    // Original 59: 2000 was a leap year
MinYear         : Word = 1992;

Das Datum (also Tag und Monat stimmt :), aber als Jahr bekomme ich 2119. Ich zieh jetzt einfach mal noch 100 ab ohne zu wissen wieso :D.

Gruss
Harry
  • 1
  • 2
  • Page 1 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   136   150 · Page-Gen-Time: 0.028371s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI