fromDate static method

BadiDate fromDate(
  1. DateTime gregorianDate, {
  2. double? longitude,
  3. double? latitude,
  4. double? altitude,
})

BadiDate from a DateTime object Optional parameter double longitude, latitude, altitude for the sunset time

Implementation

static BadiDate fromDate(DateTime gregorianDate,
    {double? longitude, double? latitude, double? altitude}) {
  // we convert to utc to avoid daylight saving issues
  final dateTime = DateTime.utc(
      gregorianDate.year, gregorianDate.month, gregorianDate.day);
  if (dateTime.isAfter(DateTime.utc(2065, 3, 19))) {
    throw UnsupportedError('Dates after 2064-03-19 are not supported yet.');
  }
  final isAfterSunset = gregorianDate.isAfter(_calculateSunSet(gregorianDate,
      longitude: longitude, latitude: latitude, altitude: altitude));
  final date = isAfterSunset ? dateTime.add(Duration(days: 1)) : dateTime;
  final badiYear = date.year - YEAR_ZERO_IN_GREGORIAN;
  final isBeforeNawRuz =
      date.isBefore(DateTime.utc(date.year, 3, getDayOfNawRuz(badiYear)));
  if (!isBeforeNawRuz) {
    final doy =
        date.difference(DateTime.utc(date.year, 3, getDayOfNawRuz(badiYear)));
    // +1 because naw ruz has a doy of 1 but a difference of 0
    return _fromYearAndDayOfYear(
        year: badiYear,
        doy: doy.inDays + 1,
        longitude: longitude,
        latitude: latitude,
        altitude: altitude);
  }
  final doy = date.difference(
      DateTime.utc(date.year - 1, 3, getDayOfNawRuz(badiYear - 1)));
  return _fromYearAndDayOfYear(
      year: badiYear - 1,
      doy: doy.inDays + 1,
      longitude: longitude,
      latitude: latitude,
      altitude: altitude);
}