Финансы без пpоблем: Пеpеговоpный Пункт II (http://hdru.com/cgi-bin/pp2/YaBB.cgi)
>> Общий pаздел >> Loaddir | вpемя последней модификации
(Message started by: box_vma на 06.03.20 в 13:35:41)

Заголовок: Loaddir | вpемя последней модификации
Прислано пользователем box_vma на 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

Как корректно распаковать дату модификации файла?
Спасибо.

Заголовок: Re: Loaddir | вpемя последней модификации
Прислано пользователем Boris, Kiev. на 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


Заголовок: Re: Loaddir | вpемя последней модификации
Прислано пользователем mine-R на 07.03.20 в 02:26:12

on 03/06/20 в 13:35:41, box_vma wrote:
Добрый день!
Подскажите, кто знает.
...


Из разряда "не знаю, но всё-равно подскажу"  :D :D

Поштурмовал я немного Гугл по теме, ничего сильно внятного не накопал, из обрывков информации сляпал формочку, как информацию к размышлениям. В общем, вот:




* 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 не стал морочиться, ведь вопрос не в нём, а в интерпретациях выдаваемой строки штампа даты-времени.

Заголовок: Re: Loaddir | вpемя последней модификации
Прислано пользователем box_vma на 07.03.20 в 09:01:21
Спасибо.

Результат работы формы предложенной Boris, Kiev:
TI:02.03.2027 08:38, что не совсем верно

Результат работы формы предложенной mine-R
2020.03.06 11:32:31 UTC, верный результат

Еще раз спасибо.





Заголовок: Re: Loaddir | вpемя последней модификации
Прислано пользователем mine-R на 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]

это изящненько. И по скорости должно выиграть. Возьму себе на заметку.

Заголовок: Re: Loaddir | вpемя последней модификации
Прислано пользователем Boris, Kiev. на 07.03.20 в 16:34:53

on 03/07/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

Заголовок: Re: Loaddir | вpемя последней модификации
Прислано пользователем mine-R на 07.03.20 в 17:34:11
Заморочился таки с настройкой ярлыков под сеть и с самим loaddir
Подтверждаю, на сервере 3.28 подпрограмма Бориса и стандартный алгоритм (http://hdru.com/OLD_WWW/messages/3499.htm ) из документации отрабатывают отлично.
Но и штамп даты-времени для 6 марта 2020 там соответственно выглядит так:
1282429190

Осталось понять с какой версии сменился алгоритм..

Заголовок: Re: Loaddir | вpемя последней модификации
Прислано пользователем Boris, Kiev. на 07.03.20 в 19:25:59

on 03/07/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

Попробуйте.

Заголовок: Re: Loaddir | вpемя последней модификации
Прислано пользователем mine-R на 07.03.20 в 20:20:31

on 03/07/20 в 19:25:59, Boris, Kiev. wrote:
...
Попробуйте.

Работает!   :)
Это конечно намного более оптимизированный алгоритм, чем моя форма-размышление.
Я бы ещё сделал вот так:
if [ver]<=4.0
но это уже  опционально.

Заголовок: Re: Loaddir | вpемя последней модификации
Прислано пользователем box_vma на 10.03.20 в 08:11:13
Спасибо. Все работает!!!



Powered by YaBB 1 Gold - SP 1.3.2!
Forum software copyright й 2000-2004 Yet another Bulletin Board