LocalDate.fromJulianDay constructor

LocalDate.fromJulianDay(
  1. int value
)

Converts a supported Julian day ordinal to its Gregorian date.

Implementation

factory LocalDate.fromJulianDay(int value) {
  if (value < minJulianDay || value > maxJulianDay) {
    throw RangeError.range(value, minJulianDay, maxJulianDay, 'julianDay');
  }
  // March-based Gregorian cycles (400 years = 146097 days).
  final shifted = value - 1721120, cycle = _floorDiv(shifted, 146097);
  final days = shifted - cycle * 146097;
  final y = (days - days ~/ 1460 + days ~/ 36524 - days ~/ 146096) ~/ 365;
  final dayOfYear = days - (365 * y + y ~/ 4 - y ~/ 100);
  final marchMonth = (5 * dayOfYear + 2) ~/ 153;
  final day = dayOfYear - (153 * marchMonth + 2) ~/ 5 + 1;
  final month = marchMonth + (marchMonth < 10 ? 3 : -9);
  return LocalDate._(
    y + cycle * 400 + (month <= 2 ? 1 : 0),
    month,
    day,
    value,
  );
}