Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.051 c
2-1216727543
aam
2008-07-22 15:52
2008.08.24
DDP файлы


2-1216724523
Dimich1978
2008-07-22 15:02
2008.08.24
Замена, распечатка в Richedit


15-1215425702
shlst
2008-07-07 14:15
2008.08.24
asm + отладка и что бы delphi-like


2-1216301860
Mops
2008-07-17 17:37
2008.08.24
свой пункт меню


1-1197265455
Vladimir888
2007-12-10 08:44
2008.08.24
Получить значки дисководов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский