DayCount 計(jì)算任意兩個(gè)日期之間相隔的天數(shù)

傳送門:ClassicalCode/dayCount.cpp

話不多說(shuō),先看代碼

//計(jì)算任意兩個(gè)日期之間相差的天數(shù)
#include <iostream>
#include <vector>
#include <ctime>
#include <wchar.h>
#include <string>
#include <stdio.h>
#include <memory.h>
using namespace std;

double dayCount(string date1, string date2){
    tm tm1, tm2;
    memset(&tm1, 0, sizeof(tm1));
    memset(&tm2, 0, sizeof(tm2));
    strptime(date1.data(),"%Y-%m-%d",&tm1);
    strptime(date2.data(),"%Y-%m-%d",&tm2);
   
    return difftime(mktime(&tm2), mktime(&tm1)) / 86400;
}

int main(){
    string date1 = "2017-02-28";
    string date2 = "2017-03-01";

    cout << dayCount(date1, date2) << endl;

    return 0;
}

在標(biāo)準(zhǔn)C/C++中,我們可通過(guò)tm結(jié)構(gòu)來(lái)獲得日期和時(shí)間,tm結(jié)構(gòu)在time.h中的定義如下:

#ifndef _TM_DEFINED
struct tm {
int tm_sec; /* 秒 – 取值區(qū)間為[0,59] */
int tm_min; /* 分 - 取值區(qū)間為[0,59] */
int tm_hour; /* 時(shí) - 取值區(qū)間為[0,23] */
int tm_mday; /* 一個(gè)月中的日期 - 取值區(qū)間為[1,31] */
int tm_mon; /* 月份(從一月開(kāi)始,0代表一月) - 取值區(qū)間為[0,11] */
int tm_year; /* 年份,其值等于實(shí)際年份減去1900 */
int tm_wday; /* 星期 – 取值區(qū)間為[0,6],其中0代表星期天,1代表星期一,以此類推 */
int tm_yday; /* 從每年的1月1日開(kāi)始的天數(shù) – 取值區(qū)間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */
int tm_isdst; /* 夏令時(shí)標(biāo)識(shí)符,實(shí)行夏令時(shí)的時(shí)候,tm_isdst為正。不實(shí)行夏令時(shí)的進(jìn)候,tm_isdst為0;不了解情況時(shí),tm_isdst()為負(fù)。*/
};
#define _TM_DEFINED
#endif

strftime和strptime

這兩個(gè)函數(shù)都是時(shí)間日期的格式控制函數(shù),在功能上看起來(lái)正好相反。strftime將一個(gè)tm結(jié)構(gòu)格式化為一個(gè)字符串,strptime則是將一個(gè)字符串格式化為一個(gè)tm結(jié)構(gòu)。

函數(shù)原型:size_t strftime(char *s,size_t maxsize,char *format,const struct tm *timeptr)

strftime函數(shù)對(duì)timeptr指向的tm結(jié)構(gòu)所代表的時(shí)間和日期進(jìn)行格式編排,其結(jié)果放在字符串s中。該字符串的長(zhǎng)度被設(shè)置為(最少)maxsize個(gè)字符。格式字符串format用來(lái)對(duì)寫(xiě)入字符串的字符進(jìn)行控制,它包含著將被傳送到字符串里去的普通字符以及編排時(shí)間和日期格式的轉(zhuǎn)換控制符。

轉(zhuǎn)換控制符 說(shuō)明
%a 星期幾的簡(jiǎn)寫(xiě)形式
%A 星期幾的全稱
%b 月份的簡(jiǎn)寫(xiě)形式
%B 月份的全稱
%c 日期和時(shí)間
%d 月份中的日期,0-31
%H 小時(shí),00-23
%I 12進(jìn)制小時(shí)鐘點(diǎn),01-12
%j 年份中的日期,001-366
%m 年份中的月份,01-12
%M 分,00-59
%p 上午或下午
%S 秒,00-60
%u 星期幾,1-7
%w 星期幾,0-6
%x 當(dāng)?shù)馗袷降娜掌?br> %X 當(dāng)?shù)馗袷降臅r(shí)間
%y 年份中的最后兩位數(shù),00-99
%Y 年
%Z 地理時(shí)區(qū)名稱

函數(shù)原型: char *strptime(const char *buf,const char *format,struct tm *timeptr)

format字符串的構(gòu)建方式和strftime的format字符串完全一樣。strptime返回一個(gè)指針,指向轉(zhuǎn)換過(guò)程處理的最后一個(gè)字符后面的那個(gè)字符。

string::data

返回一個(gè)指向數(shù)組的指針,該數(shù)組包含當(dāng)前字符串對(duì)象并以空字符符結(jié)尾的字符序列,其實(shí)就是C字符串

mktime

time_t mktime(struct tm * timeptr);
mktime()用來(lái)將參數(shù)timeptr所指的tm結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)換成從公元1970年1月1日0時(shí)0分0 秒算起至今的時(shí)間所經(jīng)過(guò)的秒數(shù)。

difftime()

頭文件:#include <time.h>
定義函數(shù): double difftime(time_t time2, time_t time1);
返回兩個(gè)time_t型變量之間的時(shí)間間隔,即計(jì)算兩個(gè)時(shí)刻之間的時(shí)間差,返回值是秒數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容