Advertisement
OrenWatson

dates.c

Dec 12th, 2014
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.60 KB | None | 0 0
  1.  
  2. void secs_to_hms(long ts,long *h,long*mn,long*s){
  3.     if(ts>0){
  4.         *h=ts/3600;
  5.         *mn=ts%3600/60;
  6.         *s=ts%60;
  7.     }else{
  8.         *h=23+ts/3600;
  9.         *mn=59+ts%3600/60;
  10.         *s=59+ts%60;
  11.     }
  12. }
  13.  
  14.  
  15. int monthdays[]={31,28,31,30,31,30,31,31,30,31,30,31,
  16.                  31,29,31,30,31,30,31,31,30,31,30,31};
  17.  
  18. int y_is_leap(long y){
  19.         return (y%4==0&&y%100!=0||y%400==0);
  20. }
  21.  
  22. long y_to_days(long y){
  23.     long d=0;
  24.     if(y>2000){
  25.         y=((y-2000)%400+2000);
  26.         d+=(y-2000)/400*146097;
  27.     }else{
  28.         y=(2000-(2000-y)%400);
  29.         d-=(2000-y)/400*146097;
  30.     }
  31.     while(y>2000){
  32.         y--;
  33.         d+=365+y_is_leap(y);
  34.     }
  35.     while(y<2000){
  36.         d-=365+y_is_leap(y);
  37.         y++;
  38.     }
  39.     return d;
  40. }
  41.  
  42. long days_to_dofw(long d){
  43.     if(d>=0){
  44.         return (d+4)%7+1;
  45.     }else{// day zero was a friday (5).
  46.         return 7-(2-d)%7;
  47.     }
  48. }
  49.  
  50. long ymd_to_days(long y,long m,long d){
  51.     while(m>12){y++;m-=12;}
  52.     while(m<1){y--;m+=12;}
  53.     while(m>1){
  54.         int leap = y_is_leap(y);
  55.         int md = monthdays[m-2+12*leap];
  56.         d+=md;
  57.         m--;
  58.     }
  59.     d += y_to_days(y);
  60.     //400y = 365*400 + 100 - 4 + 1 =146097
  61.     return d;
  62. }
  63.  
  64. void days_to_ymd(long d,long *yp,long *mp,long *dp){
  65.     long y=2000;
  66.     long m=1;
  67.     long yd=366;
  68.     if(d>146097){
  69.         y+=d/146097*400;
  70.         d=d%146097;
  71.     }
  72.     if(d<-146097){
  73.         y-=(-d)/146097*400;
  74.         d= -((-d)%146097);
  75.     }
  76.     while(d>yd){
  77.         d-=yd;
  78.         y++;
  79.         int leap = (y%4==0&&y%100!=0||y%400==0);
  80.         yd=365+leap;
  81.     }
  82.     while(d<1){
  83.         y--;
  84.         int leap = (y%4==0&&y%100!=0||y%400==0);
  85.         yd=365+leap;
  86.         d+=yd;
  87.     }
  88.     long md = 31;
  89.     while(d>md){
  90.         d-=md;
  91.         m++;
  92.  
  93.         int leap = (y%4==0&&!y%100==0||y%400==0);
  94.         md = monthdays[m-1+12*leap];
  95.     }
  96.     *dp=d;
  97.     *mp=m;
  98.     *yp=y;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement