PDA

View Full Version : سوال: اضافه کردن روز به یک تاریخ



Mask
دوشنبه 24 مهر 1391, 16:56 عصر
با سلام
من تاریخی دارم مثلا 25-10-2012 مثلا میخام 45 روز بهش اضافه کنم و تاریخ جدید رو بدست بیارم.
از کتابخانه DateUtils و تابع IncDay استفاده کردم. اما مشکلات زیادی رو به همراه داشت.
مثلا اگه فرمت تاریخی که مد نظر داریم با فرمت تاریخ سیستم یکی نباشه نمیتونه عمل جمع رو انجام بده.
میخاستم بدونم دوستان برای انجام این کار چه راه حلی وجود داره.
ممنون.

mohsen24000
دوشنبه 24 مهر 1391, 17:04 عصر
میتونید با EncodeDate تاریخ خودتون رو تبدیل کنید بعد روی اون عملیات مدنظرتون رو اعمال کنید...
برای مثال:

var
myDate : TDateTime;
sDate: string;
begin
sDate:='2012-10-25';
myDate := EncodeDate(StrToInt(Copy(sDate,1,4)),
StrToInt(Copy(sDate,6,2)),
StrToInt(Copy(sDate,9,2)));
ShowMessage('myDate = '+DateToStr(myDate));
// Add 10 days to this date
myDate := IncDay(myDate, 10);
ShowMessage('myDate + 10 days = '+DateToStr(myDate));
// Subtract 12 days from this date
myDate := IncDay(myDate, -12);
ShowMessage('myDate - 12 days = '+DateToStr(myDate));
end;

BORHAN TEC
دوشنبه 24 مهر 1391, 17:57 عصر
یک تابع برای اینکار برات نوشتم که از فرمتهای خاص تر هم پشتیبانی می کند:
function ShnEncodeDate(aDateFormat, aDate: String): TDate;

var
year, month, day: Word;
apos: Integer;

const
yyyy = 'yyyy';
mm = 'mm';
dd = 'dd';
yLen = 4;
mLen = 2;
dLen = 2;

begin
// aDate format like 'yyyy:mm:dd';
aDateFormat := LowerCase(aDateFormat);

apos := System.Pos(yyyy, aDateFormat);
if apos <> 0 then
year := StrToInt(Copy(aDate, apos, yLen))
else
raise Exception.Create('Year Value Not found');

apos := System.Pos(mm, aDateFormat);
if apos <> 0 then
month := StrToInt(Copy(aDate, apos, mLen))
else
raise Exception.Create('Month Value Not found');

apos := System.Pos(dd, aDateFormat);
if apos <> 0 then
day := StrToInt(Copy(aDate, apos, dLen))
else
raise Exception.Create('Day Value Not found');

Result := EncodeDate(year, month, day);
end;


نحوه استفاده:
procedure TForm4.Button1Click(Sender: TObject);
var
a, b: TDateTime;
begin
a := ShnEncodeDate('yyyy//mm/dd', '2012//11,27');
b := DateUtils.IncYear(a, 2);
ShowMessage(DateToStr(b));

end;

Mask
دوشنبه 24 مهر 1391, 18:02 عصر
ممنون از شما 2 دوست عزیزم.
کار تا حدودی راه افتاد.
اما یه نکته باقی میمونه:
مثلا تاریخ وردی ما به این شکل و فرمته :
2012-10-15
من 10 رو بهش اضافه میکنم.
حالا خروجی تابع من بر اساس فرمت تاریخ سیستم خروجی بهم میده.
مثلا بهم خروجی 25/10/2012 رو بر میگردونه.
آیا میشه کاری کرد که خروجی هم بر اساس فرمت ورودی باشه؟
یعنی بعد از اضافه کردن روز مورد نظر ، دوباره خروجی به شکل :
2012-10-25 باشه؟

mohsen24000
دوشنبه 24 مهر 1391, 18:17 عصر
خب عزیز جان از همون روش استفاده کن!
برای مثال:
sdate:= Copy(DateToStr(myDate),7,4)+'-'+Copy(DateToStr(myDate),1,2)+'-'+Copy(DateToStr(myDate),4,2);

Mask
دوشنبه 24 مهر 1391, 18:30 عصر
خب عزیز جان از همون روش استفاده کن!
برای مثال:
sdate:= Copy(DateToStr(myDate),7,4)+'-'+Copy(DateToStr(myDate),1,2)+'-'+Copy(DateToStr(myDate),4,2);

آخه نمیشه.
چون من که نمیدونم نوع فرمت هر سیستمی چیه که بخام با copy تکه تکش کنم.
البته یه راه دیگه به ذهنم رسید.
اینکه خروجی رو با تابع DecodeDate تکه تکه کنم و به فرمت مورد نظرم دوباره تبدیل کنم.
این به ذهنم رسید ،حالا اگه دوستان راه بهتر و آسون تری دارند ، بفرمایند.
ممنون.

BORHAN TEC
دوشنبه 24 مهر 1391, 18:48 عصر
اینکه خروجی رو با تابع DecodeDate تکه تکه کنم و به فرمت مورد نظرم دوباره تبدیل کنم.
دقیقاً باید همین کار رو انجام بدی!
اول رشته حاوی تاریخ رو Encode کن(با توابع دلفی و یا همون تابعی که نوشتم و یا ...). بعد هر بلایی که دوست داری سرش بیار (اضافه کردن چند روز و یا ...). بعد با تابع DecodeDate مقدار روز، ماه و سال رو بدست بیاری و بعد با یک عملیات ساده رشته ای میتونی رشته نهایی رو به اون فرمتی که دوست داری در بیاری.

سعید صابری
دوشنبه 24 مهر 1391, 18:55 عصر
برای اینکه روی سیستم های مختلف با فرمت تاریخ مشکلی نداشته باشی شاید بشه از FormatDateTime استفاده کرد

Felony
دوشنبه 24 مهر 1391, 22:42 عصر
قبلا با GetLocaleFormatSettings میشد فرمت فعلی سیستم رو واکشی کرد ولی در نسخه های جدید این متد Deprecate شده ، در حال حاظر باید به صورت زیر فرمت رو واکشی و با استفاده از همون FormatDateTime تاریخ و ... رو برای هر نوع فرمتی آماده کرد :

var
FS: TFormatSettings;
begin
FS:= TFormatSettings.Create;
end;

FS حاوی متدهایی برای دریافت فرمت های مختلف سیستم هست .