16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
1

Как преобразовать 20160911195120 в TDateTime?

12.09.2016, 19:11. Показов 2423. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Использую Инди, после цикла
Delphi
1
2
3
4
5
6
7
8
9
10
11
...     
List;
 
                        Memo1.Lines.Clear;
 
 
                         for i := 0 to IdFTP.ListResult.Count-1 do
                         begin
                         Memo1.Lines.Add(IdFTP.ListResult[i]);
                         end;
...

получаю информацию о файлах на сервере в таком формате
Delphi
1
2
3
4
size=0;type=cdir;create=20160911195120;modify=20160912135842;windows.lastaccesstime=20160912135842;win32.ea=0x00002010; .
size=0;type=pdir;create=20160911195120;modify=20160912135842;windows.lastaccesstime=20160912135842;win32.ea=0x00002010; ..
size=0;type=dir;create=20160912102900;modify=20160912102900;windows.lastaccesstime=20160912102900;win32.ea=0x00002010; 2016
size=2360;type=file;create=20160912135842;modify=20160912135842;windows.lastaccesstime=20160912135842;win32.ea=0x00002020; cancel(1).png
С помощью регулярок вот это create=20160911195120 я преобразовал в список из

20160911195120
20160912102900
...
и так далее

Но как этот timestamp преобразовать в TDateTime?

Пробовал в таком духе

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
var   LTime: TFileTime;
  Systemtime: TSystemtime;
 
 
 
      for i := 0 to Memo1.Lines.Count-1 do
                               begin
 
                               FileTimeToLocalFileTime( '20160911195120', LTime);
                               FileTimeToSystemTime( LTime, SystemTime );
 
                               Memo2.Lines.Add(
 
                                DateTimeToStr(
                                SystemTimeToDateTime( SystemTime)
                                              )
 
 
                              );
 
 
                               end;
Но не признает он это число. Как быть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2016, 19:11
Ответы с готовыми решениями:

TDateTime как параметр функции
Добрый вечер. Столкнулся с некоторой проблемой. Требуется передать в функцию значение с типом...

Как перевести TDateTime в читаемый вид?
Как перевести понятно, нужно использовать FormatDateTime. Но у меня немного другая задача....

Как в ячейке TGrid использовать TDateTime, TCheckBox, TString и TButton?
Добрый день! Подскажите пожалуйста - как в ячейке TGrid использовать TDateTime, TCheckBox,...

Как проще всего вычислить разницу между TDateTime (в секундах)?
Господа, гении программирования! Как проще всего вычислить разницу между T1 и T2 : TDateTime (в...

12
Эксперт Pascal/Delphi
4901 / 2771 / 851
Регистрация: 04.10.2012
Сообщений: 10,095
12.09.2016, 19:31 2
Цитата Сообщение от GringoV Посмотреть сообщение
как этот timestamp преобразовать в TDateTime?
Delphi
1
SysUtils.TimeStampToDateTime(...);
0
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
12.09.2016, 19:38  [ТС] 3
Попробовал
Delphi
1
System.SysUtils.TimeStampToDateTime(20160911195120);
Не понимает...
[dcc32 Error] uVisualFrame_PSFTPCLient.pas(696): E2010 Incompatible types: 'TTimeStamp' and 'Int64'

Может есть ещё какие-то варианты?
0
142 / 40 / 14
Регистрация: 16.06.2016
Сообщений: 239
12.09.2016, 19:42 4
Эх, сразу видно, что кое-кто не изучал Pascal в школе...

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uses
  System.SysUtils;
 
var
  DT: TDateTime;
  F: TFormatSettings;
  S: String;
 
begin
  ReadLn(S);
  // Форматируем запись
  S := Copy(S, 1, 4) + '/' + Copy(S, 5, 2) + '/' + Copy(S, 7, 2) + ' ' +
    Copy(S, 9, 2) + ':' + Copy(S, 11, 2) + ':' + Copy(S, 13, 2);
  // Задаём формат для StrToDateTime
  GetLocaleFormatSettings(0, F);
  F.ShortDateFormat := 'yyyy/mm/dd';
  F.ShortTimeFormat := 'hh:nn:ss';
  F.DateSeparator := '/';
  F.TimeSeparator := ':';
  // Собственно конвертируем строку в TDateTime
  DT := StrToDateTime(S, F);
  WriteLn(DateTimeToStr(DT));
end.
Цитата Сообщение от droider Посмотреть сообщение
SysUtils.TimeStampToDateTime(...);
Чтобы использовать эту функцию, нужно сначала конвертировать строку в TimeStamp, а это довольно сложно.

Цитата Сообщение от GringoV Посмотреть сообщение
Не понимает...
И правильно делает - читай справку с описанием этой функции (поставить курсор в редакторе на неё -> нажать F1).
0
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,972
12.09.2016, 19:42 5
Если под 20160911195120 подразумевается 11.09.2016 19:51:20, то можно и самому простенький парсер написать.
0
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
12.09.2016, 19:44  [ТС] 6
Ребята, спасибо Вам, что отписались!!! Сейчас буду пробовать, напишу здесь о результатах.
А Паскаль в школе - да))) Не до такой степени видимо изучал.
0
Эксперт Pascal/Delphi
4901 / 2771 / 851
Регистрация: 04.10.2012
Сообщений: 10,095
12.09.2016, 19:47 7
Цитата Сообщение от GringoV Посмотреть сообщение
ещё какие-то варианты?
Delphi
1
2
3
4
uses 
DateUtils;
//...
Edit1.Text :=DateToStr(UnixToDateTime(20160911195120));
0
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
12.09.2016, 19:58  [ТС] 8
DateToStr(UnixToDateTime) дает
04.11.51019

Я так понимаю, если это число разобрать 20160911195120, то получится что то вроде
2016 09 11 195120
YYYY MM DD

А вот 195120 типо 19 51 20 ?
HH MM SS??

Добавлено через 3 минуты
Попробовал
Delphi
1
DateTimeToStr(UnixToDateTime(20160911195120))
получилось
04.11.51019 13:45:20
0
Эксперт Pascal/Delphi
4901 / 2771 / 851
Регистрация: 04.10.2012
Сообщений: 10,095
12.09.2016, 19:58 9
Цитата Сообщение от GringoV Посмотреть сообщение
не признает он это число. Как быть?
Delphi
1
2
3
4
5
6
7
....
for i := 0 to Memo1.Lines.Count-1 do
                               begin
 
                               FileTimeToLocalFileTime( Memo1.Lines[i], LTime);
                               FileTimeToSystemTime( LTime, SystemTime );
...
А так?
0
142 / 40 / 14
Регистрация: 16.06.2016
Сообщений: 239
12.09.2016, 19:58 10
Цитата Сообщение от GringoV Посмотреть сообщение
Я так понимаю, если это число разобрать 20160911195120, то получится что то вроде
2016 09 11 195120
YYYY MM DD
А вот 195120 типо 19 51 20 ?
HH MM SS??
Это же очевидно. Никто не будет писать секунды между часами и минутами.
Вариант разбора этой строки я уже привёл (Copy() копирует символы из строки).
0
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
12.09.2016, 20:08  [ТС] 11
TimKruz, может и очевидно. Ты прав, но вот что, перезалил файл на FTP, по идее, на сервере он должен создаться вот прямо сейчас, получил
20160912170550 = 2016 09 12 17 05 50

А на часах 12:09:2016 22:07

Кто врёт?))
0
droider
12.09.2016, 20:10
  #12

Не по теме:

Цитата Сообщение от droider Посмотреть сообщение
А так?
Понял сам, что не пройдет :)

0
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
13.09.2016, 00:37  [ТС] 13
droider, так не сканает, потому что у FileTimeToLocalFileTime в первом аргументе другой тип
Delphi
1
Winapi.Windows.PFileTime
Добавлено через 4 минуты
Короче, я понял, что можно распарсить, но время он не по локали показывает, у меня GMT+5,
20160912171528

а на часах 22 15

Разница ровно в 5 часов

Выходит либо руками эту разницу относительно GMT 0 учитывать, чтобы корректно время считать, либо с помощью правильной функции преобразовывать, но какой?

Блин, первый раз с этим сталкиваюсь.

Добавлено через 5 минут
По идее вот этот код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                                FFileTime.dwLowDateTime:=20160911195120;
                                FFileTime.dwHighDateTime:=20160911195120;
 
                            
                               FileTimeToLocalFileTime( FFileTime, LTime );
                               FileTimeToSystemTime( LTime, SystemTime );
 
                               Memo2.Lines.Add(
 
                                DateTimeToStr(
                                SystemTimeToDateTime( SystemTime)
                                              )
 
 
                              );
end;
близок к правде, но я не знаю, что указать в
Delphi
1
2
FFileTime.dwLowDateTime
FFileTime.dwHighDateTime
Потому что если оставить как есть, он считает ерунду
01.01.1601 5:00:00
и как ни странно - вот эту разницу в 5 часов показывает))))

Можно, конечно из этого всего слепить решение, но хотелось бы узнать как правильно - никто не знает?

Добавлено через 3 часа 57 минут
В общем, народ, решение такое...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
procedure TVisualFrame_PSFTPClient.bTestClick(Sender: TObject);
var
    FFileTimeLocalized:TFileTime;
    FFileTime:TFileTime;
    FLocalFileTime:TFileTime;
 
 
    SystemTimeLocalized:TSystemtime;
 
    SystemTime:TSystemtime;
 
 
    datetime: TDateTime;
    IndyString:String;
 
begin
 
IndyString:='20160912210450'; // <<Example
 
datetime := EncodeDateTime(StrToInt(Copy(IndyString, 1, 4)),
                            StrToInt(Copy(IndyString, 5, 2)),
                            StrToInt(Copy(IndyString, 7, 2)),
                            StrToInt(Copy(IndyString, 9, 2)),
                            StrToInt(Copy(IndyString, 11, 2)),
                            StrToInt(Copy(IndyString, 13, 2)), 0);
 
 
DateTimeToSystemTime(datetime,SystemTime);
SystemTimeToFileTime(SystemTime,FFileTime);
FileTimeToLocalFileTime(FFileTime,FFileTimeLocalized);
 
FileTimeToSystemTime(FFileTimeLocalized,SystemTimeLocalized);
 
ShowMessage( 'GMT Localized '+
DateTimeToStr(
SystemTimeToDateTime( SystemTimeLocalized))
 
);
 
 
ShowMessage( 'GMT 0 (Not Localized) '+
DateTimeToStr(datetime)
);
 
 
 
end;
Добавлено через 1 минуту
Всем спасибо за обсуждение и помощь! Удачи в кодинге. Тема закрыта.

Добавлено через 15 секунд
Всем спасибо за обсуждение и помощь! Удачи в кодинге. Тема закрыта.

Добавлено через 15 минут
Тоже самое в виде функции

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function IndyStringToLocalizeDateTimeString(IndyString:string):string;
var
    FFileTimeLocalized:TFileTime;
    FFileTime:TFileTime;
    FLocalFileTime:TFileTime;
 
 
    SystemTimeLocalized:TSystemtime;
 
    SystemTime:TSystemtime;
 
 
    datetime: TDateTime;
 
 
begin
 
//IndyString:='20160912210450'; // <<Example
 
datetime := EncodeDateTime(StrToInt(Copy(IndyString, 1, 4)),
                            StrToInt(Copy(IndyString, 5, 2)),
                            StrToInt(Copy(IndyString, 7, 2)),
                            StrToInt(Copy(IndyString, 9, 2)),
                            StrToInt(Copy(IndyString, 11, 2)),
                            StrToInt(Copy(IndyString, 13, 2)), 0);
 
 
DateTimeToSystemTime(datetime,SystemTime);
SystemTimeToFileTime(SystemTime,FFileTime);
FileTimeToLocalFileTime(FFileTime,FFileTimeLocalized);
 
FileTimeToSystemTime(FFileTimeLocalized,SystemTimeLocalized);
 
//Localized DateTime
Result:= DateTimeToStr(SystemTimeToDateTime( SystemTimeLocalized));
 
 
{
ShowMessage( 'GMT Localized '+
DateTimeToStr(
SystemTimeToDateTime( SystemTimeLocalized))
 
);
 
 
ShowMessage( 'GMT 0 (Not Localized) '+
DateTimeToStr(datetime)
);
 
}
 
end;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2016, 00:37
Помогаю со студенческими работами здесь

Как исправить ошибку - Could not find a match for 'operator AnsiString::=(TDateTime)'
Организовать хранение данных в файле в следущую структуру, фио, дата, время 1) Написать процедуру...

Как при определении TDateTime не учитывать сутки, часы или минуты?
Что-то подобное я уже спрашивал в теме &quot;Как определить количество прошедших минут между двумя...

TdateTime
Подскажите как сделать: есть разность двух дат dtTime = StrToTime(StringGrid1-&gt;Cells) -...

TDateTime
Подскажите, пожалуйста, как записать значения типа TDateTime TDateTime datetime1 = 21.05.2013...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru