Forum: Compiler & IDEs UTC_Time in UnixTime umwandeln


von Christoph S. (kleinerunistudent)


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

von gvdskg (Gast)


Lesenswert?

Da brauchst Du auch noch das Datum dazu.

von Andreas F. (aferber)


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

von Christoph S. (kleinerunistudent)


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 ?

von ... .. (docean) Benutzerseite


Lesenswert?


von Jens M. (dl4aas) Benutzerseite


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

von Andreas F. (aferber)


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

von Thomas (Gast)


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. ;-)

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Andreas F. (aferber)


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

von Jens M. (dl4aas) Benutzerseite


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.
1
char  NTP_days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
2
3
int ntp_daysofmonth ( int month, int year )
4
{
5
  if ( month == 1 ) { // february
6
    if ( !(year % 4) && year % 100 )
7
      return 29;
8
    else
9
      return 28;
10
  }
11
  else return (int)NTP_days[month];
12
}
13
14
void ntp_date( unsigned long time )
15
{
16
  unsigned int day = time / 86400L;
17
18
  int days;
19
  int year = 1900;
20
  int month = 0;
21
22
  while ( day > (days = ntp_daysofmonth(month, year)) ) {
23
    day -= days;
24
    if ( ++month > 11 ) {
25
      month = 0;
26
      year++;
27
    }
28
  }
29
30
//     lcd_print (0,0,"%2i.%2i.%4i ",day,month+1,year);
31
}

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.

von Andreas F. (aferber)


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

von Rolf Magnus (Gast)


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?

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.