zoukankan      html  css  js  c++  java
  • 日期的各种计算

    突然看到一堆的日起计算的相关问题就参考了一些代码用C++写了个程序,主要思想就是日期的偏移全部换成相对同一个日期的再计算,这样简单多了,附上代码,有问题欢迎指正

     1 #include<iostream>
     2 #include<ctime>
     3 #include<cstdio>
     4 #include<cstring>
     5 using namespace std;
     6 //日期函数
     7 int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
     8 struct date{
     9     int year,month,day;
    10     date(int y=0,int m=0,int d=0)
    11     {
    12         year=y;
    13         month=m;
    14         day=d;
    15     }
    16 };
    17 //判闰年
    18 inline int leap(int year){
    19     return (year%4==0&&year%100!=0)||year%400==0;
    20 }
    21 //判合法性
    22 inline int legal(date a){
    23     if (a.month<0||a.month>12)
    24         return 0;
    25     if (a.month==2)
    26         return a.day>0&&a.day<=28+leap(a.year);
    27     return a.day>0&&a.day<=days[a.month-1];
    28 }
    29 //比较日期大小
    30 inline int datecmp(date a,date b){
    31    if (a.year!=b.year)
    32        return a.year-b.year;
    33    if (a.month!=b.month)
    34        return a.month-b.month;
    35    return a.day-b.day;
    36 }
    37 //返回指定日期是星期几
    38 int weekday(date a){
    39     int tm=a.month>=3?(a.month-2):(a.month+10);
    40     int ty=a.month>=3?a.year:(a.year-1);
    41     return (ty+ty/4-ty/100+ty/400+(int)(2.6*tm-0.2)+a.day)%7;
    42 }
    43 //日期转天数偏移
    44 int date2int(date a){
    45     int ret=a.year*365+(a.year-1)/4-(a.year-1)/100+(a.year-1)/400,i;
    46     days[1]+=leap(a.year);
    47     for (i=0;i<a.month-1;ret+=days[i++]);
    48     days[1]=28;
    49     return ret+a.day;
    50 }
    51 //天数偏移转日期
    52 date int2date(int a){
    53     date ret;
    54     ret.year=a/146097*400;
    55     for (a%=146097;a>=365+leap(ret.year);a-=365+leap(ret.year),ret.year++);
    56     days[1]+=leap(ret.year);
    57     for (ret.month=1;a>=days[ret.month-1];a-=days[ret.month-1],ret.month++);
    58     days[1]=28;
    59     ret.day=a+1;
    60     return ret;
    61 }
    62 //日期间隔的天数
    63 inline int dateinterval(date a,date b){
    64     if(datecmp(a,b))
    65     return date2int(a)-date2int(b);
    66     else
    67     return date2int(b)-date2int(a);
    68 }
    69 //向前推若干天
    70 inline date forward(date a,int b)
    71 {
    72     return int2date(date2int(a)-b);
    73 }
    74 //向后推若干天
    75 inline date afterward(date a,int b)
    76 {
    77     return int2date(date2int(a)+b);
    78 }
    79 int main()
    80 {
    81     date date1(2013,10,11);
    82     date date2(2013,1,1);
    83     cout<<dateinterval(date1,date2)<<endl;
    84 }

    如果你觉得内容对你有帮助,请点个赞

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
  • 相关阅读:
    C 语言定义
    一次系统磁盘异常使用100%的处理
    supervisord 安装、配置体验
    uva 211(dfs)
    poj1651
    有一种感动叫ACM(记WJMZBMR在成都赛区开幕式上的讲话)
    nyoj-746
    Codeforces Round #308 (Div. 2)----C. Vanya and Scales
    long long 与 _int64
    石子归并问题(nyoj737)
  • 原文地址:https://www.cnblogs.com/MrLJC/p/3364344.html
Copyright © 2011-2022 走看看