Преобразование символа в time_t всегда возвращает ср. De c 31 23:59:59 1969 - PullRequest
0 голосов
/ 03 марта 2020

Я работаю над кодом для моего ESP8266 в Arduino. Я хочу отправить метку времени другому ESP через UDP.

В setup(){ я инициализирую время, используя

configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov"); 

и в loop(){

time_t timestamp = time(nullptr);

чтобы получить время. Затем я отправляю его в другой ESP

Udp.write(ctime(&timestamp));

Где мне нужно снова сделать time_t, чтобы сравнить его с фактическим временем.

Но для целей тестирования я отправляю время как символ через терминал в UDP, используя echo -n "Fri Feb 28 14:44:11 2020" >/dev/udp/192.168.43.248/4210 из моего MacBook Pro (MacOS Mojave).

Последовательный монитор показывает, что на входе выводятся следующие данные:

UDP packet contents: Fri Feb 28 14:44:11 2020
Wed Dec 31 23:59:59 1969

Мой код:

time_t convertStringToTime_t(char timestamp []) {
  time_t result = time(NULL);
  const char *timestampString = timestamp;
  int weekDay, month, dd, hh, mm, ss, yyyy = 0;
  struct tm timestampFromString = {0};

  //input     Fri Feb 28 16:40:11 2020
  //output    Wed Dec 31 23:59:59 1969 TODO always same output?!

  sscanf(timestampString, "%s %s %d %d:%d:%d %d", &weekDay, &month, &dd, &hh, &mm, &ss, &yyyy);

  timestampFromString.tm_year = yyyy - 1900; //years since 1900
  timestampFromString.tm_mon = month - 1;
  timestampFromString.tm_wday = weekDay;
  timestampFromString.tm_mday = dd;
  timestampFromString.tm_hour = hh;
  timestampFromString.tm_min = mm;
  timestampFromString.tm_sec = ss;
  timestampFromString.tm_isdst = -1;

  result = mktime(&timestampFromString);
  // mktime   Convert tm structure to time_t
  return result;
}

Я видел эту ветку , но это мне совсем не помогло: / Я также пытался использовать sscanf, но без разницы. Я думаю, что я что-то не так делаю в scanf?

решено: Благодаря @thomachan я понял, что попытался поместить символы месяца + дня в целые числа (я мог бы решить это путем преобразования chars to ints).

Но я слушал @Maxim Egorushkin и использовал более простой подход, используя значение time_t:

char *buffer;
time_t i = strtoul(incomingPacket, &buffer, 10);

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Если вам не требуется удобочитаемое время, вы можете отправить значение time_t - количество секунд с Unix эпохи.

date +%s > /dev/udp/192.168.43.248/4210

Получатель может проанализировать его из строки до time_t с std::strtoul.

1 голос
/ 03 марта 2020

Если у вас есть выбор, я предлагаю вам вместо отметку времени ISO-8601 . Это выглядит как

2020-03-03T10:28:59

и тривиально анализируется с sscanf (который дает вам компоненты) или strptime (который заполняет struct tm). Если ваша платформа не обеспечивает реализацию strptime, вы можете использовать ее из BSD.

...