Форматирование даты-времени файла Topic is solved

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Форматирование даты-времени файла

Post by buniak_a_h »

Извините за банальный вопрос, но не могли бы вы описать форматирование характеристик файла?
С размером я, кажется, разобрался: столбец типа S преобразовывается функцией far.FormatFileSize с флагом FFFS_NONE, а столбец типа SC - той же функцией с флагом FFFS_COMMAS.
А как Вы преобразовываете дату-время файла? Ясно, что win.FileTimeToSystemTime(win.FileTimeToLocalFileTime(LastWriteTime)) вернёт таблицу, а дальше всё зависит от ширины столбца. Хотя тоже есть "подводный камень": как преобразовать в зависимости от настроек Windows (разделитель, вид даты). А с временем совсем непонятно. В зависимости от ширины столбца используется то 24-часовое представление, то 12-часовое с суффиксом a/p. Не хочется верить, что всю эту логику авторы программировали в панелях вручную. Хочется верить, что использовали СИ-шную функцию. А есть ещё столбцы типа DM-DE, в которых выводится сразу и дата, и время.
Как это можно повторить в скрипте?
Last edited by buniak_a_h on Tue 10 Aug, 2021 21:00, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Форматирование даты-времени файла

Post by citRiks »

насколько я знаю, сами форматы берутся отсюда:
HKEY_CURRENT_USER\Control Panel\International
например sShortDate, sLongDate
А где брать функцию которая сделает преобразует в эти форматы, действительно непонятно.
Т.е. понятно что можно через LuaJit (наверное), но мне непонятно как
В Фар АПИ такой нет, вроде все обшарил через ЛуаЭксплорер.
В "энциклопедии для девелоперов" есть однако FSF.sprintf
но ее не видно через ЛуаЭксплорер, или я не знаю где смотреть.
Кстати мне тоже это всегда интересовало,
почему FSF.* не видно в АПИ для Луа, и можно ли сделать так чтобы было видно?

П.С.
Пока писал пришло частичное озарение

Code: Select all

local ffi = require("ffi")
local C = ffi.C
local plg_api = ffi.cast("struct PluginStartupInfo*", far.CPluginStartupInfo())
local FSF = plg_api.FSF
le(FSF)
В ФСФ есть и sprintf, но как ехать дальше - непонятно
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Форматирование даты-времени файла

Post by citRiks »

На форуме есть про ФСФ, например эта целая тема:
FSF::sprintf/sscanf/snprintf
viewtopic.php?f=54&t=6996
но:
1.) я не очень уверен что sprintf отформатирует dddd, MMMM dd, yyyy
(но может другая функция из ФСФ.* отформатирует?)
2.) это С++ и сложные (для меня) FFi декларации :cry:
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Форматирование даты-времени файла

Post by buniak_a_h »

citRiks, Вы не поняли главного.
В tPluginPanelItem поля, относящиеся к дате-времени - это число (по-моему, число то ли тиков, то ли микросекунд от какого-то начала). Кстати, в СИ дата - это дробное число (суток). Т.е. это не просто форматирование числа, а преобразование его. Причем это преобразование должно зависеть как от ширины приёмного поля (например, если дата со столетиями влезает, то выводятся столетия 20хх; а если не влезает - столетия отбрасываются), так и от настроек винды. У нас, например, принято писать дату в виде DD.MM.YY (или DD.MM.YYYY, если влезает). В Европе - DD/MM/YY; в америке - MM/DD/YY. Т.е. надо знать хотя бы DateSeparator.
Есть функция mf.date, принимающая единственный параметр - формат. Увы, она выводит только текущее время. Т.е. ей нельзя передать то время, которое надо вывести в строку.
Есть другая функция os.date, которая должна принимать формат и собственно время. Я, кажется нащупал: надо из таблицы, полученной win.FileTimeToSystemTime сформировать таблицу, пригодную для функции os.time, и полученное этой функцией время отформатировать функцией os.date Как-то проктологично, но попробую …
А то, что Вы описали (sprintf) - это функция string.format
Last edited by buniak_a_h on Wed 11 Aug, 2021 05:21, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Форматирование даты-времени файла

Post by citRiks »

buniak_a_h wrote: Wed 11 Aug, 2021 05:19 Т.е. надо знать хотя бы DateSeparator.
вам виднее конечно, но навсякий случай еще раз напоминаю про эти настройки, например date separator это вот:
HKEY_CURRENT_USER\Control Panel\International\@sDate
насчет остального -да, я тоже не знаю как преобразовать тики целочисленные в определенного формста строку даты
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Форматирование даты-времени файла

Post by citRiks »

buniak_a_h wrote: Wed 11 Aug, 2021 05:19 А то, что Вы описали (sprintf) - это функция string.format
я думал что это какое-то Луа-специфичное форматирование, но кажется что вы более правы
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Форматирование даты-времени файла

Post by buniak_a_h »

citRiks wrote: Wed 11 Aug, 2021 05:26 я думал что это какое-то Луа-специфичное форматирование
Из специфического там только квалификатор %q - преобразование строки в вид, пригодный для LUA. Ну и нет некоторых вещей типа индекса (в sprintf можно указывать номер аргумента, например вывести один и тот же аргумент в разном виде - десятичном, шестнадцатеричном). Может, ещё чего-то нет, не знаю.
На самом деле тот длинный путь, который я описал, работает. Но КАК ЖЕ КРИВО!!!
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Форматирование даты-времени файла

Post by HaRT »

buniak_a_h wrote: Wed 11 Aug, 2021 05:19 в СИ дата - это дробное число (суток)
Это неправда. Возможно, вы перепутали с OLE Automation Variant Date-Time.
Last edited by HaRT on Thu 12 Aug, 2021 03:41, edited 1 time in total.
Reason: Добавлено предложение про Variant Date
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Форматирование даты-времени файла

Post by buniak_a_h »

HaRT, да, сорри. Перепуталось в голове из разных языков-стандартов. vtime (variant date-time) совпадает с тем, что в паскале tDateTime.
Last edited by buniak_a_h on Thu 12 Aug, 2021 05:01, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Форматирование даты-времени файла

Post by citRiks »

buniak_a_h wrote: Wed 11 Aug, 2021 05:19 Есть другая функция os.date, которая должна принимать формат и собственно время. Я, кажется нащупал: надо из таблицы, полученной win.FileTimeToSystemTime сформировать таблицу, пригодную для функции os.time, и полученное этой функцией время отформатировать функцией os.date Как-то проктологично, но попробую …
дошли руки еще раз попытатьдся разьяснить как НЕпроктологично работать с датой-временем
Функция ос.дате() действительно полезная и, на самом деле, покрывает потребности.
Она также учитывает текущую "локаль", как заявлено автором Луа:
Roberto Ierusalimschy. wrote:All representations follow the current locale. Therefore, in a locale for Brazil-Portuguese, %B would result in "setembro" and %x in "16/09/98".
Смотреть функцию, например, здесь:
https://www.lua.org/pil/22.1.html
Функция os.date() на самом деле покрывает большую и лучшую часть стандартной сишной функции strftime
Смотреть ее например здесь:
http://www.cplusplus.com/reference/ctime/strftime/

Общая часть поддерживаемых спецификаторов:
%a abbreviated weekday name (e.g., Wed)
%A full weekday name (e.g., Wednesday)
%b abbreviated month name (e.g., Sep)
%B full month name (e.g., September)
%c date and time (e.g., 09/16/98 23:48:10)
%d day of the month (16) [01-31]
%H hour, using a 24-hour clock (23) [00-23]
%I hour, using a 12-hour clock (11) [01-12]
%M minute (48) [00-59]
%m month (09) [01-12]
%p either "am" or "pm" (pm)
%S second (10) [00-61]
%w weekday (3) [0-6 = Sunday-Saturday]
%x date (e.g., 09/16/98)
%X time (e.g., 23:48:10)
%Y full year (1998)
%y two-digit year (98) [00-99]
%% the character `%´

Теперь, у нас есть все локальные форматы в регистре тута:
HKEY_CURRENT_USER\Control Panel\International
но тама спецификаторы выглядят по-другому, например dddd вместо %A (полный день недели)
Впрочем, выглядит несложным сделать таблицу соответствий типа:

Code: Select all

	dddd = "%A",	-- full weekday name
	"yy" = %y,	-- two-digit year (98) [00-99]
-- .. итд итп
Last edited by citRiks on Sun 22 Aug, 2021 14:55, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Форматирование даты-времени файла

Post by citRiks »

Кроме вышесказанного, если чего-то все еще не хватает, есть этот общепринятый модуль:
https://github.com/Tieske/date
https://tieske.github.io/date/
Тут тоже что-то, кажется что приличное:
https://forum.rainmeter.net/viewtopic.php?t=27625
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Форматирование даты-времени файла

Post by buniak_a_h »

citRiks wrote: Sun 22 Aug, 2021 14:49 Функция ос.дате() действительно полезная и, на самом деле, покрывает потребности.
Для меня основная сложность в том, как передать ей дату изменения файла. Вот такое:

Code: Select all

lua:=os.date(nil, panel.GetCurrentPanelItem(nil,1).ChangeTime)
возвращает nil. Все буковки, что Вы написали (очень много) мне знакомы. И даже в том же порядке. Просто напишите одной строчкой пример, как сформировать строковое выражение даты изменения текущего на панели файла.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Форматирование даты-времени файла

Post by citRiks »

buniak_a_h,
думаю что богоугодно будет так:
lua:=os.date("%x %X", panel.GetCurrentPanelItem(nil, 1).ChangeTime / 1000 - 11644473600)
где число 11644473600 несет послание о том сколько секунд прошло с 1700 года до 1970.
Милисекунды в Луа не признаются, поэтому делим дату файла на 1000, увы..
Last edited by citRiks on Sun 22 Aug, 2021 20:58, edited 2 times in total.
Post Reply

Return to “Нужна помощь”