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_ttm. 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ểu time_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ểu time_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ểu time_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ểu tm 
  • 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 localtimegmtime nhé, tại sao lại giống nhau! kết quả của ctimeasctime, 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;
}
t-clock.png (18 KB)
Kết quả thực thi

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 time1time2.

#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