2015-08-04 12 views
6

Im Versuch GregorianCalendar in persischer Kalender zu konvertierenC# Kalander Umwandlung gibt System.ArgumentOutOfRangeException

das ist meine Methode:

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

Problem ist, arbeitet es nicht für alle Tage, wie folgt aus:

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

und es gibt diesen Fehler:

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

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

aber für andere Tage es funktioniert, wie diese:

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

Es kann "funktionieren", aber liefert es * korrekte * Ergebnisse, wenn es keinen Fehler erzeugt? –

+2

Darüber hinaus ist der Rückgabetyp dieser Methode eine 'DateTime'. Diejenigen, die nicht wissen oder sich daran erinnern, wie sie erstellt wurden, und keine Kalender, die an diesem Prozess beteiligt sind, können also auch den gesamten Methodenkörper durch "return Convert.ToDateTime (_Edate);" ersetzen. –

+0

@Damien_The_Unbeliever Vielen Dank! Das war's. der endgültige Rückgabekalender war unbekannt. –

Antwort

1

Das Argument Exception ausgelöst wird, weil Sie versuchen, ein Datum zu erstellen, die nicht gültig im gregorianischen Kalender.

Wenn Sie die Werte überprüfen, die Sie aus dem gregorianischen Datum "2015-07-22 00:00:00.000" für einen persischen Kalender

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

Sie erhalten 1394 4 31, und dies gilt für einen Persian Kalender wie in den Ausführungen zu MSDN bekommen es erklärt:

Jedes der ersten sechs Monate im persischen Kalender hat 31 Tage, jeder der nächsten fünf Monate hat 30 Tage, und der letzte Monat hat 29 Tage in einem gemeinsamen Jahr und 30 Tage in einem Sprung Jahr.

Offensichtlich, wenn Sie speisen diese in einen gregorianischen Kalender werden Sie in Schwierigkeiten haben zu laufen, weil April nicht 31 Tage hat:

Der Gregorianische Kalender hat 12 Monate und mit 28 bis 31 Tage jeweils: Januar (31 Tage), Februar (28 oder 29 Tage), März (31 Tage), April (30 Tage), Mai (31 Tage), Juni (30 Tage), Juli (31 Tage), August (31 Tage)), September (30 Tage), Oktober (31 Tage), November (30 Tage) und Dezember (31 Tage).

Das gregorianische Datum "2015-06-29 00:00:00.000" keine Ausnahme werfen, da die Ergebnisse für das Jahr, Monat und Tag 1394 4 8 für die persischen Kalender sind die auch für den gregorianischen Kalender akzeptabel sind.

Datetime wird als gregorianischer Kalender sein und zu einem bestimmten Jahr, Monat oder Tag in einem Kalender zu konvertieren, rufen Sie entweder GetYear, GetMonth oder GetDayOfMonth des Kalenders Sie interessiert sind, zum Beispiel als here

gezeigt