在Qt中,爲了方便日期和時間的表示和相關操作,爲我們提供了兩個類。一個是QDate,表示年月日形式的日期;一個是QTime,表示時分秒形式的時間。今天,就來學習一下這兩個類的使用方法。
QDate類已格里高裏歷爲準表示年月日的日期。該類可以從系統時鐘裏讀取當前日期,並且爲我們提供了大量方便的日期操作,比如日期的加減。
通常我們可以使用特定的年月日數字來構造一個該來的對象,讓給在進行其他計算。其構造函數聲明如下:
QDate()
QDate(int y, int m, int d)
要注意的是,該構造函數可以接受兩位數字的年份。即0-99.
除了使用構造函數進行顯式構造外,我們在程序中還可以使用另外兩種方便的方式。一個是使用靜態成員函數currentDate() ,該函數會使用系統時鐘裏的日期創建一個QDate對象;另一個是使用靜態函數fromString() 函數,該函數會按照所傳入的表示日期的字符串即相應的格式字符串來創建出一個QDate對象。這兩個函數聲明如下:
QDate currentDate()
QDate fromString(const QString &string, const QString &format)
其中,format種可以使用的格式如下:
d | 表示天的數字,範圍爲 1~31,沒有前置的0 |
dd | 表示天的數字,有前置的0,範圍爲01~31 |
ddd | 表示星期的簡寫,即Mon~Sun |
dddd | 表示星期的全寫,即Monday~Sunday |
M | 表示月份的數字,沒有前置的0,範圍爲1~12 |
MM | 表示月份的數字,有前置的0,範圍爲01~12 |
MMM | 表示月份的簡寫,範圍爲Jan~Dec |
MMMM | 表示月份的全寫,範圍爲January~December |
yy | 表示兩位數字的年份,即00~99 |
yyyy | 表示四位數字的年份,如2017 |
另外還要注意,QDate裏的年月日都有相應的默認值。Year默認值爲1900,Month默認值爲1,Day默認值爲1。比如:
QDate::fromString("1.30", "M.d"); // 1900 1.30
QDate::fromString("20000110", "yyyyMMdd"); // 2000 01 10
QDate::fromString("20000110", "yyyyMd"); // 2000 1 10
注意,沒有0年,若未年份傳入0,則被認爲是無效的。
與fromString() 相對的,QDate還提供了一個toString() 方法,可以將QDate對象表示的日期按一定格式轉化爲一個字符串表示。
QString toString(const QString &format) const
其中,format與fromString()類似。比如
QDate date(2017,3,21)
date.toString("yyyy-MM-dd") //2017-03-21
注意,toString() 裏的format中必須有分隔符,即"yyyyMMdd"是不支持的。如果QDate表示的日期是無效的,則返回一個空字符串。
除了這些創建對象的函數,QDate還爲我們提供了很多操作QDate對象的方法,比如判斷日期是否有效的isValid(),判斷某個年份是否是閏年的isLeapYear()等等。在此,就不一一細說了,有需要的同學,可以參考幫助文檔,也都非常的簡單。
類似於QDate表示了年月日的日期,QTime則表示了自凌晨以來的時分秒及毫秒的時間。該類從系統時鐘裏讀取當前時間並測量逝去時間的跨度。QTime使用24小時制來表示時間,並且不關心時區和夏令時。
其通常的構造方式也和QDate類似,可以使用相關構造函數直接傳入時分秒的數字進行直接構造,也可以使用靜態函數currentTime() 和 fromString() 按一定格式進行構造。但是,QTime表示的時間的精度取決於操作系統本身的精度,並不是所有的系統都能提供1ms級別的精度。
我們還是先來看一下常用的創建QTime對象的方法:
QTime::QTime()
QTime::QTime(int h, int m, int s = 0, int ms = 0)
其中默認構造函數,創建出一個空(null)對象。注意,空時間對象和QTime(0,0,0,0)的區別。一個空時間對象的isNull() 返回true,isValid() 返回false。而QTime(0,0,0,0)是一個有效的時間,它表示零點。
若爲構造函數傳入了相關參數,則傳入的參數必須滿足一定要求。即 h必須在0~23之間,m和s必須在0~59之間,ms必須在0~999之間。
QTime currentTime()
QTime fromString(const QString &string, const QString &format)
其中,format中可以使用的格式及含義如下:
h | 沒有前置0的小時數字,即0~23,或者 1~12,如果顯示AM/PM的話 |
hh | 有前置0的小時數字,即00~23,或者01~12,如果顯示AM/PM的話 |
m | 沒有前置0的分鐘數字,0~59 |
mm | 有前置0的分鐘數字,00~59 |
s | 沒有前置0的秒數,0~59 |
ss | 有前置0的秒數,00~59 |
z | 沒有前置0的毫秒,0~999 |
zzz | 有前置0的毫秒,000~999 |
AM/PM | 顯示AM/PM |
am/pm | 顯示am/pm |
QTime time = QTime::fromString("1.30", "m.s");
// time is 00:01:30.000
同樣,QTime也爲我們提供了toString() 方法:
QString toString(const QString &format) const
其中,參數format與上面講的類似。比如:
QTime time(14,13,9,42)
time.toString("hh:mm:ss.zzz") //14:13:09.042
另外,QTime除了和QDate一樣,爲我們提供了大量方便的創建、設置、獲取函數外,還爲我們提供了三個用於簡單計時的方法。即:
int elapsed() const
int restart()
void start()
elapsed() 返回自從上次調用start() 或 restart() 之後的毫秒數。注意,如果自從上次調用start() 之後,超過了24小時,那麼該數字會迴歸到0,從新計數。
start() 會將該對象設置爲當前時間,然後開始計時。restart() 將該對象設置爲當前時間,然後返回自從上次調用start() 或 restart() 後所經歷的毫秒數。該方法可以原子性的完成這兩件事,所以非常適合重複計數。即先調用一下start() 開啓計時,之後每次計時就調用一下restart() 即可。但和elapsed() 類似,在上次調用start() 或 restart() 24小時後,該計時會迴歸到0。
除此之外,QTime的其他方法和QDate都是類似的,比如對時間的加減,計算兩個時間的差,判斷時間對象是否有效的isNull()、isValid()等等。
最後,其實在Qt中除了QDate和QTime之外,還爲我們提供了QDateTime類。顧名思義,該類是QDate和QTime功能的結合,可以使用一個對象同時表示日期和時間。其使用方式也和上面講的兩個類大同小異,在此就不展開講解了,有需要的同學,可以自行學習Qt幫助文檔即可。