www.mikrocontroller.net

Forum: Compiler & IDEs UTC_Time in UnixTime umwandeln


Autor: Christoph S. (kleinerunistudent)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
meine aufgabe ist es eine Integer zahl bzw float zahl in der UTC_Time 
form in die UNIXTime umzuwandeln.

Meine zeite sieht etwa so aus hhmmss.ss Bsp: 151256.00  ---> 15:22:56

wie kriege ich diese in die unix_time ? gibts dafür schon beispiele denn 
habe nichts passendes und verständliches gefunden.

Über tipps und code schnippsel würde ich mich freuen.

vielen dank schonmal,
KleinerUniStudent

Autor: gvdskg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da brauchst Du auch noch das Datum dazu.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unix-Zeit kann eigentlich keine Tageszeit ohne Datumsangabe 
wiedergeben. Davon mal abgesehen, wo ist das Problem? Unix-Zeit basiert 
auf Sekunden, eine Stunde hat 3600 Sekunden, eine Minute 60, der Rest 
ist Grundschulmathematik.

Andreas

Autor: Christoph S. (kleinerunistudent)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das datum habe ich auch in dieser form dann ddmmyy Bsp.: 040810

ja aber wenn ich das datum habe und es dann in sekunden zurück rechne 
bis aufs jahr 1970 .... wie weiß ich welches jahr 364 tage hatte und 
welches 365 ?

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jens Mundhenke (dl4aas) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christoph,

entweder nimmst Du Dir einen Stichtag, z.B. Anfang des Jahres, als Bezug 
und rechnest von da - oder Du musst wirklich durch die Regeln zur 
Schaltjahrerzeugung durch. So habe ich es gemacht. Nächste Hürde sind 
die unterschiedlich langen Monate - habe es mit einer Tabelle gelöst.

Irgendwo habe ich sicherlich auch noch den Code. Wenn ich mich recht 
entsinne, entschlüsselt er NTP-Pakete.

Gruß
Jens

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph S. schrieb:
> ja aber wenn ich das datum habe und es dann in sekunden zurück rechne
> bis aufs jahr 1970 .... wie weiß ich welches jahr 364 tage hatte

Das ist einfach... kein einziges ;-)

> und
> welches 365 ?

Normale Jahre haben 365, Schaltjahre 366 Tage.

Wie wäre es, wenn du deine Werte passend zerlegt in eine "struct tm" 
(aus <time.h>) einträgst und dann mit mktime() umrechnest?

Wenn du es unbedingt zu Fuss erledigen willst, findet sich im bereits 
von jemand anders verlinkten Wikipedia-Artikel auch ein Algorithmus 
dafür.

Andreas

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Ferber schrieb:
>> ja das datum habe ich auch in dieser form dann ddmmyy Bsp.: 040810
>>
>> ja aber wenn ich das datum habe und es dann in sekunden zurück rechne
>> bis aufs jahr 1970 .... wie weiß ich welches jahr 364 tage hatte
>
> Das ist einfach... kein einziges ;-)

Falsch. Richtig wären alle. ;-)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
> Falsch. Richtig wären alle. ;-)

Aber nur, wenn die 364 der 2 hier entspricht:


First shalt thou take out the Holy Pin, then shalt thou count to three,
no more, no less. Three shall be the number thou shalt count, and the
number of the counting shall be three. Four shalt thou not count,
neither count thou two, excepting that thou then proceed to three. Five
is right out. Once the number three, being the third number, be reached,
then lobbest thou thy Holy Hand Grenade of Antioch towards thy foe, who
being naughty in My sight, shall snuff it.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
> Falsch. Richtig wären alle. ;-)

Wenn du diesem dünnen Pfad folgen willst, halte ich mit 1582 dagegen, 
das Jahr hatte nur 355 Tage ;-)

Andreas

Autor: Jens Mundhenke (dl4aas) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christoph,

hier zur Orientierung die Datumsberechnung aus eine NTP-Zeit. Nicht 
toll, aber für seltene Berechnungen ausreichend. So habe ich es 
jedenfalls empfunden. Für Unixzeit ist vermutlich nur das Startjahr zu 
ändern.

char  NTP_days[] = {31,28,31,30,31,30,31,31,30,31,30,31};

int ntp_daysofmonth ( int month, int year )
{
  if ( month == 1 ) { // february
    if ( !(year % 4) && year % 100 )
      return 29;
    else
      return 28;
  }
  else return (int)NTP_days[month];
}

void ntp_date( unsigned long time )
{
  unsigned int day = time / 86400L;

  int days;
  int year = 1900;
  int month = 0;

  while ( day > (days = ntp_daysofmonth(month, year)) ) {
    day -= days;
    if ( ++month > 11 ) {
      month = 0;
      year++;
    }
  }

//     lcd_print (0,0,"%2i.%2i.%4i ",day,month+1,year);
}


Die Berechnung in die andere Richtung sollte daraus ja machbar sein.

Na, für die Zeit ist die Sache ja nicht soooo kompliziert...die Stunde 
hat 3600s, die Minute 60s. Da liegt der Aufwand eher im 
Auseinandernehmen der vorliegenden Daten.

Gruß
Jens

P.S.: Ja, die Schaltjahresberechnung ist nicht vollständig, reicht aber 
für dieses Jahrhundert aus.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BTW, da offenbar Sekundengenauigkeit angestrebt wird, fehlt in diesen 
einfachen Ansätzen (auch dem aus dem Wikipedia-Artikel) die 
Berücksichtigung von Schaltsekunden. Derzeit (Stand heute) bedeutet das 
dann eine Abweichung von 24 Sekunden.

Der von mir oben erwähnte Ansatz mit mktime() würde das auf vielen 
Systemen korrekt berücksichtigen, allerdings müsste man vorher 
sicherstellen, ob auf dem verwendeten System time_t wirklich Unix-Zeit 
darstellt.

Andreas

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Ferber schrieb:
> Wie wäre es, wenn du deine Werte passend zerlegt in eine "struct tm"
> (aus <time.h>) einträgst

Dafür würde sich die Funktion strptime anbieten.

> und dann mit mktime() umrechnest?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.