PDA

View Full Version : تاریخ فارسی



net_ved
جمعه 30 اردیبهشت 1384, 15:33 عصر
سلام
من برای تاریخ زدن از متد strtodate استفاده می کنم برای مثال وقتی رشته 1384/02/31 را به date

بدل می کنم error تاریخ نا معتبر را می ده....من متوجه شدم که این مورد یک ماه در میان وجود داره

البته تو ماهای میلادی ...ماه های 2و4و6و8و10و12 و البته یه استثنا هم وجود داره ماه دوم....که فقط تا

29 روز می گیره...حالا ما ایرونی هایی که 6 ماه اولمون 31 روزه ست چه کنیم....

net_ved
جمعه 30 اردیبهشت 1384, 20:03 عصر
آقایون من می دونم که این کار نشدنیه...یعنی یه سرچکی زدم....ولی شما راهی ندارین....آخه این همه برنامه مهم تو کشور داره با تاریخ شمسی درست کار می کنه....اینم بدونین که مشکل من ذخیره سازی تاریخ در جول نیست مشکل من اینه که می خوام مثلا به تاریخ 1384/02/31 دو روز اضافه کنم...چطوری این مشکلو حل کنم ...من در حالت عادی از strtodate+10 برای اضافه کردن 10 روز استفاده می کنم....دیگه چه راهی است...

net_ved
جمعه 30 اردیبهشت 1384, 20:07 عصر
یه سوال دیگه اینکه ...نمی شه یه تقویم فارسی بدون نیاز به استفاده از تاریخ میلادی نوشت؟....یعنی یه تقویم مستقل از تاریخ ویندو....

majid_afra222
جمعه 30 اردیبهشت 1384, 21:07 عصر
سلام net_ved
من برای کار با تاریخ 2 تا تابع نوشتم که میلادی رو به شمسی تبدیل می کنه و بالعکس٬‌تاریخ رو تو بانک بصورت میلادی نگه می دارم و فقط برای نمایش و ورود تاریخ از کاربر شمسی اونرو می گیرم.
با اینکار براحتی می تونم٬‌توابع مربوط به تاریخ رو روی تاریخ موجود در بانک اطلاعاتی اعمال کنم.
به نظر من امکان نوشتن یه تاریخ مستقل از ویندوز وجود نداره.

hamidrezaA
جمعه 30 اردیبهشت 1384, 21:36 عصر
اگه برید help رو بخونید می تونید رنج تاریخ رو برای سال میلادی ببینید که فکر کنم 18xxمیلادی می باشد
بنابراین معلوم است که از تاریخ 1384 ایراد بگیرد.
بایستی قبل از دادن به تابع یک سری کو وزیاد انجام شود.

Delphi KDE
جمعه 30 اردیبهشت 1384, 23:37 عصر
هر برنامه نویس ایرانی بالاخره باید دیر یا زود مشکل خودشو با تاریخ شمسی حل کنه
استفاده از نوع TDateTime هم فایدهای ندارد چون تعداد روزهای گذشته از تاریخ 30/12/1899 را نگهداری میکند که عملا با تاریخ ما سازگار نیست
حال شما دو راه بیشتر ندارید یا اینکه همان طور که دوستان فرمودند از کامپوننت های تجاری در بازار مانند ShDate استفاده کنید و یا اینکه تصمیم بگیرید که خودتون این مشکل را به یکبار برای همیشه حل کنید .من از راه دوم استفاده کردم
اگر شما هم خواستید از راه دوم استفاده کنید میتونید هر سوالی داشتید در این بخش مطرح کنید

در ضمن توابع زیادی قبلا توسط دوستان به زبان های مختلف تهیه شده که با یک جستجوی کوچولو در همین سایت حتما چند تا از اونها را پیدا خواهید کرد


موفق باشید :wise2:

parhizkar2000
شنبه 31 اردیبهشت 1384, 00:19 صبح
آقایون من می دونم که این کار نشدنیه...یعنی یه سرچکی زدم
میتونی به اینجا هم سری بزنی
http://www.barnamenevis.org/forum/viewtopic.php?t=24738

Mahdi_S_T
شنبه 31 اردیبهشت 1384, 07:05 صبح
بهترین کار استفاده از کامپوننت های زیر است که من چند وقتی است با آن کار می کنم و دیگر نگرانی کار با تاریخ شمسی ندارم . ....... به شرط چاقو .........

http://www.farsicomponents.com

hamidrezaA
شنبه 31 اردیبهشت 1384, 15:16 عصر
بهترین کار استفاده از کامپوننت های زیر است که من چند وقتی است با آن کار می کنم و دیگر نگرانی کار با تاریخ شمسی ندارم
منم با نظرت موافقم یکی از بهترین کامپوننت های نوشته شده برای تاریخ فارسی می باشد. قیمتشم هم مناسب است.

SalarSoft
شنبه 31 اردیبهشت 1384, 15:37 عصر
کامپوننت تبدیل تاریخ میلادی به شمسی:

www.salarsoft.somee.com

در ضمن این توابع با استفاده از TDateTime کار میکنند.
توضیحات آن را حتما بخوانید.
تو ضیحات توابع: www.salarsoft.somee.com/magaleh/m_farsi_date_help.htm :)

net_ved
شنبه 31 اردیبهشت 1384, 16:04 عصر
نگاه کنید دوستان....اکثر شما سوال منو درست متوجه نشدین....من مشکلی برای تبدیل و ثبت تاریخ ندارم...مشکل وقتی که من می خوام با روال strtodate به رشته...1384/02/31 ده روز اضافه کنم خود رویه strtodate برام مشکلساز می شه....این موضورو چطور حل کنم....من در اجبم این همه سیستم dos دارن بدون مشکل کار می کنن...آخه چطوری؟...اونام از کامپوننت استفاده کردن؟....اینقد با کامپوننت کار کردیم که اگه روزی برسه ابزار نداشته باشیم گیرپاچ می کنیم.

ali512
شنبه 31 اردیبهشت 1384, 17:46 عصر
با سلام
من تاریخ را به صورت فارسی 22/10/1384 دریافت کردم بعدا این تاریخ را به صورت تعداد روز از تاریخ 1/1/1302 محاسبه کردم مثلا می شود 7521254 روز این عدد را بع مثلا 10 جمع کردم و سپس عدد حاصله را دومرتبه به تاریخ تبدیل کردم به این ترتیب تاریخ بعدی به دست آمده است . اگر منظورتون اینه می تونم تابع نوشته شده را هم ارسال کنم

net_ved
شنبه 31 اردیبهشت 1384, 19:02 عصر
خیلی ممنون می شم اگه ارسال کنید

javidtaheri
دوشنبه 02 خرداد 1384, 12:41 عصر
ساده ترین راه تعریف Mask تاریخ و string تعریف کردن فیلد مربوطه است
یکی از دوستان هم unit برای تاریخ فارسی و تبدیل آن به میلادی نوشته که من ارسال میکنم

ali512
دوشنبه 02 خرداد 1384, 16:12 عصر
امیدوارم بدرد بخوره

ali512
دوشنبه 02 خرداد 1384, 16:14 عصر
me_date.text:=date_badi('82/10/08',128);
//*****************************

function date_badi(d:st8;tr:integer):st10;
const
a:array[1..13]of word=(0,31,62,93,124,155,186,216,246,276,306,336,3 65);
var
da:string[10];
tk,dm,dan:longint;
i:byte;
begin
tk:=trunc(((strtoint(copy(d,1,2))-2)*365.25)+a[(strtoint(copy(d,4,2)))]+ strtoint(copy(d,7,2))+tr);
dan:=trunc(tk/365.25)+1302;
da:=trim(inttostr(dan)+'/');
dm:=trunc(tk-(trunc(tk / 365.25)*365.25));
i:=1;
while dm>a[i] do
i:=i+1;

if (i-1)<10 then
da:=da+'0'+trim(inttostr(i-1))+'/'
else
da:=da+trim(inttostr(i-1))+'/';

if (dm-a[i-1])<10 then
da:=da+'0'+trim(inttostr(dm-a[i-1]))
else
da:=da+trim(inttostr(dm-a[i-1]));
date_badi:=da;
end;

MiRHaDi
چهارشنبه 04 خرداد 1384, 12:16 عصر
سلام عزیزم
تاریخ فارسی رو با StrToDate اگه بخوای ببری باید هم خطا بده
ماه 2 میلادی چند روزه ؟ خوب ! حالا شما میای میگی 31/2 خوب باید خطا بده !
اگر میخوای از TDate استفاده کنی باید تاریخ شمسی رو به میلادی تبدیل کنی و بعد ذخیره کنی و موقع استفاده اون رو به شمسی تبدیل کنی برای نمایش فقط ! محاسبات همه با میلادی انجام میشه !
این خیلی خاصیت نسبت به کار با رشته و امثال اون داره !
مثلا شما میتونی تاریخت رو با 100 جمع کنی و 100 روز دیگه رو داشته باشی بدون هیچ خطایی یا میتونی دو تا تاریخ رو از هم کم کنی ببینی چند روز گذشته ! حتی توی Sql میتونی ازشون استفاده کنی
بهترین راهش اینه
یا حق

Mehrdad_az65
پنج شنبه 09 تیر 1384, 08:24 صبح
من از این کامپونت توی تمام برنامه هام استفاده میکنم و خیلی عالیه و حتی از توابع اونمیشه برای تبدیل تاریخ میلادی به شمسی یا ... استفاده کرد .
اگر کسی خواست براش بفرستم برام Mail بزنید براتون Send میکنم . من خراب دلفی کارا هستم . :mrgreen: ::نوشتن::

Tarrah
پنج شنبه 09 تیر 1384, 08:43 صبح
سلام
نیکی و پرسش ؟

من خراب دلفی کارا هستم .
لطف کنین کامپوننتو بذارین اینجا همه استفاده کنن . :flower:

دنیای دلفی
پنج شنبه 09 تیر 1384, 10:09 صبح
کامپوننت Shdate برای کار با تاریخ شمسی در یونیت Shdateuntils توابع کاملی داره . :embr:

Amir_Safideh
جمعه 02 فروردین 1387, 12:18 عصر
خوب ببینید میتونید از این فانکشن ها استفاده کنید . من که خودم همیشه از همین فانکشن ها برای تبدیل تاریخ استفاده میکنم در ضمن تاریخ رو هم اگر بخوام در جداولم با فرمت شمسی ذخیره کنم نوع فیلد تاریخ رو از نوی کاراکتر میگیرم که مشکل ارورها دیتابیس حل بشه البته اگر محاسبه دقیق برروی تاریخ لازم دارید بهتره که هم تاریخ میلادی و هم شمسی رو ذخیره کنید که محاسبات شما اگر دقت زیادی روی تاریخ داره بتونی از تاریخ میلادی برای محاسبات استفاده کنی و تاریخ شمسی رو فقط نمایش بدی . چون تاریخ میلادی همونطور که یکی از دوستان گفتند قابلیتهای فراوانی توی دیتابیس داره که گاهی اوقات استفاده از اونها لازمه .
برای استفاده از این فانکشنها فقط یونیت اونها رو در یوزز اضافه کنید و از توابع اونها استفاده کنید .
------------
موفق باشید.

babak_delphi
جمعه 02 فروردین 1387, 14:08 عصر
من 2 تا تابع نوشتم یکی برای تبدیل شمسی به میلادی و یکی برای تبدیل تاریخ میلادی به شمسی
تاریخ سیستم رو میگیرم ، به شمسی تبدیل میکنم و در فرمی که به شکل یک تقویم ساختم نشون میدم (کاربر در این فرم امکان تغییر تاریخ را بصورت کامل و راحت داره)
موقع ذخیره بصورت عدد ذخیره میکنم
مثلا 14/05/1386 رو بصورت 13860514 ذخیره میکنم
2 تابع به نامهای DATE_TO_INT و INT_TO_DATE نوشتم که برای تبدیل تاریخ به عدد و عدد به تاریخ (با فرمت ذکر شده) استفاده می کنم
توابع دیگری هم برای کارهای مربوط به تاریخ نوشتم ، مثل : نشان دادن روز هفته ، نشان دادن فاصله 2 تاریخ هم بصورت روز و هم بصورت ماه و روز (47 روز یا مثلا 2 ماه و 6 روز)
توابع مشابه اینها در دلفی وجود داشت ولی چون برای تاریخ میلادی نوشته شده من برای اینکه دقیق باشه خودم یک بار توابع لازم رو نوشتم و تو برنامه هام از اونا استفاده می کنم
فرمی را هم که برای کار با تقویم ساخته ام رو به شکل یک تقویم کامل ساخته ام که از اون هم تو برنامه هام استفاده می کنم
شما هم میتونید از این راهکار استفاده کنید.

Amir_Safideh
شنبه 03 فروردین 1387, 23:10 عصر
این تاپیک رو هم یه نگاه بکنید شاید کمکتون کنه .
http://barnamenevis.org/forum/showthread.php?t=45349

babak_delphi
یک شنبه 04 فروردین 1387, 01:13 صبح
تعریف از خود نبود
معرفی یک راه حل بود که قبلا انجام داده بودم و میتونه مفید باشه
اینجا جای تعریف از خود نیست و در حضور اساتیدی مثل آقای وکیلی ، کرامتی ، کشاورز ، اینپرایز ، اکسیژن و بسیاری دیگر از اساتید من به خودم اجازه تعریف نمی دهم
شما هم بجای به انحراف کشیدن بحث سعی کنید با دید مثبت به مسائل نگاه کنید و منفی بافی ننمایید.
(هدف از این انجمن تبادل نظرات علمی و عملی است .)

وقتی که قرار نیست که کدهای سورس ذکر بشه پس بدونید که ذکر اسم تابع این دوست گرامی دردی از کسی دوا نمیکنه
ضمنا منظورم از گفتن اسم تابع اینه که توابع مشابه همین در VCL بودند که کار مشابهی رو انجام میدادند که من تابعی با عملکرد مشابه اون ولی اختصاصی سازی شده اش رو نوشتم و شما هم میتونید در موارد مشابه ، همین کار رو انجام بدید تا خواناتر هم باشه
(DateToInt »» Date_To_Int و ...)



Function MiladiToHejri(GregorianDate : String;DateType : Integer) : String;
var
jmm, jdd : string;
g_days_in_month, j_days_in_month : array[0..11] of Integer;
HijriMonths : array[1..12] of String;
g_day_no, j_day_no, jy, jm, gy, gm : Longint;
j_np, i, jd, GD : Integer;
flag : Boolean;
begin
Try
flag := true;
g_days_in_month[0] := 31;
g_days_in_month[1] := 28;
g_days_in_month[2] := 31;
g_days_in_month[3] := 30;
g_days_in_month[4] := 31;
g_days_in_month[5] := 30;
g_days_in_month[6] := 31;
g_days_in_month[7] := 31;
g_days_in_month[8] := 30;
g_days_in_month[9] := 31;
g_days_in_month[10] := 30;
g_days_in_month[11] := 31;
j_days_in_month[0] := 31;
j_days_in_month[1] := 31;
j_days_in_month[2] := 31;
j_days_in_month[3] := 31;
j_days_in_month[4] := 31;
j_days_in_month[5] := 31;
j_days_in_month[6] := 30;
j_days_in_month[7] := 30;
j_days_in_month[8] := 30;
j_days_in_month[9] := 30;
j_days_in_month[10] := 30;
j_days_in_month[11] := 29;
If GregorianDate = Null Then Exit;
gy := (StrToInt(FormatDateTime('yyyy', StrToDate(GregorianDate)))) - 1600 ;
gm := (StrToInt(FormatDateTime('mm', StrToDate(GregorianDate)))) - 1 ;
GD := (StrToInt(FormatDateTime('dd', StrToDate(GregorianDate)))) - 1 ;
g_day_no := 365 * gy + (gy + 3) div 4 - (gy + 99) div 100 + ( gy + 399) div 400;
i := 0;
While i < gm do
begin
g_day_no := g_day_no + g_days_in_month[i];
i := i + 1;
end;
If (gm > 1) And (((gy Mod 4 = 0) And (gy Mod 100 <> 0)) Or (gy Mod 400 = 0)) Then
g_day_no := g_day_no + 1;
g_day_no := g_day_no + GD;
j_day_no := g_day_no - 79;
j_np := j_day_no div 12053;
j_day_no := j_day_no Mod 12053;
jy := 979 + 33 * j_np + 4 * (j_day_no div 1461);
j_day_no := j_day_no Mod 1461;
If (j_day_no >= 366) Then
begin
jy := jy + (j_day_no - 1) div 365;
j_day_no := (j_day_no - 1) Mod 365;
End;
i := 0;
While (j_day_no >= j_days_in_month[i]) and flag do
begin
j_day_no := j_day_no - j_days_in_month[i];
i := i + 1;
If i > 12 Then
begin
i := 11;
j_day_no := 29;
flag := False;
End;
end;
jm := i + 1;
jd := j_day_no + 1;
jmm := IntToStr(jm);
jdd := IntToStr(jd);
If (Length(jmm) = 1) then
jmm := '0' + jmm
else
jmm := jmm;
if (Length(jdd) = 1) then
jdd := '0' + jdd
else
jdd := jdd;
HijriMonths[1] := 'فروردین';
HijriMonths[2] := 'اردیبهشت';
HijriMonths[3] := 'خرداد';
HijriMonths[4] := 'تیر';
HijriMonths[5] := 'مرداد';
HijriMonths[6] := 'شهریور';
HijriMonths[7] := 'مهر';
HijriMonths[8] := 'آبان';
HijriMonths[9] := 'آذر';
HijriMonths[10] := 'دی';
HijriMonths[11] := 'بهمن';
HijriMonths[12] := 'اسفند';
if jmm = '13' then
begin
jmm := '12';
jdd := '30';
end;
Case DateType of
0:
MiladiToHejri := IntToStr(jy) + '/' + jmm + '/' + jdd;
1:
MiladiToHejri := IntToStr(strtoint(jdd)) + ' ' + HijriMonths[StrToInt(jmm)] + ' ' + IntToStr(jy);
End;
except
MiladiToHejri := 'تاریخ وارد شده، اشتباه می باشد .';
end;
End;
Function HijriToMiladi(HijriDate : String;DateType : Integer) : String;
var
jy, jm, jd, Hd, Gd,y ,m, tmp, jmmm, jddd, jyyy : string;
c : Integer;
MiladiMonths : array[1..12] of String;
begin
jy := Copy(HijriDate,1,4);

jm := copy(HijriDate, 6, 2);
If (Length(jm) = 1) then
jm := '0' + jm
else
jm := jm;
jd := copy(HijriDate,9,2);
if (copy(jd,1,1) = '/' ) then
jd := '0' + copy(jd,2,1)
else
jd := jd;

HD := jy + '/' + jm + '/' + jd;
Case StrToInt(jm) of
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 :
begin
m := IntToStr(StrToInt(jm) + 2);
Y := IntToStr(StrToInt(jy) + 621);
end;
11, 12 :
begin
m := '0' + copy(jm,2,1);
Y := IntToStr(StrToInt(jy) + 622);
end
End;//case
GD := Y + '/' + m + '/01';
c := 0;
While True do
begin
tmp := GD;
If HD = MiladiToHejri(GD,0) Then
break;
GD := DateToStr(strtoDate(tmp)+ 1);
c := c + 1;
If c > 1000 Then
begin

HijriToMiladi := '. تاریخ وارد شده، اشتباه می باشد ';
Exit;
end;
end;//while
MiladiMonths[1] := 'January';
MiladiMonths[2] := 'February';
MiladiMonths[3] := 'March';
MiladiMonths[4] := 'April';
MiladiMonths[5] := 'May';
MiladiMonths[6] := 'June';
MiladiMonths[7] := 'July';
MiladiMonths[8] := 'August';
MiladiMonths[9] := 'September';
MiladiMonths[10] := 'October';
MiladiMonths[11] := 'November';
MiladiMonths[12] := 'December';
Case DateType of
0:
HijriToMiladi := GD;
1:
begin
jyyy := copy(GD,1,4);
jmmm := copy(GD,6,2);
if (copy(jmmm,2,1) = '/' ) then
jmmm := '0' + copy(jmmm,1,1)
else
jmmm := jmmm;
jddd := copy(GD,Length(GD)-1,2);
if (copy(jddd,1,1) = '/' ) then
jddd := '0' + copy(jddd,2,1)
else
jddd := jddd;
HijriToMiladi := IntToStr(strtoint(jddd))+'th of' + ' ' + MiladiMonths[StrToInt(jmmm)] + ' '+jyyy;
end;
End;
End;

dkhatibi
یک شنبه 04 فروردین 1387, 10:44 صبح
چرا از dll موجود استفاده نمی کنید.

sadeqazar
شنبه 31 فروردین 1387, 23:01 عصر
آیا کسی هست که مرادراستفاده از DbIsam راهنمایی یا آموزش بدهد؟

babak_delphi
شنبه 31 فروردین 1387, 23:42 عصر
یعنی مشکاتون حل نشد؟
من تابع مورد استفاده را هم قرار دادم
یک مقدار هم خلّاقیت نشان دهید

mtcox3000
سه شنبه 19 شهریور 1387, 15:20 عصر
سلام من چگونه می تونم تاریخ روبرو رو به صورت زیر تبدیل کنم 01/01/1387
یکم فروردین ماه هزار و سیصدو هشتاد وهفت