سلام به همه دوستان.
من میخوام بوسیله دوتا تکست باکس که یکی تاریخ تولده و دیگری تاریخ امروز سنو بدست بیارم.
تاریخ ها هم به شمسی هستند. مثل زیر
تاریخ تولد: 1369/04/28
تاریخ جاری: 1392/01/13
سلام به همه دوستان.
من میخوام بوسیله دوتا تکست باکس که یکی تاریخ تولده و دیگری تاریخ امروز سنو بدست بیارم.
تاریخ ها هم به شمسی هستند. مثل زیر
تاریخ تولد: 1369/04/28
تاریخ جاری: 1392/01/13
اول با String.Split، مولفه های تاریخ رو جدا کنید، بعد با int.Parse مولفه ها رو از رشته به عدد تبدیل کنید. بعد با کلاس System.Globalization.PersianCalendar تاریخ میلادی معادل دو تاریخ رو بدست بیارین.بعد از متد Substract تاریخ میلادی معادل تاریخ جاری استفاده کنید و تاریخ تولد رو ازش کم کنید. خروجی، مولفه های روز ماه و سال داره که همون سن میشه.
سلام.
راحت ترین راه اینه که تاریخ تولد رو به datetime تبدیل کنید. تاریخ جاری سیستم هم که میلادی هست. اختلاف این دو تا رو بر حسب روز محاسبه کنید و حتی میتونید از توابع خیلی مفید sql در این زمینه استفاده کنید (از جمله تابع DateDiff که میتونه بهتون کمک کنه).
سمت سی شارپ یک نمونه میتونه اینطور باشه:
DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now.AddDays(-368);
int m = (d1 - d2).Days;
MessageBox.Show(m.ToString());
موفق باشید.
بچه ها من تازه کارم. میشه واضح تر بگین. اینایی که گفتین وایه من در حد حل معادلات دیفرانسیله
من اینجوری مقادیرو میریزم تو آرایه. حالا چطور سن دقیق رو بدست بیارم؟
string tavalod = textBox1.Text;
string datenow = textBox2.Text;
string[] split1 = tavalod.Split('/');
string[] split2 = datenow.Split('/');
int sen;
sen = (int.Parse(split2[0])) - (int.Parse(split1[0]));
MessageBox.Show(sen.ToString());
امیرجان به نظرم از این روش برنامتو بنویسی خیلی بهتر و راحت تره و دیگه نیاز به split و این چیزا نداره
البته این برنامه ای که بهت میدم احتمالا تو محاسبه یه جاهاییش مشکل داره چون این برنامه رو تو اوج خستگی نوشتم
دیگه زحمت درست کردنش با خودت
موفق باشی
مرسی عرفان جان. ولی به قول خودت ایراد زیاد داشت. بازم ممنونم
سلام! بهترین راه استفاده از کلاس timespan است.
اینم مثال:
DateTime myStartTime=new DateTime(2009,1,1,12,13,14,157);DateTime myEndTime=new DateTime(2010,9,12,13,14,15,165);
TimeSpan myDifference=myEndTime-myStartTime;
int totalDays=myDifference.Days ;
aboulfazl950 جان میشه بیشتر توضیح بدی. از دیشب گیر کردم توش
این یک نمونه ساده
tavvalod.rar
فکر کنم به جواب رسیدم.
کد رو میزارم. دوستان چک کنن اگه ایراد داره ایرادشو برطرف کنن
private void button2_Click(object sender, EventArgs e)
{
System.Globalization.PersianCalendar persia = new System.Globalization.PersianCalendar();
string FirstDate = "1369/04/28";
string EndDate = "1392/01/15";
Int16 StartYear = Convert.ToInt16(FirstDate.Substring(0, 4));
Int16 StartMonth = Convert.ToInt16(FirstDate.Substring(5, 2));
Int16 StartDay = Convert.ToInt16(FirstDate.Substring(8, 2));
Int16 EndYear = Convert.ToInt16(EndDate.Substring(0, 4));
Int16 EndMonth = Convert.ToInt16(EndDate.Substring(5, 2));
Int16 EndDay = Convert.ToInt16(EndDate.Substring(8, 2));
DateTime StartDateTime = persia.ToDateTime(StartYear, StartMonth, StartDay, 0, 0, 0, 0);
DateTime EndDateTime = persia.ToDateTime(EndYear, EndMonth, EndDay, 0, 0, 0, 0);
TimeSpan Difference = EndDateTime - StartDateTime;
int Days = Difference.Days;
int sal, mah, roz;
sal = Days / 365;
mah = (Days % 356) / 12;
roz = (Days % 365) % 12;
MessageBox.Show(sal+"/"+mah+"/"+roz);
}
دوست عزیز چون زمان بین دو تاریخ برحسب روز است برای بدست آوردن ماه و روز بجای 12 عدد 30 را قرار دهید.
تقریبا درست خواهد بود
aboulfazl950 جواب که اشتباهه تقریبا ولی من که دیگه عقلم به جایی نرسید :D
اشتباه بودن جواب بدلیل سال کبیسه و 31 روزه بودن 6 ماه اول سال است.
روش دیگر این است که بی خیال timespan شویم و ابتدا تفاوت روزها را بدست بیاوریم اگر عدد اول کوچکتر بود از ماه ها یکی کم کنیم و 30 روز به روزها اضافه کنیم و الی آخر .
کسی به جواب نرسید توضیح بهتر بدهید
یک کمی سخت هست دلیلش هم این هست که مقادیر ثابت نیستند راه حل زیر به نظرم جواب میدهد
public string GetAge(DateTime birthDate)
{
var now = DateTime.Now;
var tmpDate = birthDate;
int y = 0;
int m = 0;
int d = 0;
while (tmpDate < now)
{
if (tmpDate.AddYears(1) > now)
break;
tmpDate = tmpDate.AddYears(1);
y++;
}
while (tmpDate < now)
{
if (tmpDate.AddMonths(1) > now)
break;
tmpDate = tmpDate.AddMonths(1);
m++;
}
while (tmpDate < now)
{
tmpDate = tmpDate.AddDays(1);
d++;
}
return string.Format("{0},{1},{2}", y, m, d);
}
اینم جواب کامل که به درستی کار میکنه.
public string ShamsiToMiladi(string ShamsiDate)
{
try
{
PersianCalendar PDate = new PersianCalendar();
Int32 y = 0; Int32 m = 0; Int32 d = 0;
if (ShamsiDate.Length == 10)
{
y = Int32.Parse(ShamsiDate.Substring(0, 4));
m = Int32.Parse(ShamsiDate.Substring(5, 2));
d = Int32.Parse(ShamsiDate.Substring(8, 2));
}
else
{
return null;
}
return (PDate.ToDateTime(y, m, d, 1, 1, 1, 1, 1).ToShortDateString());
}
catch (Exception ex)
{
throw ex;
}
}
private void button4_Click(object sender, EventArgs e)
{
DateTime date1 = DateTime.Parse(ShamsiToMiladi("1369/04/28"));
DateTime date2 = DateTime.Parse(ShamsiToMiladi("1392/01/14"));
int days = date2.Day - date1.Day;
if (days < 0)
{
date2 = date2.AddMonths(-1);
days += DateTime.DaysInMonth(date2.Year, date2.Month);
}
int months = date2.Month - date1.Month;
if (months < 0)
{
date2 = date2.AddYears(-1);
months += 12;
}
int years = date2.Year - date1.Year;
MessageBox.Show(string.Format("{0} year{1}, {2} month{3} and {4} day{5}",
years, (years == 1) ? "" : "s",
months, (months == 1) ? "" : "s",
days, (days == 1) ? "" : "s"));
}
جوابی که این کد دادو با چندتا سایت مقایسه کردم. جواب ها یکی بود
تبدیل به میلادی میشن و از روی تاریخ میلادی محاسبه میشه
CS0246: The type or namespace name 'PersianCalendar' could not be found (are you missing a using directive or an assembly reference?)
کلاس persianCalendar رو بهم میدین؟
لطفاً از پرسیدن سوال در خصوصی خودداری کنید.
قبل از ایجاد تاپیک، حتماً قوانین سایت را مطالعه فرمایید.
قوانین پرسش های دانشجویی
برای درست وارد شدن کد در قالب C# سایت، ابتدا کد رو درون Notepad.exe کپی سپس از اونجا به سایت در قالب C# منتفل کنید
نرم افزار code manager دستیار برنامه نویسان جهت نگهداری کد ها