2015-08-04 23 views
6

Im farsça takvimC# kalender dönüşüm System.ArgumentOutOfRangeException

içine GregorianCalendar dönüştürmeye çalışırken bu benim yöntemdir döndürür:

DateTime dt = GetFdate("2015-07-22 00:00:00.000"); 
:

public static DateTime GetFdate(string _Edate) 
{ 
     DateTime fdate = Convert.ToDateTime(_Edate); 
     GregorianCalendar gcalendar = new GregorianCalendar(); 
     PersianCalendar pcalendar = new PersianCalendar(); 
     DateTime fDate = gcalendar.ToDateTime(
      pcalendar.GetYear(fdate), 
      pcalendar.GetMonth(fdate), 
      pcalendar.GetDayOfMonth(fdate), 
      pcalendar.GetHour(fdate), 
      pcalendar.GetMinute(fdate), 
      pcalendar.GetSecond(fdate), 0); 

     return fDate; 
} 

Sorun, onun böyle tüm tarihler için çalışmıyor

ve bu hatayı verir:

An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll 

Additional information: Year, Month, and Day parameters describe an un-representable DateTime. 

ama diğer tarihler için bunun gibi çalışır: Gregoryen takvimde geçerli olmayan bir tarih oluşturmak için denemek çünkü

DateTime dt = GetFdate("2015-06-29 00:00:00.000"); 
+1

"Çalışabilir" olabilir, ancak bir hata üretmediğinde * doğru * dönüyor mu? –

+2

Ayrıca, bu yöntemin dönüş türü bir "DateTime" dır. Bunlar nasıl oluşturulduğunu veya nasıl oluşturulduğunu veya bu sürece dahil olan herhangi bir takvimi hatırlamıyor, bu nedenle tüm yöntem gövdesiniz de sadece “Convert.ToDateTime (_Edate)” dönüşü ile değiştirilebilir. –

+0

@Damien_The_Unbeliever Teşekkürler alot! o oldu. son dönüş takvimi bilinmiyordu. –

cevap

1

argüman özel durumu oluşturuldu. Eğer bir İran takvimine

pcalendar.GetYear(fdate).Dump(); 
pcalendar.GetMonth(fdate).Dump(); 
pcalendar.GetDayOfMonth(fdate).Dump(); 

için Gregoryen tarih "2015-07-22 00:00:00.000" alacağınız değerleri incelediğinizde

1394 4 31 alırsınız ve bu MSDN üzerinde konuşmada gibi Persian takvimi için geçerlidir

İran takvimine göre ilk altı ayda her biri bir sonraki beş ay her 30 gün, 31 gün vardır ve geçen ay bir sıçrama ortak bir yılda 29 gün ve 30 gün: açıklıyor yıl. Açıkçası

Bunun bir Gregoryen takvime besleniyorsa April 31 gün olmadığından, derde gerekecek:

Gregoryen takvimi 28 ile 31 gün ile 12 ay var Her biri: Ocak (31 gün), Şubat (28 veya 29 gün), Mart (31 gün), Nisan (30 gün), Mayıs (31 gün), Haziran (30 gün), Temmuz (31 gün), Ağustos (31 gün)), Eylül (30 gün), Ekim (31 gün), Kasım (30 gün) ve Aralık (31 gün).

yıl, ay ve gün için sonuçlar yanı Gregoryen takvim için kabul edilebilir Pers takvim için 1394 4 8 çünkü bir istisna değildir "2015-06-29 00:00:00.000" miladi tarih.

DateTime bir Gregoryen takvim olması ve bir takvimde belirli yıl, ay veya gün dönüştürmek için kabul edilir, çağrı ya GetYear, GetMonth veya gösterildiği gibi örneğin ilgilendiğiniz takvimin ait GetDayOfMonthhere