PDA

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



AmirAmiri
جمعه 21 اسفند 1388, 18:17 عصر
سلام دوستان این کلاس PersianCalnendar تا چه حد درست کار میکنه؟
آخه من یه کلاس برای تبدیل تاریخ میلادی به شمسی و بلعکس یعنی شمسی به میلادی درست کردم اما نمیدونم چرا وقتی از میلادی به شمسی تبدیل میکنم دو روز اختلاف داره و دو روز بعد رو میده.
کلاسی که نوشتم رو اینجا میزارم اگه ممکنه تست کنید و راهنمایی کنید.
من میخوام از کلاس استفاده کنم و نه از DLL چون میخوام تو خوده برنامه اضافه کنم. کلا نمیخوام با استفاده از DLL باشه برای همین این کلاس رو نوشتم و از همه مهم تر اینکه میخوام قابلیت تبدیل بلعکس یعنی از شمسی به میلادی رو هم داشته باشه که اینجا تو این کلاسی که نوشتم داره اما مشکل همونه که گفتم.
حالا از دوستان هر کی میتونه کمک کنه چون خیلی لازم دارم.

کلاسی که نوشتم اینه:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Runtime.InteropServices;
namespace Curtain_Shops
{
/// <summary>
/// Date Convertor.
/// Convert Gregorian to Hijri Solar.
/// Convert Hijri Solar to Gregorian.
/// Created by Amir Amiri.
/// </summary>
class DateConvertor
{
private PersianCalendar Persian = new PersianCalendar();
private DateTime dt;
/// <summary>
/// Convert System Gregorian Date to Hijri Solar Date.
/// </summary>
/// <returns>Return Hijri Solar Date in DateTime Data Type.</returns>
public DateTime ToHijri()
{
int pYear = Persian.GetYear(DateTime.Now);
int pMonth = Persian.GetMonth(DateTime.Now);
int pDay = Persian.GetDayOfMonth(DateTime.Now);
return new DateTime(pYear, pMonth, pDay); ;
}
/// <summary>
/// Convert Gregorian Entered Date to Hijri Solar Date.
/// </summary>
/// <param name="Year">Enter Gregorian Year.</param>
/// <param name="Month">Enter Gregorian Month.</param>
/// <param name="Day">Enter Gregorian Day.</param>
/// <returns>Return Hijri Solar Date in DateTime Data Type.</returns>
public DateTime ToHijri(int Year, int Month, int Day)
{
dt = new DateTime(Year, Month, Day);
int pYear = Persian.GetYear(dt);
int pMonth = Persian.GetMonth(dt);
int pDay = Persian.GetDayOfMonth(dt);
return new DateTime(pYear, pMonth, pDay); ;
}
/// <summary>
/// Convert Gregorian Entered Date to Hijri Solar Date.
/// </summary>
/// <param name="Date">Enter Gregorian DateTime. For Example (DateTime.Now)</param>
/// <returns>Return Hijri Solar Date in DateTime Data Type.</returns>
public DateTime ToHijri(DateTime Date)
{
int pYear = Persian.GetYear(Date);
int pMonth = Persian.GetMonth(Date);
int pDay = Persian.GetDayOfMonth(Date);
return new DateTime(pYear, pMonth, pDay); ;
}
/// <summary>
/// Convert Hijri Solar Entered Date to Gregorian Date.
/// </summary>
/// <param name="Date">Enter Hijri Solar DateTime.</param>
/// <returns>Return Gregorian Date in DateTime Data Type.</returns>
public DateTime ToGregorian(DateTime Date)
{
DateTime dt = Persian.ToDateTime(
Date.Year,
Date.Month,
Date.Day,
Date.Hour,
Date.Minute,
Date.Second,
Date.Millisecond);
return dt;
}
/// <summary>
/// Convert Hijri Solar Entered Date to Gregorian Date.
/// </summary>
/// <param name="Year">Enter Hijri Solar Year.</param>
/// <param name="Month">Enter Hijri Solar Month.</param>
/// <param name="Day">Enter Hijri Solar Day.</param>
/// <returns>Return Gregorian Date in DateTime Data Type.</returns>
public DateTime ToGregorian(int Year, int Month, int Day)
{
DateTime dt = Persian.ToDateTime(
Year,
Month,
Day,
DateTime.Now.Hour,
DateTime.Now.Minute,
DateTime.Now.Second,
DateTime.Now.Millisecond);
return dt;
}
}
}

FastCode
جمعه 21 اسفند 1388, 22:06 عصر
ب خاطر اینکه خروجی شمسی persianCalendar رشته هست نه datetime.(سوتی دادی وحشتناک)

AmirAmiri
جمعه 21 اسفند 1388, 22:35 عصر
ب خاطر اینکه خروجی شمسی persianCalendar رشته هست نه datetime.(سوتی دادی وحشتناک)
خیلی ممنون که نظر دادین اما من کمک خواستم جناب. در ضمن بد نبود حداقل یک بار اجراش میکردید تا متوجه بشید چی به چیه بعدا نظر میدادید. بنده هیچ سوتی ای ندادم اگه توجه داشته باشید ملاحضه میکنید که بنده تبدیل کردم و هیچ فرقی نمیکنه که خروجی String باشه یا DateTime باشه در هر صورت دو روز اختلاف داره.
ظاهرا که شما سوتی دادید وحشتناک!!!!

keivan mousavi
جمعه 21 اسفند 1388, 22:47 عصر
دوست عزیز از این کد استفاده کن

publicstaticstring ToPerssianData(this DateTime indate)
{
var calendar = new System.Globalization.PersianCalendar();
return string.Format("{0}/{1}/{2}", calendar.GetYear(indate), calendar.GetMonth(indate), calendar.GetDayOfMonth(indate));
}

var current = DateTime.Now;
MessageBox.Show(current.ToPerssianData());

من فکر کنم درست نوشته باشم و سوتی نداده باشم ولی اگر بازم مشکلی بود بگو

FastCode
جمعه 21 اسفند 1388, 22:54 عصر
public DateTime ToHijri(DateTime Date)
{
int pYear = Persian.GetYear(Date);
int pMonth = Persian.GetMonth(Date);
int pDay = Persian.GetDayOfMonth(Date);
return new DateTime(pYear, pMonth, pDay); ;
}
در ضمن فکر میکنم بخاطر من آزرده خاطر شدید که از این بابت عذر میخوام.


این هم هست:

internal static int? DateToInt(string Date)
{
if (Date == null)
{
return null;
}
if (Date.Length != 10)
{
return null;
}
return new int?(((short.Parse(Date.Substring(0, 4)) << 0x10) | (byte.Parse(Date.Substring(5, 2)) << 8)) | byte.Parse(Date.Substring(8, 2)));
}
internal static string Get_CurrentDate()
{
if (cd == null)
{
cd = PersianCalendar.GetYear(DateTime.Now).ToString() + "/" + PersianCalendar.GetMonth(DateTime.Now).ToString(). PadLeft(2, '0') + "/" + PersianCalendar.GetDayOfMonth(DateTime.Now).ToStri ng().PadLeft(2, '0');
}
return cd;
}

internal static string Get_YearFirstDay()
{
return (PersianCalendar.GetYear(DateTime.Now).ToString() + "/01/01");
}
internal static DateTime ToGeorgian(string dateTime)
{
int year = Interaction.Val_int(dateTime.Substring(0, 4));
int month = Interaction.Val_int(dateTime.Substring(5, 2));
int day = Interaction.Val_int(dateTime.Substring(8, 2));
return PersianCalendar.ToDateTime(year, month, day, 1, 1, 1, 1);
}

internal static string ToShamsi(DateTime dateTime)
{
return (PersianCalendar.GetYear(dateTime).ToString() + "/" + PersianCalendar.GetMonth(dateTime).ToString().PadL eft(2, '0') + "/" + PersianCalendar.GetDayOfMonth(dateTime).ToString() .PadLeft(2, '0') + " " + dateTime.Hour.ToString().PadLeft(2, '0') + ":" + dateTime.Minute.ToString().PadLeft(2, '0') + ":" + dateTime.Second.ToString().PadLeft(2, '0'));
}

internal static string ToShamsiDate(DateTime dateTime)
{
return (PersianCalendar.GetYear(dateTime).ToString() + "/" + PersianCalendar.GetMonth(dateTime).ToString().PadL eft(2, '0') + "/" + PersianCalendar.GetDayOfMonth(dateTime).ToString() .PadLeft(2, '0'));
}

AmirAmiri
جمعه 21 اسفند 1388, 23:04 عصر
دوست عزیز از این کد استفاده کن
دوست عزیز از این کد استفاده کن

publicstaticstring ToPerssianData(this DateTime indate)
{
var calendar = new System.Globalization.PersianCalendar();
return string.Format("{0}/{1}/{2}", calendar.GetYear(indate), calendar.GetMonth(indate), calendar.GetDayOfMonth(indate));
}

var current = DateTime.Now;
MessageBox.Show(current.ToPerssianData());

من فکر کنم درست نوشته باشم و سوتی نداده باشم ولی اگر بازم مشکلی بود بگو

خیلی ممنونم از کمکتون و اینکه توجه داشتید اما بازم فرقی نکرد. اینی که شما داده بودید هم همون نتیجه رو داشت. نمیدونم شایدم سیستم عامل من مشکل داره. ببینید اگه ما بهش 14/3/2010 بدیم میبایست تاریخ 21/12/1388 رو بده اما تاریخی که میده اینه 23/12/1388 یعنی دو روز بعد رو میده. این مشکلیه که من دارم.

Netsky
جمعه 21 اسفند 1388, 23:08 عصر
سلام .
میتونید از تاریخی که بدست میاد 2 روز رو کم کنید تا حداقل کارتون راه بیفته .
بعد یه فکر اساسی در بارش بکنید .

AmirAmiri
جمعه 21 اسفند 1388, 23:16 عصر
در ضمن فکر میکنم بخاطر من آزرده خاطر شدید که از این بابت عذر میخوام.


این هم هست:

internal static int? DateToInt(string Date)
{
if (Date == null)
{
return null;
}
if (Date.Length != 10)
{
return null;
}
return new int?(((short.Parse(Date.Substring(0, 4)) << 0x10) | (byte.Parse(Date.Substring(5, 2)) << 8)) | byte.Parse(Date.Substring(8, 2)));
}
internal static string Get_CurrentDate()
{
if (cd == null)
{
cd = PersianCalendar.GetYear(DateTime.Now).ToString() + "/" + PersianCalendar.GetMonth(DateTime.Now).ToString(). PadLeft(2, '0') + "/" + PersianCalendar.GetDayOfMonth(DateTime.Now).ToStri ng().PadLeft(2, '0');
}
return cd;
}

internal static string Get_YearFirstDay()
{
return (PersianCalendar.GetYear(DateTime.Now).ToString() + "/01/01");
}
internal static DateTime ToGeorgian(string dateTime)
{
int year = Interaction.Val_int(dateTime.Substring(0, 4));
int month = Interaction.Val_int(dateTime.Substring(5, 2));
int day = Interaction.Val_int(dateTime.Substring(8, 2));
return PersianCalendar.ToDateTime(year, month, day, 1, 1, 1, 1);
}

internal static string ToShamsi(DateTime dateTime)
{
return (PersianCalendar.GetYear(dateTime).ToString() + "/" + PersianCalendar.GetMonth(dateTime).ToString().PadL eft(2, '0') + "/" + PersianCalendar.GetDayOfMonth(dateTime).ToString() .PadLeft(2, '0') + " " + dateTime.Hour.ToString().PadLeft(2, '0') + ":" + dateTime.Minute.ToString().PadLeft(2, '0') + ":" + dateTime.Second.ToString().PadLeft(2, '0'));
}

internal static string ToShamsiDate(DateTime dateTime)
{
return (PersianCalendar.GetYear(dateTime).ToString() + "/" + PersianCalendar.GetMonth(dateTime).ToString().PadL eft(2, '0') + "/" + PersianCalendar.GetDayOfMonth(dateTime).ToString() .PadLeft(2, '0'));
}


دوست عزیز از کمک شما هم خیلی ممنونم. اولش از حرفتون کمی آزرده شدم اما الان دیگه ناراحت نیستم. دوست عزیز تمامه این کدها مشابه هم هستن و همشون یک کار رو میکنه. این کلاس (PersianCalendar) کلا خروجی عدد داره حالا هیچ فرقی نمیکنه که ما این خروجی رو به رشته تبدیل کنیم تا به تاریخ. در کل دو روز اختلاف داره.
دوستان عزیز از همتون یه خواهش دارم که اگه انجام بدید واقعا دست بوستون میشم. خواهش دارم اون کدی که تو اولین پست گذاشتم رو امتحان کنید و ببینید که اگه مثلا تاریخ 14/3/2010 رو بهش بدیم چه جوابی میده آیا 21/12/1388 میده یا 23/12/1388 میده. بعد همین کارو با کدی که دوست خوبمون جناب آقای keivan mousavi قرار دادن تست کنید که البته مسلما نتیجه مشابه خواهد بود ولی خواهش دارم که در صورت امکان این کارو بکنید.

واقعا دارم گیج میشم شاید سیستم عامل من مشکلی داره آخه من از ویندوز سون 64 بیتی استفاده میکنم. ولی فکر نمیکنم ربطی داشته باشه. در هر صورت اگه شما هم امتحان کنید معلوم میشه که مشکل از کده یا از سیستم عاملم.

بازم از همتون ممنونم و همچنین شما دوست عزیز FastCode.

FastCode
جمعه 21 اسفند 1388, 23:23 عصر
خیلی ممنونم از کمکتون و اینکه توجه داشتید اما بازم فرقی نکرد. اینی که شما داده بودید هم همون نتیجه رو داشت. نمیدونم شایدم سیستم عامل من مشکل داره. ببینید اگه ما بهش 14/3/2010 بدیم میبایست تاریخ 21/12/1388 رو بده اما تاریخی که میده اینه 23/12/1388 یعنی دو روز بعد رو میده. این مشکلیه که من دارم.

14/3/2010:گیج:
امروز 12/3/2010 نه 14/3/2010

AmirAmiri
جمعه 21 اسفند 1388, 23:36 عصر
راست میگی.... پس چرا این یاهوی فلان شده زده بود 14 ؟؟ در هر صورت الان که تاریخم رو آپدیت کردم درست شد. خیلی ممنونم ازتون. واقعا ببخشید تقصیر این تاریخم بود. از همتون عذر خواهی میکنم و از همتون بی نهایت متشکرم.

keivan mousavi
شنبه 22 اسفند 1388, 11:20 صبح
خیلی ممنونم از کمکتون و اینکه توجه داشتید اما بازم فرقی نکرد. اینی که شما داده بودید هم همون نتیجه رو داشت. نمیدونم شایدم سیستم عامل من مشکل داره. ببینید اگه ما بهش 14/3/2010 بدیم میبایست تاریخ 21/12/1388 رو بده اما تاریخی که میده اینه 23/12/1388 یعنی دو روز بعد رو میده. این مشکلیه که من دارم.

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

Himalaya
شنبه 22 اسفند 1388, 11:57 صبح
چرا از این 2 تا پست استفاده نمیکنی... اینا که خیلی خوب جواب میدن

http://barnamenevis.org/forum/showpost.php?p=483295
http://barnamenevis.org/forum/showpost.php?p=483296

هر چند که گفتی ایراد از ... بود :قهقهه:

AmirAmiri
شنبه 22 اسفند 1388, 12:54 عصر
مشکلم حل شد. کلاسی که نوشته بودم هیچ ایرادی نداشت هر کی دیده گفته خیلی عالیه... مشکلم همونی بود که گفتم.
بازم ممنون.