Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.16;
Скачать: CL | DM;

Вниз

преобразование даты в строку   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.015 c
1-50289
killer
2003-06-03 17:58
2003.06.16
Как программно создать новую кнопку в ToolBar?


4-50553
Xoy
2003-04-16 23:43
2003.06.16
как кпредилить раскладку


14-50479
Начинающий шароварщик
2003-05-28 17:24
2003.06.16
Феномен софтверной Индии


14-50488
Gremlin
2003-05-30 11:40
2003.06.16
Про FTP


1-50366
АлексейК
2003-06-02 13:23
2003.06.16
Создание копии объекта, созданного в приложении, в DLL.