PDA

View Full Version : مشکل در تبدیل تاریخ در بعضی از سالها



bahar_engineer
یک شنبه 10 خرداد 1388, 18:25 عصر
من توی برنامه ام تاریخ تولد رو می گیرم و روزش که رسید به کاربر تبریک می گم

کاربر توی ثبت اطلاعاتش تاریخ رو به شمسی وارد می کنه

با تابع زیر تبدیل به میلادی کردم و سپس با تاریخ سیستم مقایسه می کنم...



//convert shamsi to miladi
public DateTime Shamsi2Miladi(string _date)
{
int year = int.Parse(_date.Substring(0, 4));
int month = int.Parse(_date.Substring(5, 2));
int day = int.Parse(_date.Substring(8, 2));
PersianCalendar p = new PersianCalendar();
DateTime date = p.ToDateTime(year, month, day, 0, 0, 0, 0);
return date;
}


این کد مشکلی نداره اما نمی دونم چرا وقتی کاربر اطلاعات رو وارد می کنه بعضی از سال های خاص رو اگه به عنوان سال تولدش انتخاب کنه یه روز عقب و جلو می شه ... مثلاً اگه تاریخ تولدشو بزنه سال 1384/03/10 اون وقت توی برنامه تاریخ تولد اون رو به جای اینکه امروز حساب کنه یعنی 2009/05/31 می زنه 05/30 چرا اینطوری می شه ؟

اما اگه مثلاً سال 86 رو به عنوان سال تولد انتخاب کنه مشکلی پیش نمی آد !!

آیا دلیلش متغیر بودن تعداد روزهای هر ماه توی سال میلادی هست؟ یا این تابع مشکل داره؟
آخه سال میلادی یه ماهش 28 روزه یکی 30 روز یکی 31 روز و ...:افسرده:

afsharm
یک شنبه 10 خرداد 1388, 19:18 عصر
به سال‌های کبیسه توجه کنید…

اطلاعات بیشتر:
http://fa.farsiweb.ir/fawiki/Iranian_Calendar

bahar_engineer
دوشنبه 11 خرداد 1388, 10:42 صبح
من فکر می کردم این تابع خودش سالهای کبیسه رو هم حساب می کنه ؟؟؟!!!

حالا من باید چکار کنم؟

این لینکی هم که دادین به زبان c# باز نمی شه یعنی لینکش خرابه

کسی تبدیل (شمسی به میلادی) درست و حسابی داره برام بذاره ؟؟ که سال کبیسه رو هم حساب کرده باشه ؟؟

والا من این تابع رو هم از همین سایت دانلود کردم و تضمین داده بودند که سالهای کبیسه هم حساب کرده!!!:متعجب:

esmaeily-hosein
دوشنبه 11 خرداد 1388, 11:20 صبح
اون سالهای کبیسه رو هم حساب میکنه اینجا ساعت نقش بازی میکنه .

bahar_engineer
دوشنبه 11 خرداد 1388, 11:34 صبح
خوب راه حلتون چیه ؟؟ یعنی نمی شه کاری کرد؟

Hamishebahar
دوشنبه 11 خرداد 1388, 13:11 عصر
سلام دوست عزیز.
من اون کدرو روی سیستممم اجرا کردم میخواستم برات درست کنم دیدم درست جواب میده و مشکلی هم نداره.شاید از زبان ویندوزت باشه.اونو کاملاً فارسی کن و برنامت رو اجرا کن.

NewFoxStudent
دوشنبه 11 خرداد 1388, 14:13 عصر
اگه بخوای سمت DB این کار رو انجام بدی میتونی از این تابع استفاده کنی




CREATE FUNCTION GetFarsiDateWithFormat(@DateLatin AS DateTime)
RETURNS CHAR(10) AS
BEGIN
DECLARE @DateFarsi CHAR(10)
DECLARE @Days int
DECLARE @Tmp int
DECLARE @Year_Farsi int
DECLARE @Month_Farsi int
DECLARE @Day_Farsi int
SET @Days = DATEDIFF(DAY, '19000320', @DateLatin)
SET @Year_Farsi = 1279
SET @Month_Farsi = 01
SET @Day_Farsi = 01
SET @Tmp = @Days / 365
IF (@Tmp * 365) + ((@Tmp + 3) / 4) > @Days
SET @Tmp = @Tmp - 1
SET @Year_Farsi = @Year_Farsi + @Tmp
SET @Days = @Days - (@Tmp * 365) - ((@Tmp + 3) / 4)

IF @Days <= 186
BEGIN
SET @Tmp = @Days / 31
SET @Month_Farsi = @Month_Farsi + @Tmp
SET @Days = @Days - (@Tmp * 31)
END
ELSE
BEGIN
SET @Days = @Days - 186
SET @Tmp = @Days / 30
SET @Month_Farsi = @Month_Farsi + @Tmp + 6
SET @Days = @Days - (@Tmp * 30)
END
SET @Day_Farsi = @Day_Farsi + @Days
RETURN REPLACE(STR(@Year_Farsi, 4, 0) + '/' +
STR(@Month_Farsi, 2, 0) + '/' +
STR(@Day_Farsi,2, 0), ' ', '0')
END







توی VS هم میتونی از کنترل FarsiLibrary استفاده کنی

همه مدل تبدیل داره

31513

31514

31515

31516

bahar_engineer
دوشنبه 11 خرداد 1388, 14:22 عصر
ممنون از پاسختون اما اینطوری هم نشد !!

NewFoxStudent
دوشنبه 11 خرداد 1388, 14:24 عصر
ممنون از پاسختون اما اینطوری هم نشد !!

یعنی چطوری نشد؟
مشکلش چیه؟
همون مشکل قبلی رو دارید

bahar_engineer
دوشنبه 11 خرداد 1388, 14:45 عصر
منظورم اون بود که گفتن زبان ویندوز رو فارسی کنم

کد شما رو هنوز تست نکردم :متفکر:

mohsen_csharp
دوشنبه 11 خرداد 1388, 17:35 عصر
کلاس PersianCalendar خودش سال های کبیسه رو حساب میکنه.
من امتحان کردم نتیجه درست بود یعنی خروجی 31 ماه 5 بود.
ولی اگه تو سال 87 که کبیسه است اجرا کنیم نتیجه به درستی 30 ماه 5 میشه.

zoofa
سه شنبه 12 خرداد 1388, 00:10 صبح
سلام
از فايل ضميمه براي تبديل استفاده كنيد
سورسش به زبان vb است و يك كلاس هم هست كه مي تونيد تو c# هم از اون استفاده كنيد

با سال كبيسه هم مشكلي ندارد
من خودم تست كردم

با تشكر

salehbagheri
سه شنبه 12 خرداد 1388, 10:55 صبح
کسی تبدیل (شمسی به میلادی) درست و حسابی داره برام بذاره ؟؟ که سال کبیسه رو هم حساب کرده باشه ؟؟

این هم یه برنامه توپ که خودم نوشتم!

http://barnamenevis.org/forum/picture.php?albumid=214&pictureid=547

برای دانلود به امضام مراجعه کن!

bahar_engineer
چهارشنبه 13 خرداد 1388, 12:36 عصر
مسئله حل شد

راه حل رو تغییر دادم .. تا حالا تاریخ تولد رو به شمسی می گرفتم و به صورت میلادی در بانک ذخیره می کردم (تبدیل شمسی به میلادی) بعد هر روز می اومدم تاریخ سیستم رو با تاریخ تولد توی بانک مقایسه می کردم اگه یکی بود -> تولدت مبارک... اما مشکل این بود که اگه مثلاً تاریخ تولد 10 خرداد بود ، در سالهای مختلف به میلادی یه بار می شد 30 may و یه بار می شد 31 may
به این شکل روز تولد جابجا می شد

حالا برعکس عمل کردم ... تاریخ تولد رو به شمسی می گیرم و به شمسی هم توی بانک ذخیره می کنم ... هر روز تاریخ سیستم رو که میلادی هست به شمسی تبدیل می کنم و بعد اون رو با تاریخ توی بانک مقایسه می کنم... اینطوری دیگه مشکلی پیش نمی آد!!

از اول هم باید همین کار و می کردم :خجالت:

zoofa
چهارشنبه 13 خرداد 1388, 12:51 عصر
مسئله حل شد

راه حل رو تغییر دادم .. تاریخ تولد رو به شمسی می گیرم و به شمسی هم توی بانک ذخیره می کنم ... هر روز تاریخ سیستم رو که میلادی هست به شمسی تبدیل می کنم و بعد اون رو با تاریخ توی بانک مقایسه می کنم... اینطوری دیگه مشکلی پیش نمی آد!!

:خجالت:
سلام
1- مشكلي با مقايسه تاريخ شمسي نداريد در بانك
يعني مقايسه تاريخ هاي شمسي درست جواب مي دهد؟

2- بانك شما چيست؟

bahar_engineer
چهارشنبه 13 خرداد 1388, 13:47 عصر
بانکم اکسسه ... من ماه و روز رو جداگانه مقایسه می کنم به این شکل :



// convert milady to shamsi
System.Globalization.PersianCalendar shamsi = new System.Globalization.PersianCalendar();
DateTime sh;
string strdate = null;
strdate = DateTime.Now.ToString("yyyy/MM/dd");
sh = DateTime.Parse(strdate);
int ysh = shamsi.GetYear(sh);
int msh = shamsi.GetMonth(sh);
int dsh = shamsi.GetDayOfMonth(sh);
// end convert datetime

//check for birthday
thismon = msh.ToString();
today = dsh.ToString();

.
.
.

ks = " select * from users where (born like '%" + thismon + "%') and (born like '%" + today + "%')";
OleDbCommand cmd2 = new OleDbCommand(ks, con1);
.
.
.