Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-50286
alik_os
2003-06-04 14:31
2003.06.16
Запись CD-R более 700 метров


1-50297
killer
2003-06-04 17:04
2003.06.16
Как в программе выделить и скопировать текст из Label-а?


1-50361
FANTASY
2003-06-03 01:37
2003.06.16
прогрес окно


1-50308
McSimm2
2003-06-03 09:16
2003.06.16
Двустрочный итем в ComboBox


14-50484
Карлсон
2003-05-27 20:47
2003.06.16
в чем смысл?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский