Если на ваши сервера приходят данные с Unix-временем , то предлагаю сделать доступным такой формат тоже во избежание излишних трансляций на каждом трейде для автоматизированных систем, коль скоро QLua тут для этого.
Добрый день. Правильно понимаем, что вы хотите, чтобы мы добавили новое поле unix_datetime, (например, на сделках или заявках) т.к. Вам не удобен формат Lua таблицы?
Egor Zaytsev написал: Правильно понимаем, что вы хотите, чтобы мы добавили новое поле unix_datetime, (например, на сделках или заявках)
да, а вы пропатчили 5.1 для long?
Цитата
Egor Zaytsev написал: т.к. Вам не удобен формат Lua таблицы?
дело не в удобстве - пара строк не проблема, а в лишних временных затратах на преобразование или сборку своих полей из таблицы для массовых скоплений можете сами проверить затраты на сотне тысяч записей: передернуть времена в long отжирает как быстрая сортировка
Если, как я понял, речь о целых числах в луа, так они как intptr_t определяются и на 64 битах должны быть 64-битные из коробки, а вот если заменить в заголовке на long, то получим внезапно 32 бита, ибо на винде long 32-битный. Или о другом чем-то?
Если, как я понял, речь о целых числах в луа, так они как intptr_t определяются и на 64 битах должны быть 64-битные из коробки, а вот если заменить в заголовке на long, то получим внезапно 32 бита, ибо на винде long 32-битный. Или о другом чем-то?
лично у меня нет таких вопросов - есть и более прямой способ
здесь предложение реализовать то, как это должно быть зачем плоскую инфу загонять в табличный вид который все равно потом нужно обратно в плоский вид ну пусть с сервера дают пока что в double чтобы обходиться без преобразования типов и структур потом в 5.3 это будет более просто в long
новичок написал: зачем плоскую инфу загонять в табличный вид
С этим-то согласен. Правда, есть сомнения, что едет оно в плоском виде, как бы не в текстовом. До сервера-то по фиксу точно в текстовом, дальше надо у арки (конфиденциальную инфу) выспрашивать, где оно у них в число превращается и превращается ли вообще.
Anton написал: где оно у них в число превращается и превращается ли вообще
не просто превращается, а в dat файлах оно у них уже в FILETIME формате те считай всё уже тут, а потом бац и ... /* ... во вторую смену ... (с) */ ... в табличку
ткчт и делать то особенно ничего не нужно - нужно просто кое-чего НЕ делать
новичок написал: не просто превращается, а в dat файлах оно у них уже в FILETIME формате
Можно тогда предположить, что едет в этом же формате. Это, так сказать, хорошая новость. А плохая - в дабл файлтайм как есть не полезет, там мантисса всего 52 бита, если ее всю заполнить единицами, будет 1615-04-10 11:59:22.737, что как бы малость не хватает. То есть конвертить все равно придется, либо в офисный формат, который в дабле (но парсить будет удовольствие то еще, плюс цель избежать сложной конвертации не достигается), либо урезать до микросекунд (делить файлтайм на 100), тогда максимум будет 3028-02-19 22:57:53.704, либо, как изначально предлагалось, в unix time, что по сути то же самое обрезание, только уже до секунд, вопросы и пожелания "отдайте микросекунды" гарантированы.
FIX: неправду выше написал. До микросекунд это делить файлтайм на 10, и максимум получится 1743-09-18 23:53:47.370, т.е. опять не хватает. Если предположить, что "время в десятках микросекунд" не удовлетворяет из-за "странности" единиц, придется резать до миллисекунд, т.е. делить на 10000.
Imersio Arrigo написал: тогда уж лутше в луа отдавать FILETIME (ежели прям без конверсий)
Выше написал, почему не получится. У луа 5.1 нет целого типа как такового, есть LUA_NUMBER, который double. А в double файлтайм не полезет.
Поразмышлял на эту тему и решил, что лучшим форматом был бы unixtime с микросекундами. Он лезет в double без потери точности и вычисляется из файлтайма достаточно легко:
Код
static int hibit(unsigned long long ull) throw () // нужно только для ассерта в отладочном режиме
{
int result = 0;
while((ull >>= 1) != 0)
++result;
return result;
}
double filetime_to_unix_time_with_microseconds(const ::FILETIME * pft) throw ()
{
assert(pft);
const unsigned long long uoffset = 116444736000000000ULL;
const unsigned long long ftime =
(static_cast<unsigned long long>(pft->dwHighDateTime) << 32) | pft->dwLowDateTime;
const unsigned long long utime = (ftime - uoffset) / 10;
assert(::hibit(utime) < 52);
return static_cast<double>(utime);
}
Anton написал: что лучшим форматом был бы unixtime с микросекундами.
Какой смысл, если все равно нужно конвертить? Ничем не лучше существующей схемы. А больше форматов - больше конвертаций. Если только для удобства получателя.
И еще, мне кажется, что полный "unixtime с микросекундами" в дабл не влезет. Можно раздельно сунуть unixtime, и отдельно микросекунды.
Imersio Arrigo написал: Проверил. В дабл входит вплоть до 2241 года. Потом начинаются проблемы с точностью :)
Ага, сам точную границу не искал, посмотрел только, что лет 200 влезает. Кстати, в моем коде надо в ассерте < заменить на <=, а то он уже на 52 битах сигналит, рановато.
С другой стороны, подумал о варианте с микросекундами отдельно. Тоже свои плюсы есть, часть с секундной точностью совпадает с форматом времени луа, что может быть удобно для кого-то, ну и в случае чего умножить на миллион и прибавить микросекунды не так и затратно. На один пуш в таблицу больше на стороне квика, на один поп больше на стороне скрипта. Не сказать, чтобы смертельная цена. Нужны еще мнения в общем, кому как кажется удобнее.
Imersio Arrigo написал: а) откуда уверенность что FILETIME
нету а..аще никакой :) , но ...
когда берем по адресу из .dat файла 8 байт как лонг и потом это делим на 10 млн и вычитаем 11644473600L, то хлоп .. и получается пхальное юникс_тайм в секундах
вот и подумалось могу быть неправ, ессно
Цитата
Imersio Arrigo написал: б) тогда уж лутше в луа отдавать FILETIME (ежели прям без конверсий)
ну с версии 5.3, когда будет лонг , то - да
Цитата
Imersio Arrigo написал: ну тогда всеравно в time_t конвертить нужно.
Anton написал: В фиксе как раз они самые, поле UTCTimestamp выглядит типа
бито-байты в железе и картинки на мониторе из табличек различаем? вам сиплюсплюс лоб напек наверное :)
а ..а, ну точно
Цитата
static int hibit(unsigned long long ull) throw () // нужно только для ассерта в отладочном режиме { int result = 0; while((ull >>= 1) != 0) ++result; return result; } double filetime_to_unix_time_with_microseconds(const ::FILETIME * pft) throw () { assert(pft); const unsigned long long uoffset = 116444736000000000ULL; const unsigned long long ftime = (static_cast<unsigned long long>(pft->dwHighDateTime) << 32) | pft->dwLowDateTime; const unsigned long long utime = (ftime - uoffset) / 10; assert(::hibit(utime) < 52); return static_cast<double>(utime); }
Egor Zaytsev написал: Добрый день. Правильно понимаем, что вы хотите, чтобы мы добавили новое поле unix_datetime, (например, на сделках или заявках) т.к. Вам не удобен формат Lua таблицы?
Если все же решите добавить это поле, не забудьте добавить и дробную часть (микросекунды)
Egor Zaytsev написал: Добрый день. Правильно понимаем, что вы хотите, чтобы мы добавили новое поле unix_datetime, (например, на сделках или заявках) т.к. Вам не удобен формат Lua таблицы?
Если все же решите добавить это поле, не забудьте добавить и дробную часть (микросекунды)
Egor Zaytsev написал: Добрый день. Сообщите, какое будем в итоге регистрировать пожелание?
Доступ к параметру _ дата_время _ в виде числа, а не таблицы/структуры.
Здравствуйте!
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.