![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StrToDateTime vs Я [D7, WinXP]
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 и то много.