Các em hãy đọc các bài "Kiểu cấu trúc", "Tham chiếu và Con trỏ" và "Giờ Phối hợp Quốc tế" rồi hãy học bài này nhé.
Các em cần phân biệt rõ: biến tham chiếu (khi khai báo biến có &), biến con trỏ (khi khai báo biến có *), toán tử & (biến đã tồn tại thêm &), và toán tử * (biến đã tồn tại thêm *)
Có bốn kiểu dữ liệu liên quan đến thời gian: clock_t
, time_t
, size_t
và tm
. Các kiểu clock_t, size_t và time_t có khả năng biểu diễn ngày và giờ của hệ thống dưới dạng số nguyên.
Kiểu cấu trúc tm
chứa thông tin ngày và giờ ở dạng cấu trúc, gồm các phần tử sau:
struct tm {
int tm_sec; // giay tu 0 den 61
int tm_min; // phut tu 0 den 59
int tm_hour; // gio tu 0 den 23
int tm_mday; // ngay tu 1 den 31
int tm_mon; // thang tu 0 den 11
int tm_year; // các nam tinh tu nam 1900
int tm_wday; // ngay trong tuan 0 den 6 (chu nhat den thu bay)
int tm_yday; // ngay trong nam tu 0 den 365
int tm_isdst; // cờ "Daylight Saving Time"
}
* tm_sec
thường là từ 0 đến 59
(60 giây). Ở đây lại là từ 0 đến 61
là để đáp ứng cho giây nhuận trong một số hệ thống nhất định.
Một số hàm ngày giờ thường sử dụng
1/ time_t time(0)
: hàm này trả về thời gian hiện tại của hệ thống (thiết bị thực thi mã), là số giây đã trôi qua kể từ 1/1/1970 00:00:00
.
2/ char* ctime(x)
: hàm này trả về một con trỏ, trỏ đến một chuỗi có định dạng thời gian thứ tháng ngày giờ:phút:giây năm
x
: địa chỉ vùng nhớ của một biến kiểutime_t
- Thời gian ở đây là thời gian hiện tại của hệ thống (các thiết bị hiện đại thường biểu diễn thời gian dạng UTC)
3/ tm *localtime(x)
: hàm này trả về một con trỏ, trỏ đến "địa chỉ vùng nhớ biến kiểu cấu trúc tm
" có chứa x
(theo thời gian của hệ thống)
x
: địa chỉ vùng nhớ của một biến kiểutime_t
4/ tm *gmtime(x)
: hàm này trả về một con trỏ, trỏ đến "địa chỉ vùng nhớ của biến kiểu cấu trúc tm
" có chứa x
(theo định dạng UTC)
-
x
: địa chỉ vùng nhớ của một biến kiểutime_t
5/ char* asctime(y)
: hàm này trả về một con trỏ, trỏ đến một chuỗi có định dạng thời gian thứ tháng ngày giờ:phút:giây năm
y
: địa chỉ vùng nhớ của một biến cấu trúc kiểutm
- Thời gian được biểu diễn dạng UTC với múi giờ 0
Ví dụ
#include <iostream>
#include <ctime>
using namespace std;
int main() {
// thoi gian hien tai, la so giay da troi qua ke tu 1/1/1970 00:00:00
time_t soGiay = time(0);
cout << "So giay da troi qua ke tu nam 1970: "<< soGiay << endl;
// 1668077360
//
char *thoiGian = ctime( &soGiay );
cout << "Thoi gian hien tai cua he thong la: " << thoiGian << endl;
// Thu Nov 10 10:49:20 2022 (ket qua tuy thuoc thoi diem thuc thi ma)
//
tm *diaChiVungNho = localtime( &soGiay );
cout << "Dia chi vung nho la: " << diaChiVungNho << endl;
// 0xed1ac0 (ket qua tuy thuoc moi may)
//
tm *diaChiVungNhoUTC = gmtime( &soGiay );
cout << "Dia chi vung nho UTM la: " << diaChiVungNhoUTC << endl;
// 0xed1ac0 (ket qua tuy thuoc moi may)
//
char *thoiGianUTC = asctime( diaChiVungNhoUTC );
cout << "Thoi gian UTC la: "<< thoiGianUTC << endl;
// Thu Nov 10 03:49:20 2022 (ket qua tuy thuoc thoi diem thuc thi ma)
}
Gợi ý: các em hãy nhận xét kết quả của hàm localtime
và gmtime
nhé, tại sao lại giống nhau! kết quả của ctime
và asctime
, tại sao lại khác nhau 7 tiếng!
6/ clock_t clock()
: hàm này trả về một giá trị mà xấp xỉ với lượng thời gian của chương trình đang gọi đã thực thi.
Ví dụ
#include <iostream>
#include <ctime>
using namespace std;
int main() {
clock_t batDau = clock();
for (int i = 0; i <= 9999; i++) {
cout << i << endl;
}
clock_t ketThuc = clock();
int thoiGianThucThiChuongTrinh = ketThuc - batDau;
cout << "Thoi gian da thuc thi: "<< thoiGianThucThiChuongTrinh << " mili giay" << endl;
}
7/ time_t mktime(struct tm *time)
Trả về giá trị thời gian hệ thống kiểu time_t
được mô tả bởi một cấu trúc tm
.
Ví dụ
#include <iostream>
#include <sstream>
#include <ctime>
using namespace std;
int main()
{
tm tm{};
tm.tm_year = 2022-1900; // nam 2022
tm.tm_mon = 12-1; // thang 12
tm.tm_mday = 15; // ngay 15
tm.tm_hour = 10; // luc 10 gio
tm.tm_min = 15; // 15 phut
tm.tm_sec = 8; // 8 giay
tm.tm_isdst = 0; // Not daylight saving
time_t thoiGian = mktime(&tm);
cout << "So giay da troi qua ke tu nam 1970 den 15/12/2022 10:15:08 la: " << thoiGian;
}
8/ int difftime(time_t time2, time_t time1)
Hàm này tính toán chênh lệch tính bằng giây giữa time1
và time2
.
#include <iostream>
#include <ctime>
using namespace std;
int main(void)
{
time_t hienTai = time(0);
cout << "So giay tu nam 1970: " << hienTai << "\n";
tm *diaChiVungNho = localtime(&hienTai);
cout << "Dia chi vung nho cua hienTai: "<< diaChiVungNho << "\n";
// Tao bien dauThang dua vao hienTai
tm dauThang = *localtime(&hienTai);
// Sua ngay, gio, phut, giay de tro thanh dau thang
dauThang.tm_mday = 1;
dauThang.tm_hour = 0;
dauThang.tm_min = 0;
dauThang.tm_sec = 0;
// So giay tu dau thang den hien tai
int giay = difftime(hienTai, mktime(&dauThang));
cout << "So giay tu dau thang den hien tai: " << giay;
return 0;
}
Kết quả (khác nhau tùy thuộc mính tính và thời điểm chạy)
So giay tu nam 1970: 1671290655 Dia chi vung nho cua hienTai: 0x14647e3411c0 So giay tu dau thang den hien tai: 1437855