= 0 ? $y : $y - 399, 400 ); $yoe = $y - $era * 400; $doy = intdiv( 153 * ( $m + ( $m > 2 ? -3 : 9 ) ) + 2, 5 ) + $d - 1; $doe = $yoe * 365 + intdiv( $yoe, 4 ) - intdiv( $yoe, 100 ) + $doy; return $era * 146097 + $doe - 719468; } /** * `Y-m-d` date of a day number (inverse of `to_day()`). * * @param int $day Days since 1970-01-01. * @return string */ public static function from_day( int $day ) { $z = $day + 719468; $era = intdiv( $z >= 0 ? $z : $z - 146096, 146097 ); $doe = $z - $era * 146097; $yoe = intdiv( $doe - intdiv( $doe, 1460 ) + intdiv( $doe, 36524 ) - intdiv( $doe, 146096 ), 365 ); $doy = $doe - ( 365 * $yoe + intdiv( $yoe, 4 ) - intdiv( $yoe, 100 ) ); $mp = intdiv( 5 * $doy + 2, 153 ); $d = $doy - intdiv( 153 * $mp + 2, 5 ) + 1; $m = $mp + ( $mp < 10 ? 3 : -9 ); $y = $yoe + $era * 400 + ( $m <= 2 ? 1 : 0 ); return sprintf( '%04d-%02d-%02d', $y, $m, $d ); } /** * ISO 8601 weekday of a day number: 1 = Monday … 7 = Sunday. * * @param int $day Days since 1970-01-01 (a Thursday). * @return int */ public static function iso_weekday( int $day ) { return ( ( $day % 7 ) + 10 ) % 7 + 1; } }