PDA

View Full Version : تفکیک کردن یک رشته تاریخ به روز ، ماه و سال(پیمایش یک رشته)



amir_ir
شنبه 02 آبان 1388, 11:42 صبح
سلام به همه دوستان
فیلد تاریخی به صورت (10)Nvarchar در دیتابیس تعریف شده. حال اگر بخواهیم تاریخی مثلا به صورت 02/12/1388 را به روز ، ماه و سال تفکیک کرد و هر کدام رو در یک EditBox بریزیم ؟
ممنون میشم اگر راهنمایی کنید از چه کدی باید استفاده کرد
شاد و پیروز

nima898
شنبه 02 آبان 1388, 12:05 عصر
سلام
فیلد تاریخ شما رشته هست؟
اگه از تو رشته قصد استخراج روز و ماه و سال رو داشته باشید من واستون کدشو به زبان vb میتونم بنویسم.

Felony
شنبه 02 آبان 1388, 12:14 عصر
سلام
فیلد تاریخ شما رشته هست؟
اگه از تو رشته قصد استخراج روز و ماه و سال رو داشته باشید من واستون کدشو به زبان vb میتونم بنویسم.
اینجا انجمن دلفی هست !

میتونید از تابع DecodeDate از یونیت DateUtils استفاده کنید .

merced
شنبه 02 آبان 1388, 15:21 عصر
function StrToYMD(S: String; var Y, M, D: Word): Boolean;
var
P: Integer;
begin
Result := False;
try
P := Pos('/', S);
if P > 0 then
begin
Y := StrToInt(Copy(S, 1, P - 1));
Delete(S, 1, P);
P := Pos('/', S);
if P > 0 then
begin
M := StrToInt(Copy(S, 1, P - 1));
D := StrToInt(Copy(S, P + 1, Length(S) - P));
Result := True;
end;
end;
except
end;
end;

Felony
شنبه 02 آبان 1388, 16:14 عصر
function StrToYMD(S: String; var Y, M, D: Word): Boolean;
var
P: Integer;
begin
Result := False;
try
P := Pos('/', S);
if P > 0 then
begin
Y := StrToInt(Copy(S, 1, P - 1));
Delete(S, 1, P);
P := Pos('/', S);
if P > 0 then
begin
M := StrToInt(Copy(S, 1, P - 1));
D := StrToInt(Copy(S, P + 1, Length(S) - P));
Result := True;
end;
end;
except
end;
end;

:متفکر:این همه کپی و ... چرا ؟ من که تابع رو معرفی کردم ، کد میشه این :

var
MyDate:TDate;
Year,Month,Day:Word;
begin
MyDate:=StrToDate('2009/10/24');
DecodeDate(MyDate,Year,Month,Day);
ShowMessage(IntToStr(Year)+'-'+IntToStr(Month)+'-'+IntToStr(Day));
end;

یونیت DateUtils رو Uses کنید .

K.Mohammadreza
شنبه 02 آبان 1388, 18:27 عصر
دوست من تاريخ وارد شده شمسي است نه ميلادي



procedure FDateDecode(StrDate: string; var Y, M, D: Word);
var
slCString: TStringList;
begin
if Length(StrDate) = 0 then
Exit;
slCString := TStringList.Create;
slCString.Text := StringReplace(StrDate, '/', sLineBreak, [rfReplaceAll]);
Y := StrToInt(slCString.Strings[0]);
M := StrToInt(slCString.Strings[1]);
D := StrToInt(slCString.Strings[2]);
slCString.Free;
end;

Felony
شنبه 02 آبان 1388, 18:54 عصر
ایشون مثال زدن ، اگر تاریخشون شمسی باشه ، پس حتما از کامپوننتهای تقویم شمسی تو برنامشون استفاده کردن که این کامپوننتها خودشون این امکانات رو در اختیار برنامه نویس قرار میدن .

hadisalahi2
یک شنبه 03 آبان 1388, 09:26 صبح
من هم با نظر SilverSoft (http://barnamenevis.org/forum/member.php?u=63881)موافقم.
فرقی نمیکنه تاریخ چه مدلی باشه.با سه تا تابع Copy ساده هم میشه این کار رو انجام داد.

tdkhakpur
یک شنبه 03 آبان 1388, 11:47 صبح
ممكن هست تاريخ بصورت( 8)Nvarchar باشند نه (10)Nvarchar !
استفاده از توابه آماده به خاطر تست شدنشان بهتر ه ولي بعضي جاها بايد كدنويسي كرد.

Felony
یک شنبه 03 آبان 1388, 11:56 صبح
:چشمک:باز من و شما تو یه تاپیک به هم رسیدیم ، بابا پست اول رو بخون :


فیلد تاریخی به صورت (10)Nvarchar در دیتابیس تعریف شده.
ما طبق گفته های شخصی که سوال میپرسته جواب میدیم نه بر حسب اتفاقاتی که ممکنه رخ بده ، اینجوری اگه بخواهیم فکر کنیم ممکنه 10 تا اتفاق دیگه هم رخ بده !

:چشمک:بی خیال ...

saliatso
جمعه 15 اسفند 1393, 14:20 عصر
:متفکر:این همه کپی و ... چرا ؟ من که تابع رو معرفی کردم ، کد میشه این :

var
MyDate:TDate;
Year,Month,Day:Word;
begin
MyDate:=StrToDate('2009/10/24');
DecodeDate(MyDate,Year,Month,Day);
ShowMessage(IntToStr(Year)+'-'+IntToStr(Month)+'-'+IntToStr(Day));
end;

یونیت DateUtils رو Uses کنید .



باسلام به Felony عزیز و دوستان، منم به این تابع نیاز دارم اما وقتی این تابعی که شما گذاشتی رو مینویسم میگه:
"2015/06/11"is not a valid date
میشه کمک کنید؟
ممنون

یوسف زالی
شنبه 16 اسفند 1393, 00:24 صبح
سلام. تنظیمات سیستم باید منطبق باشه یا این که خودتون در برنامه نویسی تنظیمات خود رو اعمال کنید.
FormatSetting رو جستجو کنید.

Mahmood_M
دوشنبه 18 اسفند 1393, 15:53 عصر
در مورد تاریخ شمسی بهتره که به عنوان رشته باهاش برخورد کنید ، قضیه خیلی ساده میشه ! ، شما یک رشته ی 10 حرفی دارید ، 4 حرفش سال ، 2 حرفش ماه ، 2 حرفش روز و 2 حرفش هم اسلش
با توجه به همین قالب ، مقادیر رو استخراج می کنید :

var
MyDate, Year, Month, Day : String;
begin
MyDate := '1393/12/17';
Day := Copy(MyDate, Length(MyDate)-1, 2);
Month := Copy(MyDate, Pos('/', MyDate)+1, 2);
Year := Copy(MyDate, 1, 4);
end;

استفاده از توابع استاندارد تاریخ برای تاریخ شمسی و یا تاریخ تبدیل شده ریسک بالایی داره ، اینکه تبدیل درست انجام بشه ، اینکه قالب رشته ی خروجی تاریخ تبدیل شده با قالب تاریخ سیستم کاربر همخوانی داشته باشه ! و ...
بهتره در برنامه این اختیار برای کاربر وجود نداشته باشه که تاریخ رو به هر صورت دلخواهی وارد کنه ، با مدیریت ورود تاریخ ، میتونید اون رو بهتر بررسی کنید ، مثلا بهتره تاریخ توسط یک DatePicker انتخاب بشه تا اینکه کاربر تاریخ رو در یک Edit یا MaskEdit وارد کنه

دلفــي
سه شنبه 19 اسفند 1393, 10:00 صبح
:متفکر:این همه کپی و ... چرا ؟ من که تابع رو معرفی کردم ، کد میشه این :

var
MyDate:TDate;
Year,Month,Day:Word;
begin
MyDate:=StrToDate('2009/10/24');
DecodeDate(MyDate,Year,Month,Day);
ShowMessage(IntToStr(Year)+'-'+IntToStr(Month)+'-'+IntToStr(Day));
end;

یونیت DateUtils رو Uses کنید .

بهترين روش همينه و براي اينكه براي تاريخ مورد نظر (شمسي) هم جواب بده من كمي تغييرش دادم


Function SplitDate(HejriDate: String):Boolean;
var
MyDate:TDate;
Year,Month,Day:Word;
begin
ShortDateFormat := 'dd/MM/yyyy';
MyDate:=StrToDate(HejriDate); // '02/12/1388'
DecodeDate(MyDate,Year,Month,Day);
Form1.Edit1.Text := IntToStr(Year);
Form1.Edit2.Text := IntToStr(Month);
Form1.Edit3.Text := IntToStr(Day);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
SplitDate('02/12/1388');
end;

Mahmood_M
سه شنبه 19 اسفند 1393, 19:59 عصر
بهترين روش همينه و براي اينكه براي تاريخ مورد نظر (شمسي) هم جواب بده من كمي تغييرش دادم
مشکل فرمت تاریخ نیست ، مشکل اصلی اینجاست که تعداد روزهای ماه N ام در تاریخ شمسی معادل تعداد روزهای ماه N ام در تاریخ میلادی نیست ، و تعداد روزها برای بررسی صحت تاریخ وارد شده به عنوان ورودی در توابع تبدیل تاریخ چک میشه
به عنوان مثال ، عبارت " 31/02/1394 " یک تاریخ معتبر شمسی هست ، درحالی که در تاریخ میلادی معتبر نیست ، چون ماه دوم میلادی 28 یا 29 روزه هست و کد شما برای این مقدار ورودی خطا میده
توابع مربوط به تاریخ با تاریخ میلادی ست شده اند و به طور کلی با تاریخ شمسی سازگار نیستند ، به خاطر همینه که بهتره تاریخ شمسی به صورت String مدیریت بشه
برای درک بهتر اینجا (http://en.wikipedia.org/wiki/Gregorian_calendar) ( تاریخ میلادی ) و اینجا (http://en.wikipedia.org/wiki/Solar_Hijri_calendar) ( تاریخ شمسی ) رو ببینید ، لیست ماه ها همراه با تعداد روزها

دلفــي
چهارشنبه 20 اسفند 1393, 10:33 صبح
مشکل فرمت تاریخ نیست ، مشکل اصلی اینجاست که تعداد روزهای ماه N ام در تاریخ شمسی معادل تعداد روزهای ماه N ام در تاریخ میلادی نیست ، و تعداد روزها برای بررسی صحت تاریخ وارد شده به عنوان ورودی در توابع تبدیل تاریخ چک میشه
به عنوان مثال ، عبارت " 31/02/1394 " یک تاریخ معتبر شمسی هست ، درحالی که در تاریخ میلادی معتبر نیست ، چون ماه دوم میلادی 28 یا 29 روزه هست و کد شما برای این مقدار ورودی خطا میده
توابع مربوط به تاریخ با تاریخ میلادی ست شده اند و به طور کلی با تاریخ شمسی سازگار نیستند ، به خاطر همینه که بهتره تاریخ شمسی به صورت String مدیریت بشه
برای درک بهتر اینجا (http://en.wikipedia.org/wiki/Gregorian_calendar) ( تاریخ میلادی ) و اینجا (http://en.wikipedia.org/wiki/Solar_Hijri_calendar) ( تاریخ شمسی ) رو ببینید ، لیست ماه ها همراه با تعداد روزها

فرمايشتون كاملا درسته ولي ميشه براي حل اين مشكل هم از توابع تبديل تاريخ شمسي به ميلادي و بالعكس استفاده كرد ! البته كمي پروسه تبديل زياد ميشه ولي راهكاريه كه قابل پياده سازيه ، مدريت به صورت رشته هم بد نست .