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 中国大陆许可协议进行许可。
  • 相关阅读:
    F#新Bug,小心! module 里的泛型变量。
    F#: mutable 关键字不适宜用于结构中声明可变值
    简说F#的数组
    元组——秃瓢(Tuple)
    如何用Xmind编写测试用例
    如何提高评审的效率
    接口测试实例/20200622
    mysql数据库的基本增删改查操作总结
    面试技巧篇02:面试前必看!
    面试技巧篇01
  • 原文地址:https://www.cnblogs.com/MrLJC/p/3364344.html
Copyright © 2011-2022 走看看