Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Конвертация ftp даты


Автор: CHERRY 24.2.2014, 14:55
Используется FtpClient из библиотеки ICS
Информация о каталоге(файле) возвращается в виде строки вида:
'drwxr-xr-x    9 0        0            4096 Jan 16 15:28 BBerry'
'drwx------    2 root     root        16384 Aug 12  2013 lost+found'

Видим, что дата имеет вид: Jan 16 15:28 или Aug 12  2013.
Как преобразовать дату к TDateTime?
Спасибо.

Автор: Poseidon 1.3.2014, 22:28
Если Delphi XE3 или более поздние версии, то сработает. В ранних не гарантирую (не помню просто где появилось TFormatSettings.

Код

function GetMonthNumberOfName(Month: string; FormatSettings: TFormatSettings): Word;
var
  i: Word;
begin
  if Month.IsEmpty then
    Exit(0);

  for i := 1 to 12 do
    if SameText(FormatSettings.ShortMonthNames[i], Month) then
      Exit(i);
end;

function GetDateTime(FtpDate: string): TDateTime;
var
  FormatSettings: TFormatSettings;
  MonthNumber: Word;
begin
  FormatSettings := TFormatSettings.Create('en-US');

  MonthNumber := GetMonthNumberOfName(Copy(FtpDate, 1, 3), FormatSettings);
  FtpDate := IntToStr(MonthNumber) + '/' + Copy(FtpDate, 5, 8);

  FormatSettings.LongDateFormat := 'mm/dd hh:nn';     // <-- Тут указываем формат даты в входной строке
  TryStrToDateTime(FtpDate, Result, FormatSettings);
end;


Почему-то не хочет TFormatSettings понимать "Jan" при формате "mmm", хотя тот же "Jan" возвращает в ShortMonthNames[1]. Поэтому и пришлось ввести GetMonthNumberOfName которая конвертирует "Jan" в 1 и т.д.

Автор: kami 2.3.2014, 20:28
Цитата(Poseidon @  1.3.2014,  22:28 Найти цитируемый пост)
Почему-то не хочет TFormatSettings понимать "Jan" при формате "mmm"

TFormatSettings может и хотело бы, но (по крайней мере в D2010) TryStrToDate считает, что первым параметром должно быть число, а находит строковый символ и сразу вылетает...

Добавлено через 3 минуты и 38 секунд
Кстати, как-то хотел это дело поправить, но руки не дошли...

Добавлено через 5 минут и 26 секунд
Upd: а не может такая функция быть где-нибудь в сетевых компонентах?
В ICS поискал, не нашел. Может у индейцев или синапсов?

Автор: CHERRY 3.3.2014, 23:09
Спасибо за внимание. У меня D2010. Я уж подумывал раздраконить все руками. Описать месяцы, если года нет- значит текущий, правда время не везде присутствует. Но это как-то не правильно. ICS серьезный пакет, а такая мелочь не учтена? Вряд ли. Думал может кто глубже копнул. Я тут на днях поковырял SecureBlackbox, в частности SimpleSFTPClient. Там все красиво. Ftp-строка парсится, дата/время без проблем. Очень красиво. Но стоит денег. Для души не купишь.

Автор: CHERRY 27.3.2014, 17:56
P.S.
Случайно вернулся к этой теме и порешал задачу так:
Код


................................
procedure DisplayHandler(Sender : TObject; var Msg : String);
..............................
Var fMessage:String;
................................

FTPClient.OnDisplay:=DisplayHandler;
................................

procedure TFilesPanel.DisplayHandler(Sender : TObject; var Msg : String);
begin
  //Display(Msg);процедура, где все команды выводятся например в Мемо
  fMessage:=Msg;
end;


// Получить дату модификации файла
function  TFilesPanel.FtpGetFileDate(FullFileName:String):String;
Var sDate,Y,M,D,H,min,sec:String;
begin
 if not FtpClient.Connected then FtpClient.Connect;
 FtpClient.HostDirName := путь к директории, где лежит файл;
 FtpClient.HostFileName := имя файла;
 FtpClient.Cwd;
 FtpClient.Feat;//включает расширенные функции (я так думаю)
 FtpClient.Mdtm;
 //fMessage='< 213 20140326123426', где 20140326123426 - дата в формате "YYYYMMDDhhmmss"
 sDate:=fMessage;
 Delete(sDate,1,Pos('213 ',sDate)+3);
 Y  := Copy(sDate,1,4); Delete(sDate,1,4);
 M  := Copy(sDate,1,2); Delete(sDate,1,2);
 D  := Copy(sDate,1,2); Delete(sDate,1,2);
 H  := Copy(sDate,1,2); Delete(sDate,1,2);
 min:= Copy(sDate,1,2); Delete(sDate,1,2);
 sec:= sDate;
 Result:=D+'.'+M+'.'+Y+' '+H+':'+min+':'+sec;
end;



Мне все это не очень нравится, но работает четко. Правда только для файлов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)