Forum: Mikrocontroller und Digitale Elektronik Effizient Datum und Uhrzeit vergleichen


von Thomas (Gast)


Lesenswert?

Ich suche nach einem Weg zwei Timestamps effizient miteinander zu 
vergleichen.

Ich verwende einen Atmega32
Habe folgende Struktur um einen Timestamp abzubilden:
1
  typedef struct 
2
  {
3
                uint16_t          u16_Year :12;
4
                enum e_months     e_Month  :4;
5
                uint8_t           u8_Day   :5;
6
                uint8_t           u8_Hour  :5;
7
                uint8_t           u8_Minute:6;
8
                uint8_t           u8_Second:6;
9
                uint8_t           u8_Unused:3;
10
  }Clock_SType_TimeAndDate;

nun möchte ich zwei Variablen diesen Typs miteinander vergleichen um 
herauszufinden ob der Timestamp kleiner, gleich oder größer ist.

Wie kann ich das effizient anstellen?
Ich komme bisher nur auf unbefriedigende Ideen, z.B.:

- Union über diese Struktur und uint64_t und anschließend uint64_t 
Variable vergleichen -> Klappt wegen Little Endian nicht. Meines 
Erachtens wäre dies die effizienteste Lösung. Komme nur nicht mit dem 
Little Endian Format zurecht.

- Verschachtelte If Abfrage (zu viele Ifs und scheint mir ineffizient)

- per Schiebeoperator die Elemente der Struktur im richtigen Abstand 
aneinanderhängen und die entstehende 64Bit Zahl dann miteinander 
vergleichen. (auch ineffizient)

Habt ihr eine Idee?

von Peter II (Gast)


Lesenswert?

Thomas schrieb:
> Habt ihr eine Idee?

warum nicht einfach memcmp?

es hat übrigens ein Grund warum PC die Zeit nur als ein int32 speichern, 
dann hat man das Problem nicht mehr.

von Huhu (Gast)


Lesenswert?

Thomas schrieb:
> Habt ihr eine Idee?

Das ganze in Unixzeit umrechnen (dafür gibts fertige Funktionen in jedem 
System), dann kannst du ganz bequem vergleichen (gleich/größer/kleiner).

von B. S. (bestucki)


Lesenswert?

Thomas schrieb:
> - Verschachtelte If Abfrage (zu viele Ifs und scheint mir ineffizient)

Entweder das, oder die Zeit in Unixzeit umrechnen. Ist es denn zu 
ineffizient oder glaubst du das nur? Wie viele tausend Mal pro Sekunde 
musst du die Uhrzeit vergleichen?

Noch was:
Bitfelder sind nach Standard nur für bool, int und unsigned int 
definiert, die meisten Compiler unterstützen aber auch andere Typen.

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
> warum nicht einfach memcmp?

Solche Lösungen funktionieren nur, wenn man sicher sein kann, dass alle 
unbelegten Bits in der Struktur den gleichen Wert haben. Überdies sind 
sie abhängig von der Bit- und Byteorder.

von Peter II (Gast)


Lesenswert?

A. K. schrieb:
> Solche Lösungen funktionieren nur, wenn man sicher sein kann, dass alle
> unbelegten Bits in der Struktur den gleichen Wert haben. Überdies sind
> sie abhängig von der Bit- und Byteorder.

wenn man nur auf "gleich" vergleicht, spielt die Byteorder kaum eine 
rolle.


und gegen unbelegte bits hilft beim anlegen ein memset.

von Erwin D. (Gast)


Lesenswert?

Peter II schrieb:
> wenn man nur auf "gleich" vergleicht, spielt die Byteorder kaum eine
> rolle.

Thomas schrieb:
> nun möchte ich zwei Variablen diesen Typs miteinander vergleichen um
> herauszufinden ob der Timestamp kleiner, gleich oder größer ist.
                                  ---------------------------

;-(

von (prx) A. K. (prx)


Lesenswert?

Wenn das unterste Bit der Sekunde verzichtbar ist, dann kommt auch das 
FAT Timestamp-Format in Frage. Das packt alle Info in 32 Bits (2x16). 
Wenn man das nicht als Bitfeld realisiert, sondern mit Shifts, dann ist 
es zudem unabhängig von Bit/Byteorder.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

wie ist das überhaupt mit dem byteorder bei solchen bitfields?


 uint16_t          u16_Year :12;

immerhin ist das uint16_t gar kein uint16_t.

von Rolf M. (rmagnus)


Lesenswert?

Was heißt denn effizient? Wieviele Millionen solcher Vergleiche sollen 
den pro Sekunde stattfinden?

Generell scheint mir die Strukt eher ineffizient in der Benutzung zu 
sein, weil durch die Aufteilung sehr viel Bitgeschupse nötig wird. Und 
warum gerade 41 Bits insgesamt?
Ich würde auch sowas wie einen Unix-Timestamp vorschlagen und den dann 
nur zur Ausgabe umrechnen.

von Fritz G. (fritzg)


Lesenswert?

Ich hätte auch gesagt in Unixzeit umrechnen. Allerdings braucht das 
viele Multiplikationen.
Wenn du verschachtelte If Abfragen nimmst in der Reihenfolge 
Jahr/Monat/Tag... dann kannst du ev. frühzeitig aus dem if Block 
rausspringen. Rechenzeitmäßig dürfte es um einiges schneller sein, als 2 
structs in Unixzeit umzurechnen.

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
> wie ist das überhaupt mit dem byteorder bei solchen bitfields?

Sinnvollerweise orientiert sich die Bitorder in Bitfeldern an der 
Byteorder. Little-Endians fangen also in den Worten rechts an, 
Big-Endians links. In IBMs Prozessoren hat das höchstwertige Bit daher 
die Nummer 0.

Motorola lief in diese Falle, als sie bei der Big-Endian 68000 trotzdem 
die Bits von rechts nach links nummerierten. Als sie bei der 68020 
Bitfeld-Befehle hinzufügten merkten sie, dass das nicht funktioniert. 
Und drehten bei denen die Bitnummerierung um.

von Peter II (Gast)


Lesenswert?

Fritz G. schrieb:
> Rechenzeitmäßig dürfte es um einiges schneller sein, als 2
> structs in Unixzeit umzurechnen.

wenn er intern direkt mi Unixzeit arbeitet, dann muss er es nur für die 
anzeige umrechnen. Dafür werden die vergleiche einfacher und das 
incrementieren der Zeit.

von Fritz G. (fritzg)


Lesenswert?

Es ist die Frage, wie diese Struktur überhaupt zusammenkommt. Zählst du 
jedesmal händisch eine Sekunde dazu? Dann kannst du eine Variable 
zusätzlich für die Sekunden seit Programmstart nehmen, diese jede 
Sekunden miterhöhen und brauchst nur diese zu vergleichen. Praktisch 
eine Unixzeit für Arme.

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
> wenn er intern direkt mi Unixzeit arbeitet, dann muss er es nur für die
> anzeige umrechnen. Dafür werden die vergleiche einfacher und das
> incrementieren der Zeit.

Je nach einzukalkulierendem Alter, sowohl der Technik als auch dem 
eigenen, sollte man dabei freilich im Auge behalten, dass bei 32 Bits 
dann im Jahr 2038 das Ende der Welt erreicht ist.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

A. K. schrieb:
> Je nach einzukalkulierendem Alter, sowohl der Technik als auch dem
> eigenen, sollte man dabei freilich im Auge behalten, dass bei 32 Bits
> dann im Jahr 2038 das Ende der Welt erreicht ist.

er muss ja nicht bei 1970 anfangen.

von B. S. (bestucki)


Lesenswert?

A. K. schrieb:
> Je nach einzukalkulierendem Alter, sowohl der Technik als auch dem
> eigenen, sollte man dabei freilich im Auge behalten, dass bei 32 Bits
> dann im Jahr 2038 das Ende der Welt erreicht ist.

Wenn man einen uint32_t benutzt, kann man das Ende bis 2106 
hinauszögern.

von Axel S. (a-za-z0-9)


Lesenswert?

Thomas schrieb:

> Habe folgende Struktur um einen Timestamp abzubilden:
>
>
1
>   typedef struct
2
>   {
3
>                 uint16_t          u16_Year :12;
4
>                 enum e_months     e_Month  :4;
5
>                 uint8_t           u8_Day   :5;
6
>                 uint8_t           u8_Hour  :5;
7
>                 uint8_t           u8_Minute:6;
8
>                 uint8_t           u8_Second:6;
9
>                 uint8_t           u8_Unused:3;
10
>   }Clock_SType_TimeAndDate;
11
>

Was muß man denn geraucht haben, um auf sowas zu kommen?
<kopfschüttel>

> nun möchte ich zwei Variablen diesen Typs miteinander vergleichen um
> herauszufinden ob der Timestamp kleiner, gleich oder größer ist.
> Wie kann ich das effizient anstellen?

Indem du Bitfelder vermeidest.

Ansonsten kann der AVR mit seiner 8-Bit ALU sowieso immer nur 8 Bit auf 
einen Rutsch vergleichen. Jegliches Gecaste nach uint64_t u.ä. bringt 
also überhaupt gar nichts. Denn auch zwei uint64_t muß die ALU von links 
nach rechts byteweise vergleichen (von links nach rechts, um außer 
Gleichheit auch größer und kleiner korrekt zu erkennen). Dann kannst du 
genauso gut auch gleich komponentenweise vergleichen. Außer natürlich 
daß das bei Verwendung von Bitfeldern auch Bitschieberei beinhaltet.

Andererseits müßte man auch mal fragen, worin dieser Eifer auf besonders 
effizienten Vergleich begründet liegt. Vermutlich wieder nur ein Fall 
von vorauseilender Optimierung.

Auch der Hinweis auf UNIX Timestamps kam vollkommen zurecht. Nicht nur 
ist diese Form der Codierung simpelst zu vergleichen, sie ist auch 
maximal speichereffizient.

von Rurik (Gast)


Lesenswert?

Mit 32 Bit = 4 Byte lässt sich jedes Jahr in ms auflösen
und mit weiteren 2 Byte jedes geschichtlich vorstellbare
Jahr von den Neandertalern bis in 30.000 Jahren darstellen.
Da droht so schnell kein Y2K.

Noch schöner: Das Jahr NULL gibt es nicht!
Also: Year = NULL ist eindeutig NOT A DATE. :-)

Schon klar - ist keine Allerwelts-Konvention, also will dafür
niemand den Rechner für eine ms zum Umrechnen beschäftigen.
Auch wenn damit jeder Vergleich zur µs-Sache wird.

Die Astronomen sind da mit ihrem Julianischen Datum schlauer.
Darum fielen die auch weder auf Y2K, noch auf das "Erfundene
Mittelalter" rein...

von B. S. (bestucki)


Lesenswert?

Rurik schrieb:
> Mit 32 Bit = 4 Byte lässt sich jedes Jahr in ms auflösen

Ne, nur 49.7 Tage.

von Rolf M. (rmagnus)


Lesenswert?

Be S. schrieb:
> Rurik schrieb:
>> Mit 32 Bit = 4 Byte lässt sich jedes Jahr in ms auflösen
>
> Ne, nur 49.7 Tage.

Ist deshalb nicht auch genau nach dieser Zeit Windows 98 immer 
abgestürzt?

Aber es sind ja hier eh nur Sekunden gefordert. Dann reicht es für gut 
136 Jahre - länger als die Lebenserwartung des Homo Sapiens.

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

> Die Astronomen sind da mit ihrem Julianischen Datum schlauer.

Ein bisschen was an der Waffel haben die auch. Beim julianischen Datum 
ist der Übergang zwischen zwei Tagen nicht um Mitternacht, sondern um 12 
Uhr Mittags. Die haben 0,5 Tage Offset.

Trotzdem kann man die Formeln zur Umrechnung zwischen Kalenderzeit und 
julianischem Datum auch zur Umrechnung von Kalenderzeit auf Unixzeit 
benutzen. 2440587,5 vom julianischen Datum abziehen und mit 86400 
multiplizieren. Ist die Basis nicht UTC, und braucht man die Genauigkeit 
muss man noch für Schaltsekunden korrigieren.

> Darum fielen die auch weder auf Y2K,

Die Unix-Leute haben über Y2K eher gelacht, deren Dommsday kommt noch, 
19. Januar 2038, wenn die früher üblichen 32 Bit nicht mehr reichen. Das 
kann sogar auf modernen Systemen mit 64 Bit Sekundenzähler passieren 
wenn da drauf zum Beispiel noch alte Anwendungen laufen, die intern Zeit 
in 32 Bit speichern.

von (prx) A. K. (prx)


Lesenswert?

Hannes J. schrieb:
> Die Unix-Leute haben über Y2K eher gelacht, deren Dommsday kommt noch

... wenn deren Herzschrittmacher aussetzen.

Tatsächlich hatte das aber nichts mit dem Betriebssystem zu tun. Es ist 
die Frage, wie Anwendungen in ihrer Datenspeicherung mit der Jahreszahl 
umgehen. Ob beispielsweise in Datenbanken und Eingabemasken 2- oder 
4-stellig angegeben wird. In einer Eingabemaske ist die Unix-Zeit 
unpraktisch. Und in einer Datenbank alle Daten aus dem Jahr 2015 zu 
suchen ist einfacher, wenn da das Datum zerlegt drinsteht - kein Risiko, 
dass dir irgendwelche schief gerechneten Schaltsekunden die 
Steuererklärung durcheinander bringen.

von W.S. (Gast)


Lesenswert?

Ob nun Unix-Zeit oder MSDOS-Zeit oder irgend ein anderer Startpunkt 
genommen wird, ist eigentlich egal. Ich benutze schlichtweg nen 32 Bit 
Zähler für die Sekunden seit dem 1.1.2000 und das reicht für die 
Lebenszeit eines durchschnittlichen Gerätes allemal aus.

Und wenn es um Zeitabläufe im µC geht, dann werden die Millisekunden ab 
Mitternacht gezählt und zur nächsten Mitternacht zurückgestellt. Das 
geht problemlos, wenn man NICHT auf den Gedanken kommt, anhand des 
Millisekundenzählers per Trampelschleife warten zu wollen, sondern das 
Verwalten von Zeiten und das Generieren von Timer-Ereignissen der 
programminternen Systemuhr überläßt. Die ist für sowas nämlich da.

W.S.

von Peter D. (peda)


Lesenswert?

Fritz G. schrieb:
> Ich hätte auch gesagt in Unixzeit umrechnen. Allerdings braucht das
> viele Multiplikationen.

Na und, der Atmega32 hat nen MUL-Befehl.

von Fritz G. (fritzg)


Lesenswert?

Peter D. schrieb:
> Fritz G. schrieb:
>> Ich hätte auch gesagt in Unixzeit umrechnen. Allerdings braucht das
>> viele Multiplikationen.
>
> Na und, der Atmega32 hat nen MUL-Befehl.

Habe grad nachgesehen, 2 Takte. Hui, ist das hurtig! Früher[TM] dauerte 
so etwas erheblich länger.

von Timm T. (Gast)


Lesenswert?

Hannes J. schrieb:
> Beim julianischen Datum
> ist der Übergang zwischen zwei Tagen nicht um Mitternacht, sondern um 12
> Uhr Mittags. Die haben 0,5 Tage Offset.

Das könnte für jemanden, der vorzugsweise Nachts beobachtet, durchaus 
sinnvoll sein, meinst Du nicht? Naja, zumindest Herschel meinte das...

Axel S. schrieb:
> Auch der Hinweis auf UNIX Timestamps kam vollkommen zurecht. Nicht nur
> ist diese Form der Codierung simpelst zu vergleichen

Auch eine in Nibbles gepackte BCD-Codierung, wie sie viele RTCs 
rausgeben ist simpelst zu vergleichen, da der AVR wie oben schon erwähnt 
eh Byteweise vergleicht.

Zusätzlich ist sie noch simpelst zu lesen (direkt als Hexzahl), als 
Konstante anzugeben (als Hexzahl), in einzelne Ziffern aufzulösen (mit 
Swap) für Displayausgabe und zu manipulieren (Uhrzeit stellen up/down), 
erfordert alles minimale Rechenzeit ohne Multiplikation und Division.

Was bescheiden geht sind Zeitdifferenzen zu berechnen. Und der 
Speicherbedarf ist halt etwas höher, 7 Byte reichen aber für hh:mm:ss, 
dd.nn.yy und wday.

von Joachim B. (jar)


Lesenswert?

erkläre Effizient

da in meinen Prograammen eh immer Date und Time als String vorliegt 
benutze ich strcmp ==, > oder <

ist nicht elegant aber einfach

yyyy_mo_ta__hh_mm_ss

: Bearbeitet durch User
von Fan von Standards (Gast)


Lesenswert?

>
> yyyy_mo_ta__hh_mm_ss

Jetzt noch die richtigen Trennzeichen und Du bist Standardkonform zu 
ISO-8601:

  yyyy-mo-taThh:mm:ss

PS1: bei Richtigen[TM] Dateisysteme ist ':' in Dateinamen 
selbstverständlich zulässig.

PS2: date --iso=s und man date

von Ralph S. (jjflash)


Lesenswert?

Peter Danneger hat sowas vor Jahren hier gepostet:

Beitrag "Berechnung Datum + Uhrzeit + Sommerzeit"

32 Bit Variable für Sekunden beginnend ab einem bestimmten Datum.

Dann ist das Vergleichen auf größer, kleiner oder gleich kein Problem.

Gruß,

Ralph

von J. W. (dilbert)


Lesenswert?

Da hier so viele die Verwendung des Unix-Timestamps vorgeschlagen haben:

Was ist denn ein für Mikrocontroller geeigneter Algorithmus?

@Thomas,
ob die Verwendung von Bitfeldern einen Vorteil bringt (und nicht eher 
einen Nachteil), bezweifle ich. Du könntest den Zeit-struct verwenden, 
der auf jedem(?) Unix-System in /usr/include/time.h definiert ist:
1
struct tm
2
{
3
  int tm_sec;                   /* Seconds.     [0-60] (1 leap second) */
4
  int tm_min;                   /* Minutes.     [0-59] */
5
  int tm_hour;                  /* Hours.       [0-23] */
6
  int tm_mday;                  /* Day.         [1-31] */
7
  int tm_mon;                   /* Month.       [0-11] */
8
  int tm_year;                  /* Year - 1900.  */
9
  ...
10
}

von (prx) A. K. (prx)


Lesenswert?

J. W. schrieb:
> ob die Verwendung von Bitfeldern einen Vorteil bringt (und nicht eher
> einen Nachteil), bezweifle ich.

Kommt auf die Anwendung drauf an. In einem begrenzten Logspeicher ist 
man mit 4 Bytes Timestamp, egal ob Sekunden oder zerlegt, jedenfalls 
besser dran als mit ASCII oder struct tm.

: Bearbeitet durch User
von Thomas (Gast)


Lesenswert?

Also ich bin jetzt voll und ganz von der Unixtime überzeugt.

Ich habe auch schon eine Funktion mit der ich mit dem Atmega32 und 16MHz 
in 150µs von meiner Struktur in Unixtime umrechnen kann.
1
uint32_t convertDateTimeFromHumanToUnix(Clock_SType_TimeAndDate as_DateTime)
2
{
3
    
4
    uint32_t lu32_year = as_DateTime.u16_Year;
5
    uint32_t lu32_month = as_DateTime.e_Month;
6
    uint32_t lu32_day = as_DateTime.u8_Day;
7
    uint32_t lu32_hour = as_DateTime.u8_Hour;
8
    uint32_t lu32_minute = as_DateTime.u8_Minute;
9
    uint32_t lu32_second = as_DateTime.u8_Second;
10
    
11
    const uint32_t lu16_DaysByMonths[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
12
13
    uint32_t lu32_LeapYears = ((lu32_year-1)-1968)/4
14
                         - ((lu32_year-1)-1900)/100
15
                         + ((lu32_year-1)-1600)/400;
16
17
    uint32_t lu32_daysSince1970 = (lu32_year-1970)*365 + lu32_LeapYears + lu16_DaysByMonths[lu32_month-1] + lu32_day-1;
18
19
    if (    (lu32_month > 2)
20
         && (    (  lu32_year % 4 == 0                              ) 
21
              && ( (lu32_year % 100 != 0) || (lu32_year % 400 == 0) )    )    )
22
    {
23
        lu32_daysSince1970 += 1; 
24
    }
25
26
    return lu32_second + 60 * ( lu32_minute + 60 * (lu32_hour + 24 * lu32_daysSince1970) );
27
}

Es scheitert allerdings nun daran, die Unixzeit wieder in ein Datum 
umzurechnen (Stunden Minuten und Sekunden sind nicht das Problem)
Hat hier jemand einen effizienten Ansatz?

Meiner ist bisher dieser. Verbesserungsvorschläge willkommen!
1
Clock_SType_TimeAndDate convertDateTimeFromUnixToHuman(uint32_t au32_UnixTime)
2
{
3
    Clock_SType_TimeAndDate lt_ReturnValue;
4
    uint32_t lu32_daysFrom1970 = au32_UnixTime / 86400;
5
    uint32_t lu32_SecondsToday       = au32_UnixTime % 86400;
6
    lt_ReturnValue.u8_Hour   = lu32_SecondsToday / 3600;
7
    lt_ReturnValue.u8_Minute = (lu32_SecondsToday / 60) % 60;
8
    lt_ReturnValue.u8_Second = lu32_SecondsToday % 60;
9
    uint16_t lu16_ApproximateYear = lu32_daysFrom1970 / 365;
10
        
11
    uint8_t lu8_schaltjahre = ((lu16_ApproximateYear + 1970-1)-1968)/4      /* Anzahl der Schaltjahre seit 1970 (ohne das evtl. laufende Schaltjahr) */
12
                            - ((lu16_ApproximateYear + 1970-1)-1900)/100
13
                            + ((lu16_ApproximateYear + 1970-1)-1600)/400;
14
15
    uint32_t lu32_daysWithoutLeapDays = lu32_daysFrom1970 - lu8_schaltjahre;
16
    uint16_t lu16_Year = (lu32_daysWithoutLeapDays / 365) + 1970;
17
    uint16_t lu16_DaysThisYear = (lu32_daysWithoutLeapDays % 365);
18
    lu16_DaysThisYear += 1;
19
    lt_ReturnValue.u16_Year = lu16_Year;
20
    
21
    
22
    uint8_t lu8_CurrentYearIsLeapYear = 0;
23
    if(lu16_Year % 4 == 0)
24
    {
25
        if(lu16_Year % 100 == 0)
26
        {
27
            if(lu16_Year % 400 == 0)
28
            {
29
                lu8_CurrentYearIsLeapYear = 1;
30
            }
31
        }
32
        else
33
        {
34
            lu8_CurrentYearIsLeapYear = 1;
35
        }
36
    }
37
38
    uint8_t lu8_Month = 0;
39
    uint8_t lu8_Day = 0;
40
    if(lu16_DaysThisYear <= 31)
41
    {
42
        lu8_Month = 1;
43
        lu8_Day = lu16_DaysThisYear;
44
    }
45
    else if(lu16_DaysThisYear <= 59)
46
    {
47
        lu8_Month = 2;
48
        lu8_Day = lu16_DaysThisYear - 31;
49
    }
50
    else if((lu16_DaysThisYear == 60) && (lu8_CurrentYearIsLeapYear == 1))
51
    {
52
        lu8_Month = 2;
53
        lu8_Day = lu16_DaysThisYear - 31;
54
    }
55
    else
56
    {
57
        const uint16_t lu16_DaysByMonths[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
58
        lu16_DaysThisYear -= lu8_CurrentYearIsLeapYear;
59
        
60
        for(lu8_Month = 3; lu8_Month < 12; lu8_Month++)
61
        {
62
            if(lu16_DaysThisYear <= lu16_DaysByMonths[lu8_Month])
63
            {
64
                break;
65
            }
66
        }
67
68
        lu8_Day = lu16_DaysThisYear - lu16_DaysByMonths[lu8_Month-1];
69
    }
70
71
    lt_ReturnValue.u8_Day = lu8_Day;
72
    lt_ReturnValue.e_Month = lu8_Month;   
73
    
74
    return lt_ReturnValue;
75
}

Zudem hab ich irgendwo ein Problem beim Umrechnen ab dem 2016-12-20 bis 
2016-12-31. Wenn ich das Datum erst in eine Unixtime rechne und dann 
wieder zurück.

von Wolfgang (Gast)


Lesenswert?

Thomas schrieb:
> enum e_months     e_Month  :4;

> kleiner, gleich oder größer

Wie willst du das unter einen Hut bringen.

von Gerd E. (robberknight)


Lesenswert?

Was mir hier in den ganzen Structs, Formeln und Code fehlt ist die 
Behandlung von Sommerzeit und Winterzeit. Denn bei der Umstellung von 
Sommerzeit auf Winterzeit wird die Zeit um 1 h zurückgestellt, also die 
Zeit von 2-3h 2x hintereinander durchlaufen. Wenn man das beim Vergleich 
nicht berücksichtigt geht das genau dann schief. An sowas sind schon 
viele Programme gescheitert.

Daher ist Unixtime in UTC, da gibt es keine Sommerzeit.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.