The_Law

Untitled

Nov 5th, 2018
389
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.32 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <sys/stat.h>
  3. #include <time.h>
  4. #include <stdio.h>
  5.  
  6. enum
  7. {
  8.     SYS_START_YEAR = 1900,
  9.     START_DAY = 7,
  10.     START_MONTH = 19,
  11.     START_YEAR = 1925,
  12.     SEC_PER_DAY = 86400,
  13.     DAYS_PER_MONTH = 30,
  14.     MONTH_PER_YEAR = 12
  15. };
  16.  
  17. time_t
  18. get_time(int curr_y, int curr_m, int curr_d)
  19. {
  20.     struct tm curr = {.tm_year = curr_y - SYS_START_YEAR, .tm_mon = curr_m - 1, .tm_mday = curr_d,
  21.                     .tm_hour = 0, .tm_min = 0, .tm_sec = 0, .tm_isdst = -1};
  22.     return mktime(&curr);
  23. }
  24.  
  25. void
  26. get_new_time(int *curr_y, int *curr_m, int *curr_d)
  27. {
  28.     struct tm buf = {};
  29.     time_t zero_time = time(NULL);
  30.     localtime_r(&zero_time, &buf); // Greenwich MT offset
  31.     long long ref_time = get_time(START_YEAR, START_MONTH, START_DAY);
  32.     long long curr_time = (long long)get_time(*curr_y, *curr_m, *curr_d);
  33.     long long sec = curr_time - ref_time + buf.tm_gmtoff;
  34.     long long day = sec / SEC_PER_DAY;
  35.     long long mon = day / DAYS_PER_MONTH;
  36.     printf("%lld %lld %lld\n", mon / MONTH_PER_YEAR + 1, mon % MONTH_PER_YEAR + 1, day % DAYS_PER_MONTH + 1);
  37. }
  38.  
  39. int
  40. main(int argc, char *argv[])
  41. {
  42.     int curr_y;
  43.     int curr_m;
  44.     int curr_d;
  45.     while (scanf("%d %d %d", &curr_y, &curr_m, &curr_d) == 3) {
  46.         get_new_time(&curr_y, &curr_m, &curr_d);
  47.     }
  48.     return 0;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment