Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.42 KB | None | 0 0
  1. const Y_YEAR: u64 = 1;
  2. const Y_QUAD: u64 = 4;
  3. const Y_CENT: u64 = 100;
  4. const Y_ERA: u64 = 400;
  5.  
  6. const D_YEAR: u64 = 365;
  7. const D_QUAD: u64 = 4 * D_YEAR + 1; // +1 = one leap year
  8. const D_CENT: u64 = 25 * D_QUAD - 1; // -1 = multiples of 100 years are not leap years
  9. const D_ERA: u64 = 4 * D_CENT + 1; // +1 = multiples of 400 years are leap years
  10.  
  11. const D_EPOCH: u64 = 4 * D_ERA + 3 * D_CENT + 17 * D_QUAD + 2 * D_YEAR - 31 - 28;
  12.  
  13. fn normalize_date(y: u64, m: u64, d: u64) -> (u64, u64, u64) {
  14. if m < 3 {
  15. (y - 1, m + 9, d - 1)
  16. } else {
  17. (y, m - 3, d - 1)
  18. }
  19. }
  20.  
  21. fn denormalize_date(y: u64, m: u64, d: u64) -> (u64, u64, u64) {
  22. if m > 9 {
  23. (y + 1, m - 9, d + 1)
  24. } else {
  25. (y, m + 3, d + 1)
  26. }
  27. }
  28.  
  29. pub fn date_to_unix(y: u64, m: u64, d: u64) -> Option<u64> {
  30. let (y, m, d) = normalize_date(y, m, d);
  31.  
  32. let era = y / Y_ERA; // y.div_euclid(Y_ERA);
  33. let yoe = y % Y_ERA; // y.rem_euclid(Y_ERA);
  34. let cent = yoe / Y_CENT; // yoe.div_euclid(Y_CENT);
  35. let yoc = yoe % Y_CENT; // yoe.rem_euclid(Y_CENT);
  36. let quad = yoc / Y_QUAD; // yoc.div_euclid(Y_QUAD);
  37. let yoq = yoc % Y_QUAD; // yoc.rem_euclid(Y_QUAD);
  38.  
  39. const MONTHS: [u64; 12] = [0, 31, 61, 92, 122, 153, 184, 214, 245, 275, 306, 337];
  40. let doy = MONTHS.get(m as usize)? + d;
  41.  
  42. Some(era * D_ERA + cent * D_CENT + quad * D_QUAD + yoq * D_YEAR + doy - D_EPOCH)
  43. }
  44.  
  45. fn main() {
  46. println!("{:?}", date_to_unix(1970,1, 1));
  47.  
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement