Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const Y_YEAR: u64 = 1;
- const Y_QUAD: u64 = 4;
- const Y_CENT: u64 = 100;
- const Y_ERA: u64 = 400;
- const D_YEAR: u64 = 365;
- const D_QUAD: u64 = 4 * D_YEAR + 1; // +1 = one leap year
- const D_CENT: u64 = 25 * D_QUAD - 1; // -1 = multiples of 100 years are not leap years
- const D_ERA: u64 = 4 * D_CENT + 1; // +1 = multiples of 400 years are leap years
- const D_EPOCH: u64 = 4 * D_ERA + 3 * D_CENT + 17 * D_QUAD + 2 * D_YEAR - 31 - 28;
- fn normalize_date(y: u64, m: u64, d: u64) -> (u64, u64, u64) {
- if m < 3 {
- (y - 1, m + 9, d - 1)
- } else {
- (y, m - 3, d - 1)
- }
- }
- fn denormalize_date(y: u64, m: u64, d: u64) -> (u64, u64, u64) {
- if m > 9 {
- (y + 1, m - 9, d + 1)
- } else {
- (y, m + 3, d + 1)
- }
- }
- pub fn date_to_unix(y: u64, m: u64, d: u64) -> Option<u64> {
- let (y, m, d) = normalize_date(y, m, d);
- let era = y / Y_ERA; // y.div_euclid(Y_ERA);
- let yoe = y % Y_ERA; // y.rem_euclid(Y_ERA);
- let cent = yoe / Y_CENT; // yoe.div_euclid(Y_CENT);
- let yoc = yoe % Y_CENT; // yoe.rem_euclid(Y_CENT);
- let quad = yoc / Y_QUAD; // yoc.div_euclid(Y_QUAD);
- let yoq = yoc % Y_QUAD; // yoc.rem_euclid(Y_QUAD);
- const MONTHS: [u64; 12] = [0, 31, 61, 92, 122, 153, 184, 214, 245, 275, 306, 337];
- let doy = MONTHS.get(m as usize)? + d;
- Some(era * D_ERA + cent * D_CENT + quad * D_QUAD + yoq * D_YEAR + doy - D_EPOCH)
- }
- fn main() {
- println!("{:?}", date_to_unix(1970,1, 1));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement