1. 程式人生 > >針對VC++ 上各種方法獲取時間差,CSpanTime等

針對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的簡化版,相當於炮兵的攻擊範圍

 遞迴的詳解(一)

這幾天看了一下遞迴 1.遞迴 遞迴:一個物件部分地由它自己組成或定義,稱為遞迴。 遞迴函式:一個函式直接或間接地呼叫自身。 遞迴呼叫:在呼叫一個函式的過程中又出現直接或間接地呼叫該函式本身,稱為函式的

g++編譯時預設支援C11的配置方法

#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

控件關聯對象

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