Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.24;
Скачать: CL | DM;

Вниз

StrToDateTime vs Я   Найти похожие ветки 

 
R1ka ©   (2008-07-19 16:33) [0]

Как бы заставить эту функцию переварить вот такое: "Thu, 24 Apr 2008 06:48:52" ? Уже 10 часов парюсь =(


 
{RASkov} ©   (2008-07-19 16:37) [1]

Никак. Только свою писать... но тут.... многое зависит)


 
R1ka ©   (2008-07-19 16:52) [2]

почему никак? FormatDateTime же позволяет создать точно такую же строку, Неужели не предусмотрено обратное действие :(


 
{RASkov} ©   (2008-07-19 17:01) [3]

> [2] R1ka ©   (19.07.08 16:52)

Потому как из единственного числа, чем и является дата, можно получить множество разных вариантов прдставления этой самой даты в строковом виде...


 
{RASkov} ©   (2008-07-19 17:03) [4]

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


 
R1ka ©   (2008-07-19 17:06) [5]

понятно. спасибо


 
Renegat ©   (2008-07-19 17:25) [6]

Алгос:

0) Берём структуру st: SYSTEMTIME.
1) Приводим строку к PChar.
2) Сравниваем третий символ с массивом ["n", "e", "d", "u", "i", "t"].
3) Если подошёл символ "n", то сравниваем второй символ. Если он равен "u", проставляем в st.wDayOfWeek значение 0. Иначе - индекс массива, на котором сошлась третья буква.
4) Сравниваем шестой символ с пробелом.
 а) Если сошлось:
   Отнимаем от него 48 (48 = 30h = ord("0")) и заносим результат в st.wDay, переходим к [5].
 б) Если не сошлось:
   MOV EDX, BYTE PTR [EAX+5];
   LEA EDX, [EDX*4+EDX-48*5];
   MOV ECX, BYTE PTR [EAX+6];
   LEA EDX, [EDX*2+ECX-48];

   , где ЕАХ - указатель на тот самый PChar, а в EDX после выполнения будет лежать результат.
   Влом думать, как это будет на Дельфях.
   Пусть это будет в счёт д/з ;)
   Короче, значение из EDX копируем в st.wDay

5) ... ну, и далее по образцу =)


 
Renegat ©   (2008-07-19 17:27) [7]

> шестой символ

*извиняюсь, седьмой.


 
Johnmen ©   (2008-07-19 19:30) [8]


> Renegat ©   (19.07.08 17:25) [6]

Ты это о чём?


 
Anatoly Podgoretsky ©   (2008-07-19 20:34) [9]

> R1ka  (19.07.2008 16:33:00)  [0]

Сколько паришься говоришь?
А в голову не приходило обычный парсер сделать?
На это минут 30 и то много.


 
Anatoly Podgoretsky ©   (2008-07-19 20:35) [10]

> R1ka  (19.07.2008 16:52:02)  [2]

> FormatDateTime же позволяет создать точно такую же строку,

Приведи-ка форматную строку.


 
Юрий Зотов ©   (2008-07-19 23:02) [11]

Anatoly Podgoretsky ©   (19.07.08 20:35) [10]

ddd, dd mmm yyyy hh:mm:ss


 
Anatoly Podgoretsky ©   (2008-07-20 00:15) [12]


> Юрий Зотов ©   (19.07.08 23:02) [11]

За тебя я не сомневался.


 
User   (2008-07-20 00:22) [13]

function StrToDateTime(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload; - зеркально DateTimeToStr. Забивая в FormatSettings все что угодно, можно, соответственно, то же получить ...


 
Германн ©   (2008-07-20 00:59) [14]


> User   (20.07.08 00:22) [13]
>
> function StrToDateTime(const S: string; const FormatSettings:
>  TFormatSettings): TDateTime; overload; - зеркально DateTimeToStr.
>  Забивая в FormatSettings все что угодно, можно, соответственно,
>  то же получить ...
>

Эт точно. Только есть ли в Д7 такая перегрузка?


 
Германн ©   (2008-07-20 01:06) [15]

Да и главное "зеркальность". Она ли нужна автору? Сомневаюсь что сия строка создана программой автора.


 
Loginov Dmitry ©   (2008-07-20 09:44) [16]


> зеркально DateTimeToStr. Забивая в FormatSettings все что
> угодно, можно, соответственно, то же получить ...


DateTimeToStr может выдать любою строку. StrToDateTime обработать любую строку не сможет. В случае автора: разделителем DateSeparator должен быть знак препинания, отличный от пробела.

> Эт точно. Только есть ли в Д7 такая перегрузка?


цитата из SysUtils.pas для D7:

{ StrToDateTime converts the given string to a date and time value. The
 string must contain a date optionally followed by a time. The date and
 time parts of the string must follow the formats described for the
 StrToDate and StrToTime functions. }

function StrToDateTime(const S: string): TDateTime; overload;
function StrToDateTime(const S: string;
 const FormatSettings: TFormatSettings): TDateTime; overload;


 
R1ka ©   (2008-07-20 11:05) [17]

вот с ФорматтингСеттингс я и провел замечательных 10 часов совокупления. Можно рабочий пример? Маску, как я тут вижу, я заполнял верно. Имена месяцев и дней либо брал системные английские либо сам заполнял (результат один).

Пробовал разбивать исходную строку на две: дату и время. Строку-время нормально переваривает, а вот дату ни в какую :(


 
R1ka ©   (2008-07-20 11:06) [18]

Парсер не стал делать именно потому что нашел эту перегруженную StrToDateTime


 
Юрий Зотов ©   (2008-07-20 11:29) [19]

Вот простейшее решение. Рабочее, но очень кривое (потому что это всего лишь пример, набросанный на скорую руку). Кривизна состоит в том, что используется только дефолтная локаль (раз) и жесткий формат входной строки (два). Выпрямление кривизны предлагается всем желающим.

function MyStrToDateTime(const DateTimeString: string): TDateTime;
var
 Position, i: integer;
 S, Day, Month, Year: string;

 function ExtractNextSubstring: string;
 var
   EndPosition: integer;
 begin
   EndPosition := PosEx(" ", DateTimeString, Position);
   if EndPosition = 0 then
     EndPosition := Length(DateTimeString) + 1;
   Result := Copy(DateTimeString, Position, EndPosition - Position);
   Position := EndPosition + 1;
 end;

begin
 Position := 1;
 ExtractNextSubstring;
 Day := ExtractNextSubstring;
 S := AnsiUpperCase(ExtractNextSubstring);
 Month := "";
 for i := 1 to 12 do
   if AnsiUpperCase(ShortMonthNames[i]) = S then
   begin
     Month := IntToStr(i);
     Break
   end;
 if Month = "" then
   raise EConvertError.Create("Invalid month name");
 Year := ExtractNextSubstring;
 S := Format("%s%s%s%s%s %s", [Day, DateSeparator, Month, DateSeparator, Year, ExtractNextSubstring]);
 Result := StrToDateTime(S);
end;


 
Юрий Зотов ©   (2008-07-20 11:37) [20]

Посмотрел еще раз - есть и третья кривизна, самая серьезная: в предпоследней строке не учтен текущий формат даты.


 
User   (2008-07-20 12:36) [21]

Код под приведенный пример задачи:
function FStrToDateTime(FStr: String): TDateTime;
const
 Monthes: array[1..12] of string =
  ("Січ", "Лют", "Бер", "Кві","Тра","Чер", "Лип", "Сер", "Вер", "Жов","Лис", "Грг");
 Dates: array[1..7] of string = ("Нд", "Пн", "Вв", "Ср", "Чт", "Пт", "Сб");
var
 i, d, m: byte;
 df, mf, yf, tf: string;
begin
 d:= 1; m:= 1;
 df:= Copy(FStr, 1, 2); for i:= 1 to 7 do if df = Dates[i] then d:= i;
 mf:= Copy(FStr, 8, 3); for i:= 1 to 12 do if mf = Monthes[i] then m:= i;
 yf:= Copy(FStr, 12, 4); tf:= Copy(FStr, 17, 8);
 FStr:= IntToStr(d) +"." + IntToStr(m) + "." + yf + " " + tf;
 Result:= StrToDateTime(FStr)
end;

Замечания:
- у меня формат языка "Укранский", для английского нужно менять константы и разделяющие знаки (".");
- оптимизация кода и обработка ошибок - самостоятельно ...


 
Юрий Зотов ©   (2008-07-20 12:42) [22]

> User   (20.07.08 12:36) [21]

const
Monthes: array[1..12] of string = ...
Dates: array[1..7] of string = ...

Это уже есть в Delphi, причем на всех языках.


 
turbouser ©   (2008-07-20 12:46) [23]


> User   (20.07.08 12:36) [21]

Берешь текущие региональные установки и всех делов...


 
atruhin ©   (2008-07-21 09:31) [24]

Удалено модератором


 
atruhin ©   (2008-07-21 09:32) [25]

Извините, случайно добавил.


 
han_malign ©   (2008-07-21 15:43) [26]


> Кривизна состоит в том, что используется только дефолтная
> локаль (раз) и жесткий формат входной строки (два).

- согласно RFC-822 - это нормально... правда у автора куда то часовая зона потерялась.

    Standard for ARPA Internet Text Messages

    5.  DATE AND TIME SPECIFICATION

    5.1.  SYNTAX

    date-time   =  [ day "," ] date time        ; dd mm yy
                                                ;  hh:mm:ss zzz

    day         =  "Mon"  / "Tue" /  "Wed"  / "Thu"
                /  "Fri"  / "Sat" /  "Sun"

    date        =  1*2DIGIT month 2DIGIT        ; day month year
                                                ;  e.g. 20 Jun 82

    month       =  "Jan"  /  "Feb" /  "Mar"  /  "Apr"
                /  "May"  /  "Jun" /  "Jul"  /  "Aug"
                /  "Sep"  /  "Oct" /  "Nov"  /  "Dec"

    time        =  hour zone                    ; ANSI and Military

    hour        =  2DIGIT ":" 2DIGIT [":" 2DIGIT]
                                                ; 00:00:00 - 23:59:59

    zone        =  "UT"  / "GMT"                ; Universal Time
                                                ; North American : UT
                /  "EST" / "EDT"                ;  Eastern:  - 5/ - 4
                /  "CST" / "CDT"                ;  Central:  - 6/ - 5
                /  "MST" / "MDT"                ;  Mountain: - 7/ - 6
                /  "PST" / "PDT"                ;  Pacific:  - 8/ - 7
                /  1ALPHA                       ; Military: Z = UT;
                                                ;  A:-1; (J not used)
                                                ;  M:-12; N:+1; Y:+12
                / ( ("+" / "-") 4DIGIT )        ; Local differential
                                                ;  hours+min. (HHMM)

    5.2.  SEMANTICS

         If included, day-of-week must be the day implied by the date
    specification.

         Time zone may be indicated in several ways.  "UT" is Univer-
    sal  Time  (formerly called "Greenwich Mean Time"); "GMT" is per-
    mitted as a reference to Universal Time.  The  military  standard
    uses  a  single  character for each zone.  "Z" is Universal Time.
    "A" indicates one hour earlier, and "M" indicates 12  hours  ear-
    lier;  "N"  is  one  hour  later, and "Y" is 12 hours later.  The
    letter "J" is not used.  The other remaining two forms are  taken
    from ANSI standard X3.51-1975.  One allows explicit indication of
    the amount of offset from UT; the other uses  common  3-character
    strings for indicating time zones in North America.

    August 13, 1982              - 26 -                      RFC #822


 
Dennis I. Komarov ©   (2008-07-21 15:52) [27]

Кажися у индейцев (indy) был такой парсер, тока с часовой зоной там глюкавато было.


 
Игорь Шевченко ©   (2008-07-21 15:58) [28]

Очень много форматов без дополнительного напряга распознает VarToDateTime



Страницы: 1 вся ветка

Текущий архив: 2008.08.24;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.022 c
2-1216663591
TStas
2008-07-21 22:06
2008.08.24
Забыл, как зовут ф-цию :(


15-1215161784
гпрс
2008-07-04 12:56
2008.08.24
автодозвон


2-1216505792
Stan
2008-07-20 02:16
2008.08.24
Перевести unsigned в signed


2-1216289835
NJ
2008-07-17 14:17
2008.08.24
DLL


10-1148989839
Andrey_Gor
2006-05-30 15:50
2008.08.24
Error: "Интерфейс не поддерживается"