Как сравнить строки даты по Гринвичу на Embedded - PullRequest
0 голосов
/ 07 июня 2019

Мне нужно сравнить две даты по времени по Гринвичу. Мне нужно только знать, больше ли первая дата, чем вторая, не нужно diff. Я работаю на STM32 и работа должна быть легкой и быстрой.

Должен ли я использовать некоторые функции из стандартных библиотек (для этого есть функция time.h я не видел?) Или написать собственную функцию для сравнения?

Существует формат даты (форматы всегда будут идентичны):

const char[] d1 = "Tuesday, 04-Jun-2019 21:20:59 GMT";
const char[] d2 = "Thursday, 06-Jun-2019 20:14:27 GMT";
bool d1GreaterThanD2 = ...;

Спасибо за ваш совет, я пишу функцию для анализа этого формата даты и времени в tm структуру из time.h и отдельную функцию для сравнения. Если кто-то хочет увидеть это решение здесь: https://github.com/galczakit/datetime

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Сложность в этой проблеме состоит в том, что форматы даты представлены в виде строки, а не упорядоченного набора данных (например, дата была бы объявлена ​​как структура, и она могла бы иметь такие поля, как месяц, дата, год, время, часовой пояс ). Решение будет двухступенчатым -

  1. Напишите функцию для преобразования этой строки в упорядоченный набор данных. (Хитрая часть). Здесь следует учитывать множество тестовых случаев, в том числе пропуск пробелов, кодирование часовых поясов, месяца и дня. Чтобы получить день, создайте подстроку от начала строки данных до места появления первой запятой. Сравните его с набором дней {"понедельник", "вторник" ...} (используйте strstr) для генерации дня. Дата и время будут иметь фиксированное смещение, если мы отбросим имя дня и запятую. Это довольно просто отсюда. Напишите отдельные парсеры для даты и времени сейчас. Было бы целесообразно сначала собрать несколько тестовых примеров, прежде чем писать синтаксический анализатор.

  2. Напишите функцию для сравнения двух упорядоченных наборов данных и верните истину / ложь в зависимости от того, больше ли первая дата, чем вторая, или нет. (Рассмотрим случаи, когда даты тоже равны)

Это может быть не самая быстрая реализация, но может повторно использовать некоторый код. Реализация досрочного выхода, описанная выше, выполняется быстрее

1 голос
/ 07 июня 2019

Если вы знаете, что точный формат и скорость важны, тогда напишите свой собственный, так как вы сможете быстро выйти из него. Например, вы можете взять «дата-месяц-год» и сравнить сначала год, если они совпадают, вы можете сравнить месяц и т. Д., Только если все 3 совпадают, вам нужно посмотреть на время.

Вы просто устанавливаете указатели на начало даты, начало месяца и начало года. Единственная сложная часть - это месяц, который вы должны преобразовать из ASCII в числа. Дата и год - просто сравнение символов.

...