針對VC++ 上各種方法獲取時間差,CSpanTime等
CTime time = CTime::GetCurrentTime();
int year = time.GetYear(); //返回年
int mouth = time.GetMouth(); //返回月份
int date = time.GetDays(); // 返回日數
int hour = time.GetHours(); // 返回小時數(-23至23之間)
int min = time.GetMinutes(); // 返回分鐘數(-59至59之間)
int sec = time.GetSeconds(); // 返回秒數(-59至59之間)
以下是轉載的:CTime以及其它時間差
一、DateTimePicker控制元件
引用一個DateTimePicker控制元件,關聯變數m_date為DateTimeCtrl型別,然後在響應事件中加入如下程式碼:
CTime tm;
m_date.GetTime(tm);
CString strDate=tm.Format("%Y-%m-%d");
就可以獲取了...但是不知為何這個還和Vc的版本問題有關,開始時候我用的版本總是出錯,或者srtDate為空,或者不是使用者選擇的日期,後來換了一個VC版本就能得到正確的資料了...
另外如果關聯一個CTime型別的變數也能解決上面的問題,但是初始化的日期是1970-01-01而上面方法中初始化的日期是當前日期...所以根據使用者需要的設定可以選擇任何一種方法進行解決...
二、CTimeSpan獲取時間差
要獲取兩個時間差,如兩個CTime的時間差,可以使用MFC中的CTimeSpan類。
CTime time1 = CTime::GetCurrentTime(); ...其它程式碼... CTime time2 = CTime::GetCurrentTime(); // 兩個CTime相減得到CTimeSpan CTimeSpan timeSpan = time2 - time1; // 得到總的秒數 int nTSeconds = timeSpan.GetTotalSeconds();
注意GetTotalSeconds與GetSeconds的區別:GetTotalSeconds返回總的秒數,GetSeconds返回總是小於60,如:如果時間經過了100秒, GetTotalSeconds返回100,而GetSeconds返回40,因為有60秒轉為一分鐘了,同時使用GetMinutes會返回1,即1分40秒。
其它類似函式:
GetDays(); // 返回日數 GetHours(); // 返回小時數(-23至23之間) GetTotalHours(); // 返回總的小時數 GetMinutes(); // 返回分鐘數(-59至59之間) GetTotalMinutes(); // 返回總的分鐘數 GetSeconds(); // 返回秒數(-59至59之間) GetTotalSeconds(); // 返回總的秒數 三、CTime總結
1.初始化 m_begintime=CTime(2004,1,1,0,0,0,-1);//引數依次為year,month,day,hour,minite,second m_endtime =CTime::GetCurrentTime();//當前時間 2.日期比較 CTimeSpan span; span=time1-time2; 得到兩時間的間隔. 可以取得span.GetHours().等 3.access資料庫查詢 使用DateDiff()函式,具體參照access幫助 CString timesql; timesql.Format(" Where DateDiff('d',%s,'%s')<=0","日期",m_begintime.Format("%Y-%m-%d")); 4讀取日期欄位(odbc) CDBVariant var; recset.GetFieldValue(i,var); s.Format("%d-%d-%d",(var.m_pdate)->year,(var.m_pdate)->month, (var.m_pdate)->day); 5.CTime轉換為CString 例: m_begintime.Format("%Y-%m-%d");//2004-10-03 6.CString轉換為CTime //s="2004-10-5" int first=s.Find('-'); int second=s.Find('-',first+1); int year=atoi(s.Left(4)); int month=atoi(s.Mid(first+1,second-first+1)); int day=atoi(s.Mid(second+1,s.GetLength()-second-1)); CTime temp(year,month,day,0,0,0); 7.判斷CString是否表示的正確日期格式 //判斷是否為2004-01-13 ch 可代表其他分隔符 bool IsDate(CString str,char ch) { if(str.IsEmpty()) return false; //日期分段 int first=str.Find(ch); int second=str.Find(ch,first+1); int year=atoi(str.Left(4)); int month=atoi(str.Mid(first+1,second-first+1)); int day=atoi(str.Mid(second+1,str.GetLength()-second-1)); //判斷 if (year < 2000 || year >= 2010) { return false; } else if (month< 1 || month >12) { return false; } else if (day< 1 || day > 31) { return false; } else if (month == 4 || month == 6 || month == 9 || month == 11) { if(day > 30) { return false; } else { return true; } } else if (month == '2') { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { if (day>29) { return false; } else { return true; } } else if (day>28) { return false; } return true; } else { return true; } } 四、 在MFC中操作時間的類主要有兩對:CTime和CTimeSpan與COleDateTime和COleDateTimeSpan,CTime和CTimeSpan主要封裝了ANSI time_t和關於time_t的Run-Time庫的主要函式,CTime裡面使用的成員變數是time_t型別,該型別是個long型,由於long型別的原因,所以該類只能處理4294967296秒約68年的資料,所以用CTime只能處理1970年到2038年的日期。 幸好,MFC同時提供了COleDateTime和COleDateTimeSpan類,使用該兩個類完全可以代替CTime和CTimeSpan,COleDateTime和COleDateTimeSpan類所使用的成員變數是DATE型別,該型別是個double型別,而且使用的單位是日,所以可以處理從100年1月1日到9999年12月31日的日期時間,COleDateTime類的日期計算主要是操作公有成員變數COleDateTime::m_dt,該變數是DATE即double型別,該變數是為零時是1899年12月30日0時0分0秒,大於零時的日期比1899年12月30日0時0分0秒大,反之亦然,例如: COleDateTime t; t.m_dt=0; AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S")); 執行的結果是:1899-12-30 00:00:00 COleDateTime t; t.m_dt=39444.437731; AfxMessageBox(t.Format("%Y-%m-%d %H:%M:%S")); 執行的結果是:2007-10-28 10:30:20 反過來以可以得到變數的值,例如: COleDateTime t(2004,12,28,22,22,22); CString str; str.Format("%f",t.m_dt); AfxMessageBox(str); 執行的結果是:38349.932199 COleDateTimeSpan類是用於對COleDateTime類的兩個時間的時間間隔的計算,COleDateTimeSpan類使用的成員變數COleDateTimeSpan::m_span是一個double型別是用於記錄兩個COleDateTime::m_dt的時間差,例如: COleDateTime t1(2006,1,1,0,0,0); COleDateTime t2(2007,1,1,0,0,0); COleDateTimeSpan ts=t2-t1; CString str; str.Format("%f",ts.m_span); AfxMessageBox(str); 執行的結果是:365.000000 反過來也可以得到日期 COleDateTime t1(2006,1,1,0,0,0); COleDateTimeSpan ts; ts.m_span=400.0; COleDateTime t2=t1+ts; AfxMessageBox(t2.Format("%c")); 執行的結果是:02/05/07 00:00:00 可是在使用COleDateTimeSpan類中以下的幾個函式可要小心,這不知道是不是MFC的一個Bug, double GetTotalDays( ) const; double GetTotalHours( ) const; double GetTotalMinutes( ) const; double GetTotalSeconds( ) const; 幾個函式的返回值都是double型別 但是,如double GetTotalSeconds( ) const;在MFC內部的原形是: _AFXDISP_INLINE double COleDateTimeSpan::GetTotalSeconds() const { ASSERT(GetStatus() == valid); long lReturns = (long)(m_span * 24 * 60 * 60 + AFX_OLE_DATETIME_HALFSECOND); return lReturns; } 看到沒有,它返回的實際是個long型別,並不是一個double型別,所以在使用這幾個函式的時候計算兩個時間的間隔不要太大,特別是GetTotalSeconds( )函式,如計算兩個時間的間隔大於68年時就會溢位,所以我建議直接讀取COleDateTimeSpan::m_span變數的值,這是一個單位為日的時間間隔,例如: COleDateTime t1(2000,1,1,0,0,0); COleDateTime t2(2070,1,1,0,0,0); COleDateTimeSpan ts=t2-t1; CString str; str.Format("%f",ts.GetTotalSeconds()); AfxMessageBox(str); 執行的結果是:-2085892096.000000 這個結果明顯是一個溢位,如果使用 str.Format("%f",ts.m_span*86400); 則會得到2209075200.000000。 所以靈活使用COleDateTime類的m_dt變數和COleDateTimeSpan類的m_span變數操作會得到意想不到的收穫
相關推薦
針對VC++ 上各種方法獲取時間差,CSpanTime等
CTime time = CTime::GetCurrentTime(); int year = time.GetYear(); //返回年 int mouth = time.GetMouth(); //返回月份 int date = time.GetDays();
20190103-列印各種型別的三角形,四邊形等
1. 列印四邊形 * * * * * * * ** * * * * * * ** * * * * * * ** * * * * * * ** * * * * * * *如圖:四邊形由寬和高構成,將寬轉換為每行列印的的個數,將高轉換為列印的行數 def quadrangle_generate(widt
AFNetworking 檔案上傳Data,File圖片,檔案等上傳
這段時間需要整理一些東西, 先備註在這裡, 將花時間把這個點整理一下。 使用AFNetworking上傳圖片,(可一次上傳多張圖片,包含不同型別png, jpeg) 使用AFNetworking上傳視訊 AFHTTPRequestOperationManager *manager = [AFHTT
【poj1185】 炮兵陣地 題解&程式碼(C++)
題目連結: http://poj.org/problem?id=1185 題解: 經典的狀壓dp題目,和poj3254的題意很像,只不過poj3254是poj1185的簡化版,相當於炮兵的攻擊範圍
C++ 遞迴的詳解(一)
這幾天看了一下遞迴 1.遞迴 遞迴:一個物件部分地由它自己組成或定義,稱為遞迴。 遞迴函式:一個函式直接或間接地呼叫自身。 遞迴呼叫:在呼叫一個函式的過程中又出現直接或間接地呼叫該函式本身,稱為函式的
g++編譯時預設支援C++11的配置方法
#pragma GCC diagnostic error "-std=c++11" #include <iostream> #include <vector> //加上首行就可以指定編譯的標準為C++11 void printVector(std::v
聯想的S415電腦,Debian8.8開機後亮度值始終最大,嘗試過各種方法,始終無法解決,最後安裝開源驅動後,成功
firmware 保存 ces fst pack 聯系 輸入 aptitude reboot 安裝ATI顯卡驅動(開源)(方法步驟來自Debian WiKi) A.先升級可用的包 # aptitude upgrade B.安裝下面3個包 # apt-get i
C# 獲取文件下載的各種方法
std finally 設置 出錯 word div 獲取文件 mar soft public class RemoteDownload { public static void DownLoad(string addressUrl,string
C++數組和鏈表的區別
麻煩 移動 元素 適合 數組 其中 並且 分配 連續 Q: 講一下C++數組和鏈表的區別? A:數組在分配內存的時候是一塊連續的空間,並且每個元素的內存是一樣的,因此可以用下標快速訪問;但正因為如此,在其中插入或者刪除的操作就比較麻煩,要移動別的元素的位置,因此需要快速訪問
JS/JQuery獲取當前元素的上一個/下一個兄弟級元素等元素的方法
input logs type ron put 綁定 style wid cti $(function(){ //遍歷獲取的input元素對象數組,綁定click事件 var len = $("input[type=‘file‘]").length;
iOS 各種方法
eof des mas read pdo lds csg skin lex tableViewCell分割線左對齊: - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *
反射Reflect基礎 今天主要在練習調用 Class的各種方法,以及getField() getMethod()方法.
class對象 scl struct rim 類型 地址 是否 .class 變量 反射,動態調用類,方法,對象. 三種方法調用類的對象.Class c1=Person.class/Class c2=(Person)p.getclass/Class c3=Class.for
ASP.NET操作DataTable各種方法
[] ret 增加 另一個 turn 根據 好的 asp.net 默認 轉:http://www.cnblogs.com/isking/p/6178268.html http://www.cnblogs.com/sntetwt/p/3496477.html public
JDBC連接超時,針對連接不穩定,有時候能連上(登錄),一會又報連接超時
prot cat XML ddr red tomcat的配置 timeout time 超時時間 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="200
【轉載】java 獲取路徑的各種方法
strong filepath 文件路徑 etc dex 讀取 workspace for class 轉載只供個人學習參考,查看請前往原出處:http://www.cnblogs.com/guoyuqiangf8/p/3506768.html 主要方法有: (1)、req
javascript各種方法集
result ret name image 本地預覽 guid return har onchange js圖片轉Base64格式 <!DOCTYPE html> <html> <head> <meta
C#針對xml文件轉化Dictionary的方法
www. zone strong xml文件 ebo .sh 變量 html 瀏覽器 本文實例講述了C#針對xml文件轉化Dictionary的方法。分享給大家供大家參考。具體實現方法如下: 下面是xml文件: 代碼如下: <?xml version=”1.0″
使用canvas給圖片添加水印, canvas轉換base64,,canvas,圖片,base64等轉換成二進制文檔流的方法,並將合成的圖片上傳到服務器,
web don 可能 work box rac return ros font 一,前端合成帶水印的圖片 一般來說,生成帶水印的圖片由後端生成,但不乏有時候需要前端來處理。當然,前端處理圖片一般不建議,一方面js的處理圖片的方法不全,二是有些老版本的瀏覽器對canvas
C++控件關聯對象
its chang 空間 處理 ext dial 在屏幕上 pan map 1.C++控件關聯對象 方法1:用向導關聯變量 void DrawPoint::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDa
jQuery簡單實現點擊文本框復制內容到剪貼板上的方法
ble sta sca principal ase clas app 回車 pbo //點擊文本框復制其內容到剪貼板上方法 function copyToClipboard(txt) { if (window.clipboardData) { window.cl