時間日期是經常遇到的數據類型,Qt中的時間日期類如下:
- QTime:時間類型,只表示時間,如15:23:13;
- QDate:日期類型,只表示日期,如2017-4-5;
- QDateTime:日期時間類型,表示日期和時間,如2017-03-23 08:12:43;
Qt中有專門用於日期、時間編輯和顯示的界面組件:
- QTimeEdit:編輯和顯示時間的組件;
- QDateEdit:編輯和顯示日期的組件;
- QDateTimeEdit:編輯和顯示日期時間的組件;
- QCalendarWidget:一個用日歷形式選擇日期的組件。
實例程序samp4_5演示了這些時間日期相關類的使用,其運行界面如下圖所示:
QDateTime與QString之間的轉換
時間、日期編輯器屬性設置
在上圖左上角“日期時間”Groupbox中,使用QTimeEdit、QDateEdit、QDateTimeEdit組件作為時間、日期、日期時間編輯器;在其右側,各放置一個QLineEdit組件用於字符串顯示。
QDateEdit與QTimeEdit都從QDateTimeEdit繼承而來,實現針對日期和時間的特定顯示功能。實際上,QDateEdit和QTimeEdit的顯示功能都可以通過QDateTimeEdit實現,只需要設置好屬性就可以了。
QDateTimeEdit類的主要屬性如下:
- datetime:日期時間;
- date:日期;設置datetime時會自動改變date;同時,設置date時,也會自動改變datetime中的日期;
- time:時間;和date類似,設置datetime和time時會互相改變對方的值;
- maximumDateTime、minimumDateTime:最大、最小時間日期;
- maximumTime、minimumTime:最大、最小時間;
- currentSection:當前輸入光標所在的時間日期數據段,是枚舉類型QDateTimeEdit::Section。QDateTimeEdit顯示日期時間數據時分為多個段,單擊編輯框右側的
按鈕可以修改當前段的值。如輸入光標在Year Section段,就修改“年”的值;
- currentSectionIndex:用序號表示輸入光標所在的段;
- calendarPopup:是否允許彈出一個日歷框;取值為true時,右側的輸入按鈕變為下拉按鈕
,單擊按鈕時出現一個日歷框,用於在日歷上選擇日期。對於QTimeEdit,此屬性無效;
- displayFormat:格式化顯示;如果設置為“yyyy-MM-dd HH:mm:ss”,一個日期時間數據就顯示為“2016-11-02 08:23:46”
QDateTime的獲取與QString的轉換
“讀取當前日期時間”按鈕的clicked()信號的槽函數中,寫如下代碼:
void Widget::on_btnGetTime_clicked() { //獲取當前日期時間,為三個專用編輯器設置日期時間數據,並轉換為字符串 QDateTime curDateTime = QDateTime :: currentDateTime(); ui->timeEdit->setTime(curDateTime.time()); ui->editTime->setText(curDateTime.toString("hh:mm:ss")); ui->dateEdit->setDate(curDateTime.date()); ui->editDate->setText(curDateTime.toString("yyyy-MM-dd")); ui->dateTimeEdit->setDateTime(curDateTime); ui->editDateTime->setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss")); }
首先用QDateTime類的靜態函數currentDateTime()獲取當前日期時間,並賦值給變量curDateTime。
然后用curDateTime變量設置界面上的3個Date、Time、DateTime,利用QDateTime的time()、date()分別提取time和date。
將curDateTime表示的日期時間轉換為字符串,然后在LineEdit編輯框上顯示。轉換時使用了QDateTime的toString()函數,函數參數指定了顯示Time、Date、DateTime的格式:
QString QDateTime :: toString ( QString format )
它將日期按照format指定的格式轉換為字符串。format是一個字符串,包含一些特定的字符,表示Date或Time的各個部分,下表顯示了常用format:
字符 | 意義 |
d | 天,不補零顯示,1-31 |
dd | 天,補零顯示,01-31 |
M | 月,1-12 |
MM | 月,01-12 |
yy | 年,00-99 |
yyyy | 年,0000-9999 |
h | 小時,0-23或1-12(如果顯示AM/PM) |
hh | 小時,00-23或01-12(如果顯示AM/PM) |
H | 小時,0-23 |
HH | 小時,00-23 |
m | 分鍾,0-59 |
mm | 分鍾,00-59 |
s | 秒,0-59 |
ss | 秒,00-59 |
z | 毫秒,0-999 |
zzz | 毫秒,000-999 |
AP或A | AM/PM |
ap或A | am/pm |
在設置DateTime顯示字符串時,還可以使用填字符,甚至使用漢字。例如:
curDateTime.toString("yyyy年MM月dd日");
這樣得到的字符將是“2021年6月6日”。
QString轉換為DateTime
將QString轉換為QTime、QDate、QDateTime類型,需要使用靜態函數QDateTime::fromString():
QDateTime QDateTime :: fromString( string , format )
第一個參數string是DateTime字符串,第二個參數format是格式,按照之前的格式表定義。
在程序運行時,手工修改“日期時間”后面文本框editDateTime中的DateTime字符串,單擊“設置日期時間”按鈕,可以將文本框中的QString轉換為QDateTime變量,並設置為左側DateTimeEdit組件的DateTime數據:
void Widget::on_btnSetDateTime_clicked() { //QString轉換為QDateTime QString str = ui->editDateTime->text(); str = str.trimmed(); if( !str.isEmpty() ) { QDateTime datetime = QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss"); ui->dateTimeEdit->setDateTime(datetime); } }
程序中,字符串str按照格式yyyy-MM-dd hh:mm:ss轉換為日期時間變量。
QCalendarWidget日歷組件
圖1右側是QCalendarWidget組件,它以日歷的形式顯示日期,可以用於日期選擇。QCalendarWidget有一個信號selectionChanged(),在日歷上選擇的日期變化后會發射此信號,為此信號創建槽函數,編寫代碼如下:
void Dialog :: on_calendarWidget_selectionChanged() { //在日歷上選擇日期 QDate dt = ui->calendarWidget->selectedDate(); QString str = dt.toString("yyyy 年 M 月 d 日"); ui->editCalendar->setText(str); }
總結
1、有三種日期時間類型QTime、QDate、QDateTime,格式與Python中的同名類相同。
2、假設有三個時間日期相關的控件QDateTimeEdit、QTimeEdit、QDateEdit及其對應的對象名為datetimeEdit、timeEdit、dateEdit,為這三個對象set的函數分別是setDateTime( QDateTime )、setTime( QTime )、setDate( QDate ):
QDateTime now = QDateTime::currentDateTime(); ui->timeEdit->setTime( now.time() ); ui->dateEdit->setDate( now.date() ); ui->datetimeEdit->setDateTime( now );
3、QDateTime→QString:
QString QDateTime :: toString ( format )
例如:
time_str = now.toString("hh:mm:ss"); date_str = now.toString("yyyy-MM-dd"); datetime_str = now.toString("yyyy-MM-dd hh:mm:ss");
只需要在format中用指定格式說明要輸出的內容,就可以正確的輸出想要的時間日期字符串了。
4、QString→QDateTime、QTime、QDate:
static QDateTime QDateTime :: fromString ( string , format )
QString str = ui->editxxx->text();//從某個QLineEdit中讀取輸入的QString ...//對str做處理 QDateTime datetime = QDateTime :: fromString( str , "yyyy-MM-dd hh:mm:ss" );//QString→QDateTime //顯示QDateTime ui->datetimeEdit->setDateTime(datetime);
5、日歷控件:QCalendarWidget
有一個選擇日期的信號selectionChanged(),在日歷上選擇日期后,可以得到一個QDate對象:
QDate dt = ui->calendarWidget->selectedDate(); QString str = dt.toString("yyyy年M月d日");//對QDate進行處理