PDA

View Full Version : مشکل عجیب با نمایش تاریخ



mohammad87
سه شنبه 31 شهریور 1388, 23:50 عصر
سلام به بروبچ .... مخصوصا حرفه ای ها

آقا من هر جا رو سرچ کردم این مشکل رو نتونستم حل کنم :

قبلا وقتی با تابع خود asp.net برای تبدیل میلادی به شمسی توی تاریخ (روز های قبل) مشکلی نداشتم... اما امروز (31 شهریور 88 ) وقتی اطلاعاتم توی بانک ذخیره می کنم .... در هنگام نمایش به این پیغام بر می خورم :


Year, Month, and Day parameters describe an un-representable DateTime

کسی می دونه جریان چیه ؟ آخه روزهای دیگه سال رو خطا نمی گیره (البته تا به امروز جلوتر رو نمی دوم) تنها همین روز رو مشکل می گیره ؟

کسی راه حلی داره ؟

nazaninam
چهارشنبه 01 مهر 1388, 10:01 صبح
کدی که نوشتیو اینجا قرار بده

mohammad87
چهارشنبه 01 مهر 1388, 16:27 عصر
من از کلاس زیر استفاده کردم :

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Globalization;

public class MiladiToShamsi1
{


public MiladiToShamsi1()
{

}
public string get(object miladi1)
{
string month = "";
DateTime miladi = Convert.ToDateTime(miladi1);
PersianCalendar shamsi1 = new PersianCalendar();
DateTime shamsidate = new DateTime(shamsi1.GetYear(miladi), shamsi1.GetMonth(miladi), shamsi1.GetDayOfMonth(miladi), shamsi1.GetHour(miladi), shamsi1.GetMinute(miladi),shamsi1.GetSecond(miladi ));

int id_month = Convert.ToInt16(shamsidate.Month);
switch (id_month)
{
case 1:
month = "فروردين";
break;
case 2:
month = "ارديبهشت";
break;
case 3:
month = "خرداد";
break;
case 4:
month = "تير";
break;
case 5:
month = "مرداد";
break;
case 6:
month = "شهريور";
break;
case 7:
month = "مهر";
break;
case 8:
month = "آبان";
break;
case 9:
month = "آذر";
break;
case 10:
month = "دي";
break;
case 11:
month = "بهمن";
break;
case 12:
month = "اسفند";
break;
}
return (shamsidate.Day<10 ? ("0"+shamsidate.Day.ToString()) : shamsidate.Day.ToString())+ " " + month +shamsidate.Year.ToString()+ " " + (shamsidate.Hour<10 ? ("0" + shamsidate.Hour.ToString()) : shamsidate.Hour.ToString()) + ":" + (shamsidate.Minute<10 ? ("0" + shamsidate.Minute.ToString()) : shamsidate.Minute.ToString()) /* + ":" + (shamsidate.Second<10 ? ("0" +shamsidate.Second.ToString()): shamsidate.Second.ToString())*/ +"@" ;

}

بعد توی برنامه اینطوری فرامی خونمش:


public string miladitoshamsi(object miladi1)
{
MiladiToShamsi1 MtoS = new MiladiToShamsi1();
/*MtoS.A = 6;*/
string shamsi = MtoS.get(miladi1);
return shamsi;
}

کسی می تونه حلش کنه؟

mahdi_farhani
چهارشنبه 01 مهر 1388, 21:09 عصر
سلام
مشکل برنامه شما این است که ماه 9 ( سپتامبر ) دارای 30 روز است و شما مجاز به استفاده از روز 31 نیستید ........
ماه های میلادی یکی درمیان با هم فرق دارند مثل ما نیستند که هر 6 ماه تفاوت داشته باشد
در ضمن ماه فبریه 28 روز هست و در سال کبیسه 29 روز است که با این کدی که شما نوشتید 7 ماه از سال رو مشکل دارید !!!!!!!!!
ترجمه کدها نوشته شده به زبان ساده
تاریخ میلادی به استفاده از نوع Object به متد پاس داده میشه ؟!!! حالا چرا Object نمیدونم ؟!!!!
بعد تبدیل شده به یک نوع DateTime « بهتر بود به جای آبجکت مستقیم DateTime میومد»
خطی که خطا ایجاد میکند


DateTime shamsidate = new DateTime(shamsi1.GetYear(miladi),...............
شما با این کار اومدید تاریخ شمسی را به تاریخ میلادی تبدیل کردید که مشکل فوق الذکر برای شما در این خط ایجاد میشه

دستورات بعدی هم برای نمایش ماه است . «برای این کار بهتر بود نام ماه ها در یک آرایه قرار داده می شد و فقط اندیس ماه به آرایه داده میشود و خروجی گرفته میشد با این کار استفاده از سویچ حذف میشد »
------------------
به امضای من یک نگاه بنداز سورس برنامه هست ، از اون میتونی ایده های بیشتری بگیری

Himalaya
چهارشنبه 01 مهر 1388, 22:17 عصر
فکر کنم اگه از این استفاده کنی دیگه مشکلی نداری
کدهات هم خیلی کمتر میشه
در ضمن فهمش هم خیلی راحتتره
من ازش استفاده کردم و مشکلی ندارم
راستی نمیدونم که سر اختلاف ساعتی که ما با ساعت سرور داریم برای این روش مشکلی پیش میاد یا نه (سر اینکه چند ساعت دیرتر یا زودتر تاریخ تغییر کنه میگم)
همن الان که دارم اینا رو مینویسم تاریخ رو چک کردم درست بود


1388/07/01

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

mohammad87
چهارشنبه 01 مهر 1388, 23:06 عصر
مشکل حل شد.
ممنون از بچه هایی که کمک کردن به حل این مشکل
اصلاحیه کد بنده اینطوریه :


public MiladiToShamsi1()
{

}
public string get(object miladi1)
{
string month = "";
DateTime miladi = Convert.ToDateTime(miladi1);
PersianCalendar shamsi1 = new PersianCalendar();


int id_month = Convert.ToInt16(shamsi1.GetMonth(miladi));
switch (id_month)
{
case 1:
month = "فروردين";
break;
case 2:
month = "ارديبهشت";
break;
case 3:
month = "خرداد";
break;
case 4:
month = "تير";
break;
case 5:
month = "مرداد";
break;
case 6:
month = "شهريور";
break;
case 7:
month = "مهر";
break;
case 8:
month = "آبان";
break;
case 9:
month = "آذر";
break;
case 10:
month = "دي";
break;
case 11:
month = "بهمن";
break;
case 12:
month = "اسفند";
break;
}
return (shamsi1.GetDayOfMonth(miladi) < 10 ? ("0" + shamsi1.GetDayOfMonth(miladi).ToString()) : shamsi1.GetDayOfMonth(miladi).ToString()) + " " + month + shamsi1.GetYear(miladi).ToString() + " " + (shamsi1.GetHour(miladi) < 10 ? ("0" + shamsi1.GetHour(miladi).ToString()) : shamsi1.GetHour(miladi).ToString()) + ":" + (shamsi1.GetMinute(miladi) < 10 ? ("0" + shamsi1.GetMinute(miladi).ToString()) : shamsi1.GetMinute(miladi).ToString()) /* + ":" + (shamsidate.Second<10 ? ("0" +shamsidate.Second.ToString()): shamsidate.Second.ToString())*/ + "@";

}

موفق باشید .

mahdi_farhani
پنج شنبه 02 مهر 1388, 01:29 صبح
راستی نمیدونم که سر اختلاف ساعتی که ما با ساعت سرور داریم برای این روش مشکلی پیش میاد یا نه (سر اینکه چند ساعت دیرتر یا زودتر تاریخ تغییر کنه میگم)

بستگی به نحوه فراخوانی تابع داره ، ساعت حتماً باید به UTC تبدیل بشه و Time Zone هم در نظر گرفته بشه
تا نمایش صحیح را انجام بده
همه این تنظیمات در کتابخانه که نوشتم در نظر گرفته شده است . :چشمک: