Сравнение дат.

Страницы: 1
RSS
Сравнение дат.
 
Всем добрый день. Как корректнее и надежнее сравнивать даты на Lua, как числа или как строки?
Пример: Получаем две даты:

os_date = os.date ("%Y%m%d")                                                                                                               -- текущая дата операционной системы (ОС)

local t = getCandlesByIndex (CHART_TAG_PRICE, 0, number - INT_QUANTITY, INT_QUANTITY)                   -- получение таблицы свечей заданного периода
local date_candle = dateCandle (t[j].datetime.year, t[j].datetime.month, t[j].datetime.day)                               -- получение даты свечи

function dateCandle (year, month, day)                                                                                                      -- функция формирования даты свечи (number)
  local candle_date = 10000 * year + 100 * month + day
  return candle_date
end

При сравнении: if date_candle == os_date then, переводить date_candle в string (изначально формировать в string)  или os_date переводить в number?
 
http://www.bot4sale.ru/blog-menu/qlua/368-lua-time.html
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
http://www.bot4sale.ru/blog-menu/qlua/368-lua-time.html
Я не нашёл там ответа на свой вопрос. Там описание работы со временем и датами. Вы ту ссылку дали?
 
Еще раз поясню попроще.  Есть две даты, которые изображены цифрами, а не словами. Например: 20190422. Эти даты можно преобразовать в string или number и сравнивать оператором "==".
То есть string == string и number  == number ("20190422" == "20190422" и 20190422 == 20190422)
Работают оба варианта.
Какой из этих двух вариантов правильнее, корректнее, надежнее?

пс Вопрос, конечно, не сильно критичный, но я подумал, что мало ли кто разбирался и знает.
 
Игорь М,
При сравнении даты и времени, самый правильный и надежный способ, перевести дату в число дней (для времени секунд) и далее уже сравнивать.
 
Цитата
Sergey Gorokhov написал:
Игорь М,
При сравнении даты и времени, самый правильный и надежный способ, перевести дату в число дней (для времени секунд) и далее уже сравнивать.
А что это меняет и как таки их корректно сравнивать? Можно от дат и времени абстрагироваться, это был просто пример из практики.
Как правильнее и надежнее в Lua сравнивать оператором "==" переменные, которые могут быть и string и number?  Переводить обе (или одну из них) в string и затем сравнивать строки или переводить в number и сравнивать числа? Я склоняюсь на сравнение чисел, но для меня это не очевидно, поэтому и спрашивал.
 
Цитата
Игорь М написал:
string и затем сравнивать строки
- любые конверсии из типа в тип стоят немало, замерьте ваш случай численно.
- строки в принципе неприятная штука, лучше обходиться массивом символов по возможности.
 
Цитата
новичок написал:
 - любые конверсии из типа в тип стоят немало, замерьте ваш случай численно.
- строки в принципе неприятная штука, лучше обходиться массивом символов по возможности.
В моем случае лишние конверсии не являются критичными, да и когда нужно сравнить две переменные разных типов одну из них в любом случае придется переводить в тип второй. Поэтому я и озадачился выбором в какой тип предпочтительнее переводить для сравнения. В общем-то вопрос более теоретический, чем прикладной, так как потенциальных косяков в программе и окружении на порядок больше, чем эта мелочь.
 
Цитата
Игорь М написал:
вопрос более теоретический
Строки сравниваются в лексикографическом порядке, т.е. посимвольно слева направо. Так как "0" < "1" < ... < "9", то при использовании строкового формата даты "YYYYMMDD" сравнение будет корректным. Вывод: в данном случае использование как числового, так и символьного представления будет работать одинаково правильно. Такая теория интересовала?
 
Цитата
SDL написал:
 Строки сравниваются в лексикографическом порядке, т.е. посимвольно слева направо. Так как "0" < "1" < ... < "9", то при использовании строкового формата даты "YYYYMMDD" сравнение будет корректным. Вывод: в данном случае использование как числового, так и символьного представления будет работать одинаково правильно. Такая теория интересовала?
В общем меня интересовал вопрос: для какого из двух сравнений string ==  string и number == number вероятность потенциальной ошибки результата  сравнения выше и почему?
Я склоняюсь к сравнению числовых представлений, потому что такой вот скрипт:
 
Скрытый текст
дает вот такой результат:

Скрытый текст
Но, возможно, что существуют контрпримеры.
 
Цитата
Игорь М написал:

    val_1 = 20190425.00000001
Целые числа в формате Lua "number" (он же C "double"), равно как и результаты операций +/- с ними, согласно особенностям IEEE 754, представляются точно. Поэтому просто не надо допускать невязок округления, и с целыми числами можно работать спокойно. А если невязки неизбежны, делать round().
 
Цитата
SDL написал:
 Целые числа в формате Lua "number" (он же C "double"), равно как и результаты операций +/- с ними, согласно особенностям IEEE 754, представляются точно. Поэтому просто не надо допускать невязок округления, и с целыми числами можно работать спокойно. А если невязки неизбежны, делать round().
Это понятно, я с вами согласен. Резюмируя: универсального выбора, в каком виде лучше сравнивать, судя по всему нет. Я думал, что строковое сравнение должно быть всегда надежнее, но, оказалось, что не всегда.

Если сравнивать в лоб без преобразований с округлениями, разделениями строк и т.п., то значения переменных вида: 20190425.00000001 == 20190425 надежнее сравнивать в числах, а значения переменных вида: 201904251234567.1 == 201904251234567 - в строках. При этом сравнение 20190425123456.01 == 20190425123456 лучше опять делать в числах, а 20190425123456.001 == 20190425123456 лучше, вообще, не сравнивать - неправильный результат в обоих случаях.
Страницы: 1
Читают тему
Наверх