Автор |
Тема: Loaddir | вpемя последней модификации (Прочитано 19180 раз) |
|
box_vma
Я люблю этот Форум!
Просмотреть Профиль |
Сообщений: 49
|
|
Loaddir | вpемя последней модификации
« В: 06.03.20 в 13:35:41 » |
Цитировать | Править
|
Добрый день! Подскажите, кто знает. Из документации: Оператор loaddir заносит в extrd.dat время последней модификации файла в виде числа, возвращаемого Windows. Как распаковать это число, чтобы работать с обычными единицами времени. Решение: Windows возвращает упакованное время в 32-битном числе; здесь показано назначение битовых полей: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |-year------| |-mon-| |-day---| |-hour--| |-min-----| |-sec---| Ниже показан пример распаковки. Обратите внимание, что для хранения секунд используется только 5 бит (числа от 0 до 31), поэтому время сохраняется с точностью две секунды. Для хранения года используется 7 бит (числа от 0 до 127), там указывается год минус 1980. loaddir [dir 0]+'*.rpt' t=[ged 'ldt.1'] Packed time: ^^^^^^^^^^^^^^^t se=(t % 32)*2 Sec: ^se t=[tr t/32]; mi=t % 64 Min: ^mi t=[tr t/64]; ho=t % 32 Hour: ^ho t=[tr t/32]; da=t % 32 Day: ^da t=[tr t/32]; mo=t % 16 Month: ^mo ye=t/16+1980 Year: ^^^ye Дата модификации файла 06.03.2020 14:32 (Правый нижний угол FAR) При использовании рекомендации по распаковке в ФБП выдает следующую информацию: Packed time: 1583494351 Sec: 30 Min: 38 Hour: 6 Day: 2 Month: 3 Year: 2027 Как корректно распаковать дату модификации файла? Спасибо.
|
|
Зарегистрирован |
|
|
|
Boris, Kiev.
Адепт ФБП с 1996г.
Просмотреть Профиль | E-мэйл
Сообщений: 875
|
|
Re: Loaddir | вpемя последней модификации
« Ответить #1 В: 06.03.20 в 19:04:24 » |
Цитировать | Править
|
Вот эта п.п. работает давненько. ... TI=[ged 'ldt.1'];call F_TI_CR TI:^^^^^^^^^^^^^^^^^^^^^^^^^^^^TI ... stop :F_TI_CR local T,S,I,H,D,M,Y *t=TI *Packed time: ^^^^^^^^^^^^^^^t T=TI+2*64*64 *Packed time2: ^^^^^^^^^^^^^^^t S=(T%32)*2 *Sec: ^S t:^^^^^^^^^^^^^T T=[tr T/32]; I=T%64 *Min: ^I t:^^^^^^^^^^^^^T T=[tr T/64]; H=T%32-2 *Hour: ^h t:^^^^^^^^^^^^^T T=[tr T/32]; D=T%32 *Day: ^d t:^^^^^^^^^^^^^T T=[tr T/32]; M=T%16 *Month: ^M t:^^^^^^^^^^^^^T Y=T/16+1980 *Year: ^^^^Y TI=[cp [intsn 100+D],2,2]+'.'+[cp [intsn 100+M],2,2]+'.'+[intsn Y]+' '+[cp [intsn 100+H],2,2]+':'+[cp [intsn 100+I],2,2] TI:^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^TI *stop return
|
|
Зарегистрирован |
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
|
Re: Loaddir | вpемя последней модификации
« Ответить #2 В: 07.03.20 в 02:26:12 » |
Цитировать | Править
|
on 06.03.20 в 13:35:41, box_vma wrote:Добрый день! Подскажите, кто знает. ... |
| Из разряда "не знаю, но всё-равно подскажу" Поштурмовал я немного Гугл по теме, ничего сильно внятного не накопал, из обрывков информации сляпал формочку, как информацию к размышлениям. В общем, вот: * UTC TIMESTAMP EXPERIMENT Предположим, что 1970.01.01 00:00 это начало эпохи принимаемое за 0. От 0 до нашего момента прошла 1583494351 секунда. Предположим также, что : 1 минута = 60 сек. 1 час = 3600 сек. 1 день = 86400 сек. 1 месяц = 2629743 сек. 1 год = 31556926 сек. А также, что 1 мес = 30.43522 дн. в среднем 1 дн. = 24 ч. 1 год = 12 мес. ________________________________________ IN=1583494351 * MI=60 HR=3600 DY=86400 MN=2629743 YY=31556926 * DM=30.43522 * DH=24 * MY=12 * Сколько лет надо прибавить к началу эпохи: YP=[TR IN/YY] ^^^^^^^^^^^^^^YP Проверяем: +1970 YN=1970+YP ^^^^^^^^^^^^^^YN (1-й элемент даты) __________________________________________ Сколько месяцев надо прибавить к началу эпохи: MP=[TR IN/MN]-(YP*MY) ^^^^^^^^^^^^^^MP Проверяем: +01 MM=1+MP ^^^^^^^^^^^^^^MM (2-й элемент даты) __________________________________________ Сколько дней надо прибавить к началу эпохи: DP=[TR IN/DY]-[TR IN/MN]*DM ^^^^^^^^^^^^^^DP Проверяем: +01 DD=1+DP ^^^^^^^^^^^^^^DD (3-й элемент даты) __________________________________________ Сколько часов надо прибавить к началу эпохи: HP=[TR IN/HR]-[TR IN/DY]*DH ^^^^^^^^^^^^^^HP (4-й элемент даты) __________________________________________ Сколько минут надо прибавить к началу эпохи: MT=[TR IN/MI]-[TR IN/HR]*MI ^^^^^^^^^^^^^^MT (5-й элемент даты) __________________________________________ Сколько секунд еадо прибавить к началу эпохи: SE=IN-[TR IN/MI]*MI ^^^^^^^^^^^^^^SE (6-й элемент даты) __________________________________________ Дата: DA=[INTSN YN]+'.' TT='0'+[INTSN MM] TT=[CP TT,([LENGTH TT]-1),2] DA=DA+TT+'.' TT='0'+[INTSN DD] TT=[CP TT,([LENGTH TT]-1),2] DA=DA+TT+' ' TT='0'+[INTSN HP] TT=[CP TT,([LENGTH TT]-1),2] DA=DA+TT+':' TT='0'+[INTSN MT] TT=[CP TT,([LENGTH TT]-1),2] DA=DA+TT+':' TT='0'+[INTSN SE] TT=[CP TT,([LENGTH TT]-1),2] DA=DA+TT+' UTC' ^^^^^^^^^^^^^^^^^^^^^^DA Если ваше время 14:32 значит вы в часовом поясе UTC + 3 С самим loaddir не стал морочиться, ведь вопрос не в нём, а в интерпретациях выдаваемой строки штампа даты-времени.
|
|
Зарегистрирован |
|
|
|
box_vma
Я люблю этот Форум!
Просмотреть Профиль |
Сообщений: 49
|
|
Re: Loaddir | вpемя последней модификации
« Ответить #3 В: 07.03.20 в 09:01:21 » |
Цитировать | Править
|
Спасибо. Результат работы формы предложенной Boris, Kiev: TI:02.03.2027 08:38, что не совсем верно Результат работы формы предложенной mine-R 2020.03.06 11:32:31 UTC, верный результат Еще раз спасибо.
|
|
Зарегистрирован |
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
|
Re: Loaddir | вpемя последней модификации
« Ответить #4 В: 07.03.20 в 12:09:19 » |
Цитировать | Править
|
Добавлю, что переменная MI в 5-м и 6-м элементах даты несет разную семантическую нагрузку. Просто и в минуте 60 секунд, и в часе 60 минут, вот я по рассеянности и лени не поинициализировал дополнительную переменную в 60. Да и лишний TR думаю не помешает в 3-м элементе, чтобы было [TR[TR IN/DY]*DM] да и полно наверное ещё корявостей.. А вот дополнение ведущих нулей у Бориса в виде [cp [intsn 100+D],2,2] это изящненько. И по скорости должно выиграть. Возьму себе на заметку.
|
« Изменён в : 07.03.20 в 12:11:23 пользователем: mine-R » |
Зарегистрирован |
|
|
|
Boris, Kiev.
Адепт ФБП с 1996г.
Просмотреть Профиль | E-мэйл
Сообщений: 875
|
|
Re: Loaddir | вpемя последней модификации
« Ответить #5 В: 07.03.20 в 16:34:53 » |
Цитировать | Править
|
on 07.03.20 в 09:01:21, box_vma wrote:Спасибо. Результат работы формы предложенной Boris, Kiev: TI:02.03.2027 08:38, что не совсем верно |
| Мои извинения. Наши сервера меняли формат времени в loaddir. Вам предложен фрагмент из рабочих форм и который пашет c последней версией новогоднего адаптера ФБП версии 4.22. ВВОДИМ КУРСЫ С ОФИЦИАЛЬНОЙ СТРАНИЦЫ НАЦ.БАНКА УКРАИНЫ Интересуют курсы НБУ на 07.03.2020 Клиент получил файл ответа НБУ -----------------------------------Размер-----Изменен--------- -[F8]-| |L:\_BOX-19_\_ny_\AD\KURSFINT-AD.XML | 11232| 07.03.2020 07:38|- [F8] - для удаления имеющегося файла --> для обновления или ввода курсов на другую дату. -----------------курсы НБУ из интернет. ----------в нашем ЖО RUB - 0.37148 на 07.03.2020 === 0.371480 USD - 24.74130 на 07.03.2020 === 24.741300 TRY - 4.06070 на 07.03.2020 === 4.060700 EUR - 27.69420 на 07.03.2020 === 27.694200 Текущие курсы в системе соответствуют НБУ на 07.03.2020
|
« Изменён в : 07.03.20 в 17:33:20 пользователем: Boris, Kiev. » |
Зарегистрирован |
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
|
Re: Loaddir | вpемя последней модификации
« Ответить #6 В: 07.03.20 в 17:34:11 » |
Цитировать | Править
|
Заморочился таки с настройкой ярлыков под сеть и с самим loaddir Подтверждаю, на сервере 3.28 подпрограмма Бориса и стандартный алгоритм из документации отрабатывают отлично. Но и штамп даты-времени для 6 марта 2020 там соответственно выглядит так: 1282429190 Осталось понять с какой версии сменился алгоритм..
|
« Изменён в : 07.03.20 в 18:12:04 пользователем: mine-R » |
Зарегистрирован |
|
|
|
Boris, Kiev.
Адепт ФБП с 1996г.
Просмотреть Профиль | E-мэйл
Сообщений: 875
|
|
Re: Loaddir | вpемя последней модификации
« Ответить #7 В: 07.03.20 в 19:25:59 » |
Цитировать | Править
|
on 07.03.20 в 17:34:11, mine-R wrote: Осталось понять с какой версии сменился алгоритм.. |
| Другого подобного прецедента в версиях не припоминаю. Да, и честно, мало была востребована эта функция. На сегодня пользую 4.22(сервер-новогодний адаптер) и 4.40(сервер). Глубже 10-ти лет уже и не помню запуска баз. Т.к. есть [VER], правда она не стыкуется с оф.версиями, но отличается в адаптере- 4, на сервере- 4.4, поэтому можно такую универсальную п.п. сделать для адаптера и сервера: :UNIX_TIM2 * входит TI-unix время. local KD,M,Y,DS,DD,HH,MM,SS * https://www.cy-pr.com/tools/time/ - ЭТО ПРО unix - время. *Packed time: *TI:^^^^^^^^^^^^^^^^^ti if [ver]=4.0 call F_TI_CR;return;endif TI=TI+2*60*60 ЭТО НАША МЕСТНАЯ ПОПРАВКА НА 2 ЧАСА TI=TI-657417600(ЭТО НАЧАЛО ЭРЫ ХАКЕРС ДИЗАЙН 1.11.1990 ГОДА) *ti;^^^^^^^^^^^^ti KD=[tr TI/(24*60*60)] кол-во целых дней *KD:^^^^^KD^^^ TI=TI-KD*24*60*60) *TI:^^^^^^^^TI HH=[tr TI/60/60] *HH:^^^HH TI=TI-HH*60*60 *TI:^^^^^TI MM=[tr TI/60] *MM:^^^^MM SS=TI-MM*60 *SS:^^SS DD=[antida KD+1] чтобы не морочиться с днями и месяцами DD=[sn DD,9,2] *DD;^^^^^^^^^^DD D=[vl [cp DD,8,2]] M=[vl [cp DD,5,2]] Y=[vl [cp DD,1,4]] TI=[cp [intsn 100+D],2,2]+'.'+[cp [intsn 100+M],2,2]+'.'+[sn Y,4,0]+' '+[cp [intsn 100+HH],2,2]+':'+[cp [intsn 100+MM],2,2]+':'+[cp [intsn 100+SS],2,2] return Попробуйте.
|
|
Зарегистрирован |
|
|
|
mine-R
compact & flexible rulezzz
Просмотреть Профиль |
Сообщений: 150
|
|
Re: Loaddir | вpемя последней модификации
« Ответить #8 В: 07.03.20 в 20:20:31 » |
Цитировать | Править
|
on 07.03.20 в 19:25:59, Boris, Kiev. wrote: Работает! Это конечно намного более оптимизированный алгоритм, чем моя форма-размышление. Я бы ещё сделал вот так: if [ver]<=4.0 но это уже опционально.
|
|
Зарегистрирован |
|
|
|
|
|