Go Down

Topic: Mit MySQL Zeitstempel rechnen (Read 1 time) previous topic - next topic

6v6gt

. . .
GESUCHT:
. . .
2.) Den Zeitstempel 1534030927038 umformatieren in 12.08.2018 01:42:07,038
. . .
Das wäre in UTC oder im Lokalen Zeit mit der Zeitumstellung auf Sommerzeit ggf. Winterzeit.

themanfrommoon

Die Zeit, die gerade in Deutschland ist. Wie die jetzt genau definiert ist.....?

postmaster-ino

Hi

Bravo-Zeit (in Alpha-Zeitzone)

Oder wie meinen?
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

agmue

#18
Aug 12, 2018, 07:52 pm Last Edit: Aug 13, 2018, 08:57 am by agmue Reason: template ergänzt für ältere Kompiler (siehe im anderen Thema)
Wenn man Dein Programm mit der Ausgabe von 64 Bit Werten von combie verbindet, dann sieht man, daß strtoul() nicht tut, was Du erwartest.

Code: [Select]
const char NewTimestamp[] = "1534031527038", LastTimestamp[] = "1533845563400";
const size_t BufferSize = 64 + 1 + 1; // 64bit +Vorzeichen +NullByte
char buffer[BufferSize];

// combie: Ausgabe von 64 Bit Werten https://forum.arduino.cc/index.php?topic=563311.0
template<typename T> char* bigToStr(char* buffer, T value, uint8_t base = 10)
{
  bool negative = value < 0;
  if (negative) value *= -1LL;

  char* ptr = buffer + BufferSize;
  *(--ptr)  = 0;
  switch (base)
  {

    case  2: while (value) // BINARY
      {
        *(--ptr)  = '0' + (value & 0x01);
        value >>= 1;
      }
      break;

    case  8: while (value) // OKTAL
      {
        *(--ptr)  = '0' + (value & 0x07);
        value >>= 3;
      }
      break;

    case 16: while (value) // HEX
      {
        *(--ptr)  = '0' + (value & 0x0f);
        if (*ptr > '9') *ptr += 'A' - '9' - 1;
        value >>= 4;
      }
      break;

    default: while (value) // UNIVERSAL
      {
        uint8_t rest = value % base;
        *(--ptr)  = '0' + rest;
        if (*ptr > '9') *ptr += 'A' - '9' - 1;
        value /= base;
      }
      break;
  }
  if (negative)  *(--ptr)  = '-';
  return ptr;
}

//***************************************************************************************************************
void unixdiff(uint64_t neuerZeitstempel, uint64_t letzterZeitstempel) {
  uint64_t diff;
  uint8_t ms, ss, mm, hh;
  diff = neuerZeitstempel - letzterZeitstempel;
  ms = diff;
  ss = diff % 60;
  diff /= 60;
  mm = diff % 60;
  diff /= 60;
  hh = diff % 24;
  diff /= 24;
  Serial.print("          Differenz: ");
  Serial.print(bigToStr(buffer, diff));
  Serial.print(F("d "));
  Serial.print(hh); Serial.print(F("h "));
  Serial.print(mm); Serial.print(F("m "));
  Serial.print(ss); Serial.print(F("s "));
  Serial.print(ms); Serial.println(F("ms "));
}
//***************************************************************************************************************

void setup()
{
  Serial.begin(9600);
  uint64_t ts1 = strtoul(NewTimestamp, NULL, 13);
  uint64_t ts2 = strtoul(LastTimestamp, NULL, 13);
  Serial.print("      Aktuelle Zeit: ");
  Serial.print(NewTimestamp);
  Serial.print("   nach Umwandlung in Zahl: ");
  Serial.println(bigToStr(buffer, ts1));
  Serial.println("");
  Serial.print("Letzter Zeitstempel: ");
  Serial.print(LastTimestamp);
  Serial.print("   nach Umwandlung in Zahl: ");
  Serial.println(bigToStr(buffer, ts2));
  Serial.println("");
  unixdiff(ts1, ts2);
}

void loop() {}


      Aktuelle Zeit: 1534031527038   nach Umwandlung in Zahl: 4294967295

Letzter Zeitstempel: 1533845563400   nach Umwandlung in Zahl: 4294967295

          Differenz: d 0h 0m 0s 0ms

Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

postmaster-ino

Hi

Da Du nur die unteren 32 Bit benutzt (und Diese wohl gesetzt sind), kommt diese Zahl heraus.
4294967295 = 2^32-1 (der Linux-Taschenrechner hat direkt eine Anzeige in Binär/Hex/Octal)

Von der Theorie her müsste der combie-Code laufen - zwar schon 'weg kopiert', aber noch unbespielt.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

agmue

#20
Aug 13, 2018, 08:53 am Last Edit: Aug 13, 2018, 09:00 am by agmue
Von der Theorie her müsste der combie-Code laufen ...
Auch in der Praxis, danke dafür :)

Da Du nur die unteren 32 Bit benutzt ...
Da strtol nicht ausreicht, würde man strtoll (string to long long) benötigen. Auf die Schnelle habe ich nichts Passendes gefunden, daher werkelt nun my_strtoll:

Code: [Select]
const char NewTimestamp[] = "1534031527038", LastTimestamp[] = "1533845563400";
const size_t BufferSize = 64 + 1 + 1; // 64bit +Vorzeichen +NullByte
char buffer[BufferSize];

// combie: Ausgabe von 64 Bit Werten https://forum.arduino.cc/index.php?topic=563311.0
template<typename T> char* bigToStr(char* buffer, T value, uint8_t base = 10)
{
  bool negative = value < 0;
  if (negative) value *= -1LL;

  char* ptr = buffer + BufferSize;
  *(--ptr)  = 0;
  switch (base)
  {

    case  2: while (value) // BINARY
      {
        *(--ptr)  = '0' + (value & 0x01);
        value >>= 1;
      }
      break;

    case  8: while (value) // OKTAL
      {
        *(--ptr)  = '0' + (value & 0x07);
        value >>= 3;
      }
      break;

    case 16: while (value) // HEX
      {
        *(--ptr)  = '0' + (value & 0x0f);
        if (*ptr > '9') *ptr += 'A' - '9' - 1;
        value >>= 4;
      }
      break;

    default: while (value) // UNIVERSAL
      {
        uint8_t rest = value % base;
        *(--ptr)  = '0' + rest;
        if (*ptr > '9') *ptr += 'A' - '9' - 1;
        value /= base;
      }
      break;
  }
  if (negative)  *(--ptr)  = '-';
  return ptr;
}

//***************************************************************************************************************
void unixdiff(uint64_t neuerZeitstempel, uint64_t letzterZeitstempel) {
  uint64_t diff;
  uint32_t ms, ss, mm, hh;
  diff = neuerZeitstempel - letzterZeitstempel;
  Serial.print("          Differenz: ");
  Serial.print(bigToStr(buffer, diff));
  Serial.print('\t');
  ms = diff % 1000;
  diff /= 1000;
  ss = diff % 60;
  diff /= 60;
  mm = diff % 60;
  diff /= 60;
  hh = diff % 24;
  diff /= 24;
  Serial.print(bigToStr(buffer, diff)); Serial.print(F("d "));
  Serial.print(hh); Serial.print(F("h "));
  Serial.print(mm); Serial.print(F("m "));
  Serial.print(ss); Serial.print(F("s "));
  Serial.print(ms); Serial.println(F("ms "));
}
//***************************************************************************************************************

uint64_t my_strtoull(const char* zeichenkette)
{
  uint64_t wert = 0;
  byte j = 0;
  do
  {
    wert *= 10;
    wert += zeichenkette[j] - '0';
    j++;
  } while (zeichenkette[j] != '\0');
  return wert;
}

void setup()
{
  Serial.begin(9600);
  uint64_t ts1 = my_strtoull(NewTimestamp);
  uint64_t ts2 = my_strtoull(LastTimestamp);
  Serial.print("      Aktuelle Zeit: ");
  Serial.print(NewTimestamp);
  Serial.print("   nach Umwandlung in Zahl: ");
  Serial.println(bigToStr(buffer, ts1));
  Serial.println("");
  Serial.print("Letzter Zeitstempel: ");
  Serial.print(LastTimestamp);
  Serial.print("   nach Umwandlung in Zahl: ");
  Serial.println(bigToStr(buffer, ts2));
  Serial.println("");
  unixdiff(ts1, ts2);
}

void loop() {}


      Aktuelle Zeit: 1534031527038   nach Umwandlung in Zahl: 1534031527038

Letzter Zeitstempel: 1533845563400   nach Umwandlung in Zahl: 1533845563400

          Differenz: 185963638 2d 3h 39m 23s 638ms
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

uwefed

#21
Aug 13, 2018, 12:15 pm Last Edit: Aug 13, 2018, 12:15 pm by uwefed
1) auf welchem System sind wir denn eigentlich?
2) Arduino:  Eine RTC hat keine Ausgabe sondern nur Sekunden. Darum gibt es keineen Timestamp mit ms.

Wie willst Du die Differenz zweiere Timestamps mit ms machen wenn Du auf dem System keine ms hast??

Grüße Uwe

themanfrommoon

Quote
1) auf welchem System sind wir denn eigentlich
Zitier ich mich mal selber aus #10:


Quote
...eine S0 Wasseruhr mit einem volkszaehler.org smartmetering auf einem Raspberry Pi 3 logge, dieser über den vzlogger und einer Middleware die Daten in eine MySQL Datenbank speichert. Der vzlogger die Daten zusätzlich über einen Push Server über node-RED an einen MQTT Broker pusht und ich mit einem ESP8266 die Daten vom MQTT Broker subscribe. Und da kommen dann die im Eingangpost erwähnten timestamps her...
Wir sind also auf einem ESP8266 und der Zeitstempel stammt aus einer MySQL Datenbank.

Lieben Gruß,
Chris

uwefed

Ich habe verstanden, daß die Zahl aus einer MySQL Datenbank kommt. Aber woher kommt die Zeit die in die DB geschrieben wird??

Grüße Uwe

themanfrommoon

Ich vermute das die middleware den erzeugt?! Die middleware organisiert sämtliche Kommunikation mit der Datenbank. Die läuft auf dem Raspberry Pi.

combie

#25
Aug 13, 2018, 12:49 pm Last Edit: Aug 13, 2018, 12:52 pm by combie
MYSQL Zeitstempel werden in der Regel vom DBMS selber erzeugt/verwaltet.
Ohne Zutun des Benutzers, oder der Anwendung.
Bei jedem INSERT oder UPDATE Statement
Die Tabellendefinition (CREATE Statement) gibt Auskunft darüber, ob das so ist.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

themanfrommoon

So, nun konnte ich es mir endlich anschauen.
Wow, sehr geil!

Vielen Dank dafür, funktioniert wirklich sehr gut. :-)

Lieben Gruß,
Chris

Go Up