PDA

View Full Version : سوال: بدست آوردن سن از روی تاریخ تولد و تاریخ روز



amir200h
سه شنبه 13 فروردین 1392, 23:15 عصر
سلام به همه دوستان.
من میخوام بوسیله دوتا تکست باکس که یکی تاریخ تولده و دیگری تاریخ امروز سنو بدست بیارم.
تاریخ ها هم به شمسی هستند. مثل زیر

تاریخ تولد: 1369/04/28
تاریخ جاری: 1392/01/13

plus
سه شنبه 13 فروردین 1392, 23:50 عصر
اول با String.Split، مولفه های تاریخ رو جدا کنید، بعد با int.Parse مولفه ها رو از رشته به عدد تبدیل کنید. بعد با کلاس System.Globalization.PersianCalendar تاریخ میلادی معادل دو تاریخ رو بدست بیارین.بعد از متد Substract تاریخ میلادی معادل تاریخ جاری استفاده کنید و تاریخ تولد رو ازش کم کنید. خروجی، مولفه های روز ماه و سال داره که همون سن میشه.

veniz2008
سه شنبه 13 فروردین 1392, 23:55 عصر
سلام.
راحت ترین راه اینه که تاریخ تولد رو به datetime تبدیل کنید. تاریخ جاری سیستم هم که میلادی هست. اختلاف این دو تا رو بر حسب روز محاسبه کنید و حتی میتونید از توابع خیلی مفید sql در این زمینه استفاده کنید (از جمله تابع DateDiff که میتونه بهتون کمک کنه).
سمت سی شارپ یک نمونه میتونه اینطور باشه:

DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now.AddDays(-368);
int m = (d1 - d2).Days;
MessageBox.Show(m.ToString());
موفق باشید.

amir200h
سه شنبه 13 فروردین 1392, 23:57 عصر
بچه ها من تازه کارم. میشه واضح تر بگین. اینایی که گفتین وایه من در حد حل معادلات دیفرانسیله

amir200h
چهارشنبه 14 فروردین 1392, 00:17 صبح
من اینجوری مقادیرو میریزم تو آرایه. حالا چطور سن دقیق رو بدست بیارم؟

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());

erfan_urchin
چهارشنبه 14 فروردین 1392, 03:09 صبح
امیرجان به نظرم از این روش برنامتو بنویسی خیلی بهتر و راحت تره و دیگه نیاز به split و این چیزا نداره
البته این برنامه ای که بهت میدم احتمالا تو محاسبه یه جاهاییش مشکل داره چون این برنامه رو تو اوج خستگی نوشتم :لبخندساده:
دیگه زحمت درست کردنش با خودت
موفق باشی

amir200h
چهارشنبه 14 فروردین 1392, 11:01 صبح
مرسی عرفان جان. ولی به قول خودت ایراد زیاد داشت. بازم ممنونم

aboulfazl950
چهارشنبه 14 فروردین 1392, 11:41 صبح
سلام! بهترین راه استفاده از کلاس 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 ;

amir200h
چهارشنبه 14 فروردین 1392, 12:12 عصر
aboulfazl950 (http://barnamenevis.org/member.php?246929-aboulfazl950) جان میشه بیشتر توضیح بدی. از دیشب گیر کردم توش

aboulfazl950
چهارشنبه 14 فروردین 1392, 12:32 عصر
این یک نمونه ساده

102236

amir200h
چهارشنبه 14 فروردین 1392, 12:57 عصر
فکر کنم به جواب رسیدم.
کد رو میزارم. دوستان چک کنن اگه ایراد داره ایرادشو برطرف کنن

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);
}

aboulfazl950
چهارشنبه 14 فروردین 1392, 14:31 عصر
دوست عزیز چون زمان بین دو تاریخ برحسب روز است برای بدست آوردن ماه و روز بجای 12 عدد 30 را قرار دهید.
تقریبا درست خواهد بود

amir200h
چهارشنبه 14 فروردین 1392, 15:38 عصر
aboulfazl950 جواب که اشتباهه تقریبا ولی من که دیگه عقلم به جایی نرسید :D

aboulfazl950
چهارشنبه 14 فروردین 1392, 19:36 عصر
اشتباه بودن جواب بدلیل سال کبیسه و 31 روزه بودن 6 ماه اول سال است.

روش دیگر این است که بی خیال timespan شویم و ابتدا تفاوت روزها را بدست بیاوریم اگر عدد اول کوچکتر بود از ماه ها یکی کم کنیم و 30 روز به روزها اضافه کنیم و الی آخر .

علی فتحی
شنبه 24 فروردین 1392, 10:57 صبح
کسی به جواب نرسید توضیح بهتر بدهید

linux
شنبه 24 فروردین 1392, 12:19 عصر
کسی به جواب نرسید توضیح بهتر بدهید

یک کمی سخت هست دلیلش هم این هست که مقادیر ثابت نیستند راه حل زیر به نظرم جواب می‌دهد
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);

}

amir200h
شنبه 24 فروردین 1392, 16:05 عصر
کسی به جواب نرسید توضیح بهتر بدهید

اینم جواب کامل که به درستی کار میکنه.




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"));
}

linux
شنبه 24 فروردین 1392, 17:54 عصر
اینم جواب کامل که به درستی کار میکنه.




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"));
}


دوست عزیز متاسفانه این روش شما جواب درست نخواهد داد،‌جمع و تفریق اینجوری جوابگو نیست.

amir200h
شنبه 24 فروردین 1392, 17:58 عصر
جوابی که این کد دادو با چندتا سایت مقایسه کردم. جواب ها یکی بود

linux
شنبه 24 فروردین 1392, 18:17 عصر
جوابی که این کد دادو با چندتا سایت مقایسه کردم. جواب ها یکی بود
سالهای کبیسه چطور محاسبه می‌شوند؟ این برای من سوال هست؟

amir200h
شنبه 24 فروردین 1392, 18:31 عصر
تبدیل به میلادی میشن و از روی تاریخ میلادی محاسبه میشه

sarah001
یک شنبه 21 بهمن 1397, 11:47 صبح
CS0246: The type or namespace name 'PersianCalendar' could not be found (are you missing a using directive or an assembly reference?)

sarah001
یک شنبه 21 بهمن 1397, 11:48 صبح
کلاس persian
Calendar رو بهم میدین؟

danialafshari
یک شنبه 21 بهمن 1397, 14:56 عصر
کلاس persian
Calendar رو بهم میدین؟


using System.Globalization;