Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

StrToDateTime vs Я [D7, WinXP]


Страницы:   1 2

R1ka ©   (2008-07-19 16:33:00) 

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


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

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


Dennis I. Komarov   (2008-07-21 15:52:00) [2]

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


han_malign   (2008-07-21 15:43:00) [3]


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

- согласно 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


atruhin   (2008-07-21 09:32:00) [4]

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


atruhin   (2008-07-21 09:31:00) [5]

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


turbouser   (2008-07-20 12:46:00) [6]


> User   (20.07.08 12:36) [21]

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


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

> User   (20.07.08 12:36) [21]

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

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


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

Код под приведенный пример задачи:
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 11:37:00) [9]

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


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

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

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;


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

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


R1ka   (2008-07-20 11:05:00) [12]

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

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


Loginov Dmitry   (2008-07-20 09:44:00) [13]


> зеркально 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;


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

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


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


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

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


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

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


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


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

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


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

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

ddd, dd mmm yyyy hh:mm:ss


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

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

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

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


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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо