Форум: "Основная";
Текущий архив: 2003.06.16;
Скачать: [xml.tar.bz2];
Внизпреобразование даты в строку Найти похожие ветки
← →
sts (2003-05-30 08:18) [0]Подскажите, пожалуйста, как просто преобразовать дату в строку - я использую следующий код
vDateTime : TDateTime;
......
vDateTime := StrToDateFmt("dd.mm.yyyy hh:nn:ss", vStrIn);
Result := FormatDateTime("dd-mm-yyyy hh:nn:ss",vDateTime)
все работает за исключением того,что время обнуляется
StrToDateFmt - rx-ая функция
← →
McSimm2 (2003-05-30 08:28) [1]А чем StrToDate() не подходит ?
← →
Song (2003-05-30 08:29) [2]StrToDate()
FormatDateTime()
← →
sts (2003-05-30 08:31) [3]мне нужно преобразовать и время тоже - а StrToDate() StrToDateTime() не понимает входящего формата
← →
NAlexey (2003-05-30 08:52) [4]>все работает за исключением того,что время обнуляется
Так видимо в форматируемой дате у тебя и нет времени. Посмотри, посмотри. Если целое, то времени нет, только дата.
← →
sts (2003-05-30 08:55) [5]да - целое - а как мне преобразовать в дату так, чтобы и время было ?
← →
NAlexey (2003-05-30 09:04) [6]>как мне преобразовать в дату так, чтобы и время было
Слушай, не пойму я тебя чтото, то тебе дату в строку, то тебе строку в дату...
procedure TForm1.Button1Click(Sender: TObject);
var
D: TDateTime;
begin
D := StrToDateTime("01.01.2003 01:01:01");
ShowMessage(FormatDateTime("c", D));
end;
← →
sts (2003-05-30 09:12) [7]если в общем писать - то я делаю класс, который загоняет строки из файла в базу, предварительно разобрав их и преобразовав в нужный тип, поэтому входящий формат даты может быть разный - а в базу надо ложить в определенном формате и если бы было просто возможность преобразовать из одного формата в другой, задав маску, то было бы все ок, а получается что просто не получается .. Есть еще такие чудные переменные LongDateFormat,
LongTimeFormat, но с ними тоже не работает
← →
sts (2003-05-30 09:15) [8]procedure TForm1.Button1Click(Sender: TObject);
var
D: TDateTime;
begin
D := StrToDateTime("19.01.2003 01:01:01");
ShowMessage(FormatDateTime("c", D));
end;
и в этом примере, если дату поставить 19, а потом поменять region settings на английский - тоже не будет работать
← →
NAlexey (2003-05-30 09:33) [9]>тоже не будет работать
Потому что в году всего 12 месяцев. Уверен, если написать так:
"01.19.2003 01:01:01" все будет работать.
← →
sts (2003-05-30 09:36) [10]это понятно - и как это сделать независимым от внешних установок ?
← →
Anatoly Podgoretsky (2003-05-30 09:55) [11]Да но эта запись без знания региональных настроек или форматной строки не очем не говорит, может ошибка, а может и нормально - 19 января. Я например уверен, что это будет работать и в тоже время не уверен, что вот это будет работать 01.11.2003 правильно.
← →
Palladin (2003-05-30 10:03) [12]
> если в общем писать - то я делаю класс, который загоняет
> строки из файла в базу, предварительно разобрав их и преобразовав
> в нужный тип, поэтому входящий формат даты может быть разный
> - а в базу надо ложить в определенном формате и если бы
> было просто возможность преобразовать из одного формата
> в другой, задав маску, то было бы все ок, а получается что
> просто не получается .. Есть еще такие чудные переменные
> LongDateFormat,
> LongTimeFormat, но с ними тоже не работает
ты подумай. если ты берешь данные из файла и парсишь datetime то логично наверное будет использовать тот формат даты который и стоит в региональных настройках, в одном файле разве может быть дата представлена одновременно в нескольких форматах, или этот файл у тебя какой то жутком международный?
то есть это я к чему: используй DateTimeToStr и StrToDateTime...
если дата не корректна то это ошибка пользователя а не твоя.
Ну скажи мне, как ты можешь однозначно сказать в каком формате записана эта дата
01.11.2003
вообщето Anatoly Podgoretsky высказал эту мысль, и однозначного решения быть в этом случае не может...
можно лишь на основе разделителя можно предположить, что это формат дд.мм.гггг, но это только предположение....
← →
sts (2003-05-30 11:09) [13]Это все здорово - но задача в том чтобы можно было преобразовать получаемый файл ( и не обязательно формат даты в нем должен совпадать с внешними установкими на данном конкретном раб. месте - этот файл в конкретном случае получается вообще из другой системы ), а исходя из логики предоставленных функций - я этого сделать не могу, что вообще-то странно, или я чего-то не знаю ... Ну да ладно - чего-нибудь придумаем
Спасибо всем !
← →
Anatoly Podgoretsky (2003-05-30 11:18) [14]Palladin © (30.05.03 10:03)
Может быть, жизнь многообразная, но в этом случае надо применять телепатические методы, что бы определить, что
01.11.2003 это 1 ноября 2003
а
01.11.2003 11 января 2003
если хотя бы одна из составляющих была больше 12, то можно было бы применить более менее научные методы.
← →
sts (2003-05-30 11:23) [15]да нет - все гораздо проще - я знаю, какой формат входящий (допустим "mm-dd-yyyy") и какой исходящий ("dd-mm-yyyy") - но с помощью стандартных функций преобразовать не могу - т.к. они зависят от установок конкретного компа
← →
WarLord (2003-05-30 11:28) [16]
> я знаю, какой формат входящий (допустим "mm-dd-yyyy") и
> какой исходящий ("dd-mm-yyyy")
тогда делай
vDateTime := StrToDateFmt("mm-dd-yyyy hh:nn:ss", vStrIn);
Result := FormatDateTime("dd-mm-yyyy hh:nn:ss",vDateTime)
← →
NAlexey (2003-05-30 11:34) [17]>но с помощью стандартных функций преобразовать не могу
Еще как можешь. Да и StrToDateFmt не работает со временем. Ты просто придешь к тому с чего начал. Да хотябы те же DecodeDateTime...
← →
sts (2003-05-30 11:34) [18]-) это мы уже проходили -
vDateTime := StrToDateFmt("mm-dd-yyyy hh:nn:ss", vStrIn) - обнуляет время - дату нормально переводит, а время по нулям становится
← →
NAlexey (2003-05-30 11:36) [19]>а время по нулям становится
см выше. StrToDateFmt не работает со временем, да и где в названии ф-ции это указано? StrTo DateFmt?
← →
sts (2003-05-30 11:43) [20]мой косяк - не работает - но от этого все равно проблема не снимается
← →
NAlexey (2003-05-30 12:32) [21]Подведем итог:
1)Есть дата(строка), формат известен: dd.mm.yyyy
2)Необходимо перевести в дату(дата) формата mm.dd.yyyy
3)Региональные настройки указывают на mm.dd.yyyy
================================================
Предлагаю парсить:
TDateFormatParts = (dpDay, dpMonth, dpYear, dpHour, dpMin, dpSec);
TDateFormatItem = packed record
PosInPhrase, Count: byte;
end;
TDateFormat = packed array[TDateFormatParts] of TDateFormatItem;
procedure DecodeDateFormat(SFormat: String; var AFormat: TDateFormat);
type
TChars = set of Char;
const
DateFormatChars: array[TDateFormatParts] of TChars =
(["d", "D"], ["m", "M"], ["y", "Y"], ["h", "H"], ["n", "N"], ["s", "S"]);
var
pValue: PChar;
DatePart: TDateFormatParts;
J: integer;
function IsCharDatePart(Ch: Char; var DatePart: TDateFormatParts): boolean;
var
I: TDateFormatParts;
begin
Result := False;
for I := Low(TDateFormatParts) to High(TDateFormatParts) do
begin
if Ch in DateFormatChars[I] then
begin
Result := True;
DatePart := I;
Break;
end;
end;
end;
function GetPartCount(DatePart: TDateFormatParts): byte;
var
pStart: PChar;
begin
pStart := pValue;
while (pValue^ <> #0) and (pValue^ in DateFormatChars[DatePart]) do
begin
Inc(pValue);
Inc(J);
end;
Result := pValue - pStart;
end;
begin
pValue := PChar(SFormat);
J := 1;
while pValue^ <> #0 do
begin
if IsCharDatePart(pValue^, DatePart) then
begin
AFormat[DatePart].PosInPhrase := j;
AFormat[DatePart].Count := GetPartCount(DatePart);
end;
Inc(J);
if pValue^ <> #0 then Inc(pValue);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
LFormat: TDateFormat;
I: TDateFormatParts;
begin
DecodeDateFormat("dd.mm.yyyy hh:nn:ss", LFormat);
for I := Low(TDateFormatParts) to High(TDateFormatParts) do
//LFormat[I].PosInPhrase - позиция;
//LFormat[I].Count - количество;
//Copy
//DecodeDateTime
end;
А?
← →
Victor_Cr (2003-05-30 12:47) [22]procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime);
И про Хелп нужно помнить forewer...
← →
NAlexey (2003-05-30 12:49) [23]>DateTimeToString
Ну дело вопервых в том, что строку надо перевести в дату в соответсвии с известным форматом.
← →
icWasya (2003-05-30 12:54) [24]или исправить исходный код библиотеки RX модуль DateUtil
добавить процедуру
function ScanTimeStr(const Format, S: string; var H, N, S: Integer): Boolean;
var
Pos: Integer;
begin
ExtractMask(Format, S, "h", 1, H, -1, 0);
ExtractMask(Format, S, "n", 1, N, -1, 0);
ExtractMask(Format, S, "s", 1, S, -1, 0);
Result := (H >=0) and (H<24)
and (N >=0) and (N<60)
and (S >=0) and (S<60);
end;
и исправить процедуру
function InternalStrToDate(const DateFormat, S: string;
var Date: TDateTime): Boolean;
var
D, M, Y: Integer;
H, N, S: Integer
begin
if S = "" then begin
Date := NullDate;
Result := True;
end
else begin
Result := ScanDateStr(DateFormat, S, D, M, Y)
and ScanTimeStr(DateFormat, S, H, N, S);
if Result then
try
Date := EncodeDate(Y, M, D);
except
Result := False;
end;
end;
end;
что бы не нарушать логику работы StrToDateFmt,
вместо исправления InternalStrToDate
можно добавить
InternalStrToTime
InternalStrToDateTime
StrToTimeFmt
StrToTimeDef
StrToTimeFmtDef
ScanTime
IsValidTime
код придумай сам
← →
sts (2003-05-30 13:10) [25]лучше ничего не исправлять, а использовать парсер - спасибо NAlexey за код !
← →
Grig (2003-05-30 15:01) [26]А так подойдет?
s:="01.01.2003 01:01:01";
d:=EncodeDateTime(StrToInt(Copy(s,7,4), // Год
StrToInt(Copy(s,4,2), // Месяц
StrToInt(Copy(s,1,2), // День
StrToInt(Copy(s,12,2), // Час
StrToInt(Copy(s,15,2), // мин.
StrToInt(Copy(s,15,4), // сек.
0); // мс
StrToInt(Copy(s,7,4), //;
← →
NAlexey (2003-05-30 15:11) [27]>А так подойдет?
Пойдет, если приходящий формат dd.mm.yyyy hh.nn.ss.
А если будет yyyy.mm.dd ss.nn.hh не пойдет.
Но всегда можно написать:
if Format = "dd.mm.yyyy hh.nn.ss" then ...
else if Format = "yyyy.mm.dd ss.nn.hh" ...
...
Правда?
← →
Grig (2003-05-30 15:17) [28]Пардоньте! Последнюю стоку нужно удалить!
← →
Alexander1966 (2003-05-30 15:46) [29]Мне кажется, правильнее поступать так:
// Установка форматов дат
DateSeparator = ".";
ShortDateFormat = "dd/mm/yyyy";
TimeSeparator = ":";
ShortTimeFormat = "hh:nn:ss";
// Работа с датами
FormatDateTime("dd.mm.yyyy hh:mm:ss",dt);
← →
AbrosimovA (2003-06-04 10:09) [30]
> Alexander1966 © (30.05.03 15:46)
> // Работа с датами
> FormatDateTime("dd.mm.yyyy hh:mm:ss",dt);
FormatDateTime("dd.mm.yyyy hh: mm:ss",dt);
mm в данном случае не минуты, а месяц. Поэтому всё-таки надо ставить nn. А если нужно, чтобы часы отображались, как 23:00, а не 01:00, вместо hh поставить HH
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.16;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.006 c