Форум: "Начинающим";
Текущий архив: 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