| 2498 | /// Convert days since Unix epoch (1970-01-01) to (year, month, day). |
| 2499 | #[allow(clippy::unreadable_literal)] |
| 2500 | fn days_to_ymd(days: i64) -> (i64, i64, i64) { |
| 2501 | let z = days + 719468; |
| 2502 | let era = if z >= 0 { z } else { z - 146096 } / 146097; |
| 2503 | let doe = z - era * 146097; |
| 2504 | let yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; |
| 2505 | let y = yoe + era * 400; |
| 2506 | let doy = doe - (365 * yoe + yoe / 4 - yoe / 100); |
| 2507 | let mp = (5 * doy + 2) / 153; |
| 2508 | let d = doy - (153 * mp + 2) / 5 + 1; |
| 2509 | let m = if mp < 10 { mp + 3 } else { mp - 9 }; |
| 2510 | let y = if m <= 2 { y + 1 } else { y }; |
| 2511 | (y, m, d) |
| 2512 | } |