public NsDateTime(int year, int month, int day, int hour, int minute, int second, double millisecond) { if (year < 1 || year > 9999) { throw new ArgumentOutOfRangeException(nameof(year), year, "Enter a year between (1-9999)."); } var daysOfMonth = NanakshahiDateTime.DaysInMonth(year, month); var nanakshahiMonth = NsHelper.MonthToNsMonth(month - 1); if (day < 1 || day > daysOfMonth) { throw new ArgumentOutOfRangeException(nameof(day), day, $"Enter a valid day. The month {nanakshahiMonth.TransliterationName} in year {year} has (1-{daysOfMonth}) days."); } if (hour < 0 || hour > 23) { throw new ArgumentOutOfRangeException(nameof(hour), hour, "Enter an hour between (0-23)."); } if (minute < 0 || minute > 59) { throw new ArgumentOutOfRangeException(nameof(minute), minute, "Enter a minute between (0-59)."); } if (second < 0 || second > 59) { throw new ArgumentOutOfRangeException(nameof(second), second, "Enter a second between (0-59)."); } if (millisecond < 0 || millisecond > 999) { throw new ArgumentOutOfRangeException(nameof(millisecond), millisecond, "Enter a second between (0-999)."); } Year = year; Month = month; Day = day; Hour = hour; Minute = minute; Second = second; Millisecond = millisecond; }
public static NanakshahiDateTime ToNanakshahiDateTime(this DateTime gregorianDate) { if (gregorianDate.Year < 1469 && gregorianDate.Month < 3 && gregorianDate.Day < 14) { throw new ArgumentOutOfRangeException(nameof(gregorianDate), gregorianDate, "Enter a date of 1469/3/14 or larger."); } var holaMohalla = new DateTime(gregorianDate.Year, 3, 14); var nsYear = gregorianDate >= holaMohalla ? gregorianDate.Year - 1468 : gregorianDate.Year - 1469; var nsMonth = NsHelper.MonthToNsMonth((gregorianDate.Month + 8) % 12); var nsNextMonth = NsHelper.MonthToNsMonth(nsMonth.MonthNumber % 12); int nsDay; if (gregorianDate.Day >= nsNextMonth.Offset) { nsMonth = nsNextMonth; nsDay = gregorianDate.Day - nsNextMonth.Offset + 1; } else { var firstOfNsMonth = new DateTime( gregorianDate.Year, gregorianDate.Month - 1, nsMonth.Offset ); nsDay = (int)(gregorianDate.ToUniversalTime() - firstOfNsMonth.ToUniversalTime()).TotalDays + 1; } return(new NanakshahiDateTime(nsYear, nsMonth.MonthNumber, nsDay, gregorianDate.Hour, gregorianDate.Minute, gregorianDate.Second, gregorianDate.Millisecond)); }