Konvertiert unix timestamp in Datum ohne system-libs

Baue ich ein embedded Projekt, das zeigt die Zeit, abgerufen von einem GPS-Modul auf einem display, aber ich möchte auch die Anzeige des aktuellen Datums. Ich habe momentan die Zeit als unix-Zeitstempel und die progject ist in C geschrieben.

Ich bin auf der Suche nach einer Möglichkeit zum berechnen der aktuellen UTC-Datum aus dem Zeitstempel, wobei die Schaltjahre berücksichtigt? Denken Sie daran, dies ist für ein embedded Projekt, bei dem es keine FPU, also floating point math emuliert wird, vermeiden Sie so viel wie möglich für die Leistung erforderlich ist.

BEARBEITEN

Nach einem Blick auf @R...'s code, habe ich beschlossen, ein gehen, ein schreiben das ich und kam mit der folgenden.

void calcDate(struct tm *tm)
{
  uint32_t seconds, minutes, hours, days, year, month;
  uint32_t dayOfWeek;
  seconds = gpsGetEpoch();

  /* calculate minutes */
  minutes  = seconds / 60;
  seconds -= minutes * 60;
  /* calculate hours */
  hours    = minutes / 60;
  minutes -= hours   * 60;
  /* calculate days */
  days     = hours   / 24;
  hours   -= days    * 24;

  /* Unix time starts in 1970 on a Thursday */
  year      = 1970;
  dayOfWeek = 4;

  while(1)
  {
    bool     leapYear   = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
    uint16_t daysInYear = leapYear ? 366 : 365;
    if (days >= daysInYear)
    {
      dayOfWeek += leapYear ? 2 : 1;
      days      -= daysInYear;
      if (dayOfWeek >= 7)
        dayOfWeek -= 7;
      ++year;
    }
    else
    {
      tm->tm_yday = days;
      dayOfWeek  += days;
      dayOfWeek  %= 7;

      /* calculate the month and day */
      static const uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
      for(month = 0; month < 12; ++month)
      {
        uint8_t dim = daysInMonth[month];

        /* add a day to feburary if this is a leap year */
        if (month == 1 && leapYear)
          ++dim;

        if (days >= dim)
          days -= dim;
        else
          break;
      }
      break;
    }
  }

  tm->tm_sec  = seconds;
  tm->tm_min  = minutes;
  tm->tm_hour = hours;
  tm->tm_mday = days + 1;
  tm->tm_mon  = month;
  tm->tm_year = year;
  tm->tm_wday = dayOfWeek;
}
Was Schaltsekunden?
Nur wenn die Abwesenheit Ihrer Berechnung werden die zu einer großen Marge von Fehler (was ich bezweifle).
UTC und GPS-Zeit sind 16 Sekunden anders jetzt durch Schaltsekunden. Dies wird nicht variieren schnell. In anderen Worten, wenn Sie nur die Anzeige des aktuellen Datum, können Sie Sie ignorieren Schaltsekunden.
Wenn die Epoche, in der Zeit ist abgeleitet aus dem GPS-Modul, es wird wahrscheinlich Schaltsekunden entfielen - GPS-überträgt die Differenz zwischen GPS-und UTC-Zeit jeden 13.5 Minuten, die standard-NMEA0183-RMC-Satz die Zeit ist definiert als UTC-Zeit, nicht der GPS-Zeit, das Modul soll den offset vor der Ausgabe. GLONASS (Russisches GNSS) tracks Schaltsekunden und überträgt UTC-Zeit direkt von der Konstellation.
Ich bin nicht mit NMEA, aber das SiRF-binary-Protokoll. Es scheint, dass die 16 Sekunden sind auch entfiel hier die timestamp-ich komme aus dem Modul ist nur 1-2 Sekunden mit meinem NTP synchronisiert die Zeit auf meinem PC.

InformationsquelleAutor Geoffrey | 2014-02-06

Schreibe einen Kommentar