Цитата |
---|
Sergey Gorokhov написал: Здравствуйте, Да в случае с SERVERTIME могут быть пропуски. надежней всего использовать следующий код Код |
---|
base_time = "14:25:58"
stime = tostring(GetInfoParam( "SERVERTIME" ))
function FixTime (V)
V = tostring(V)
local Out = os.date ( "!*t" , os.time ())
local len = string.len (V)
if len > 6 then
Out.hour,Out.min,Out.sec = string.match (V,"(%d%d)%p(%d%d)%p(%d%d)")
elseif len = = 6 then
Out.hour,Out.min,Out.sec = string.match (V,"(%d%d)(%d%d)(%d%d)")
elseif len = = 5 then
Out.hour,Out.min,Out.sec = string.match (V,"(%d)(%d%d)(%d%d)")
end
return Out
end
if os.time (FixTime(stime)) > = os.time (FixTime(base_time)) then
message ( "Hello World" )
end |
|
Поскольку гугл привел сюда, то тут и задам вопрос.
Лирика: ваша FixTime (V) избыточна применительно к проверкам такого рода совместно с GetInfoParam( "SERVERTIME" ). Просто убрать два двоеточия гораздо быстрее, а смысл тот же.
По делу:
Давно не пользовался GetInfoParam( "SERVERTIME" ), потому, как она не работала как нужно, намучился в свое время.
Легче отправить транзакцию и получить ошибку и уже эту ошибку обработать, чем заранее пользоваться ограничением по времени: сессия идет или нет. Но понадобилось чуть раньше тормозить робота, чем начнется клиринг.
Решил сегодня сделать проверку GetInfoParam( "SERVERTIME" ) - а вдруг вы починили?
На что я рассчитывал, сущеглупый...
Вот тут сразу две ваши функции: getInfoParam("SERVERTIME") и getInfoParam("LASTRECORDTIME"). Если с LASTRECORDTIME все понятно и от нее нечего особо ждать, то SERVERTIME обязана работать точно:
SERVERTIME == (время ПК +- пару секунд +- часовой пояс). (про провайдера мне не стоит упоминать, сейчас не 2000г. и в моем городе их штук 6 - убьют любого за клиента)
10:29:54.176739 Debug: OnConnected flag true
10:29:56.996268 Debug: servertime; 8:45:00; lastrecordtime; 8:45:00
10:29:57.006266 Debug: servertime; 8:45:00; lastrecordtime; 8:45:00
10:29:57.015929 Debug: servertime; 10:29:15; lastrecordtime; 10:29:15
10:29:57.015929 Debug: servertime; 10:29:15; lastrecordtime; 10:29:15; offset_tm; -42
После соединения с сервером (а OnConnected всегда запаздывает на 2 секунды от реального времени соединения) проходит еще почти 3 секунды, в ожидании, что LASTRECORDTIME == SERVERTIME.
После чего ваш сервер посылает время последней записи, которое чудесным образом начинает совпадать со временем сервера и происходит скачек из прошлого, но не в настоящее, а в недалекое прошлое.
Каждую строку записи разделяет минимум sleep(1) в цикле.
Реальная разница между временем моего ПК и серверным +- 2 сек, всегда, на протяжении 10 последних лет. А тут -42 секунды!, и это еще так себе, и по 5000++ секунд бывает, зависит от времени нахождения в дисконекте и времени наступления этого дисконекта.
Сие знание про +-2 секунды - не стандарт и характерно только в связке "мой ПК и ваш сервер" и не может быть использовано где то еще, например, на ПК Васи Пупкина могут быть +-10 сеунд
И вычислять это нет никакого желания, потому как "васей" много и у каждого свое.
Хочется взять время сервера и ПК в секундах и получить нужное смещение -offset_tm, а дальше в коде использовать как: curr_tm = os.time() + offset_tm
Внимание, ВОПРОСЫ!
Откуда берет значение getInfoParam("SERVERTIME")?
Через какое МИНИМАЛЬНОЕ время после соединения с вашим сервером ГАРАНТИРОВАННО можно понять, что данные получаемые с сервера корректны (время ПК +- пару секунд +- часовой пояс), а не далекое прошлое, как в примере выше?