15/10/2018, 22:10

time.h trong C

Header file có tên time.h trong Thư viện C chuẩn định nghĩa 4 kiểu biến, hai macro và các hàm đa dạng để thao tác với date và time. Các biến được định nghĩa trong time.h Dưới đây liệt kê một số kiểu biến được định nghĩa trong time.h: ...

Header file có tên time.h trong Thư viện C chuẩn định nghĩa 4 kiểu biến, hai macro và các hàm đa dạng để thao tác với date và time.

Các biến được định nghĩa trong time.h

Dưới đây liệt kê một số kiểu biến được định nghĩa trong time.h:

Biến Mô tả
size_t

Đây là kiểu nguyên không dấu và là kết quả của từ khóa sizeof

clock_t

Đây là một kiểu thích hợp để lưu trữ Processor time (thời gian của bộ vi xử lý).

time_t is

Đây là một kiểu thích hợp để lưu trữ Calendar time.

struct tm

Đây là một cấu trúc được sử dụng để giữ date và time.

Cấu trúc tm có định nghĩa như sau:

struct tm {
   int tm_sec;         /* biểu diễn giây, từ 0 tới 59  */
   int tm_min;         /* biểu diễn phút, từ 0 tới 59  */
   int tm_hour;        /* biểu diễn giờ, từ 0 tới 23   */
   int tm_mday;        /* biểu diễn ngày của tháng, từ 1 tới 31  */
   int tm_mon;         /* biểu diễn tháng, từ 0 tới 11      */
   int tm_year;        /* biểu diễn năm, bắt đầu từ 1900    */
   int tm_wday;        /* ngày trong tuần, từ 0 tới 6       */
   int tm_yday;        /* ngày trong năm, từ 0 tới 365      */
   int tm_isdst;       /* biểu diễn Daylight Saving Time    */
};

Các Macro được định nghĩa trong time.h

Bảng dưới liệt kê một số Macro được định nghĩa trong time.h:

  • NULL: Macro này là giá trị của một hằng con trỏ null
  • CLOCKS_PER_SEC: Macro này biểu diễn tốc độ đồng hồ mỗi giây (Processor Clock per Second).

Các hàm được định nghĩa trong time.h

Sau đây là một số hàm được định nghĩa trong time.h:

STT Hàm & Mô tả
1

Hàm char *asctime(const struct tm *timeptr)

Trả về một con trỏ tới một chuỗi biểu diễn ngày và thời gian của cấu trúc timeptr

2

Hàm clock_t clock(void)

Trả về tốc độ đồng hồ (processor clock) được sử dụng từ lúc bắt đầu một trình triển khai (thường là lúc bắt đầu chương trình)

3

Hàm char *ctime(const time_t *timer)

Trả về một chuỗi biểu diễn localtime dựa trên tham số timer

4

Hàm double difftime(time_t time1, time_t time2)

Trả về số giây khác nhau giữa time1 và time2 (tức là time1 – time2).

5

Hàm struct tm *gmtime(const time_t *timer)

Giá trị của timer được chia thành cấu trúc tm và được biểu diễn trong UTC, hoặc GMT

6

Hàm struct tm *localtime(const time_t *timer)

Giá trị của timer được chia thành cấu trúc tm và được biểu diễn trong Local Timezone

7

Hàm time_t mktime(struct tm *timeptr)

Chuyển đổi cấu trúc được trỏ tới bởi timeptr vào trong một giá trị time_t theo Local Timezone

8

Hàm size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)

Định dạng thời gian được biểu diễn trong cấu trúc timeptr theo các qui tắc định dạng được định nghĩa trong format và được lưu trữ vào trong str

9

Hàm time_t time(time_t *timer)

Ước lượng Calendar time hiện tại và mã hóa nó vào trong định dạng time_t

Hàm asctime() trong C

Hàm char *asctime(const struct tm *timeptr) Trả về một con trỏ tới một chuỗi biểu diễn ngày và thời gian của cấu trúc struct timeptr.

Khai báo hàm asctime() trong C:

Dưới đây là phần khai báo cho asctime() trong C:

char *asctime(const struct tm *timeptr)

Tham số:

Tham số timeptr là một con trỏ tới cấu trúc tm mà chứa một Calendar time được chia nhỏ thành các thành phần như sau:

struct tm {
   int tm_sec;         /* biểu diễn giây, từ 0 tới 59 */
   int tm_min;         /* biểu diễn phút, từ 0 tới 59 */
   int tm_hour;        /* biểu diễn giờ, từ 0 tới 23  */
   int tm_mday;        /* biểu diễn ngày của tháng, từ 1 tới 31 */
   int tm_mon;         /* biểu diễn tháng, từ 0 tới 11   */
   int tm_year;        /* biểu diễn năm, bắt đầu từ 1900 */
   int tm_wday;        /* ngày trong tuần, từ 0 tới 6    */
   int tm_yday;        /* ngày trong năm, từ 0 tới 365   */
   int tm_isdst;       /* biểu diễn Daylight Saving Time */
};

Trả về giá trị:

Hàm này trả về một chuỗi chứa thông tin date và time trong một định dạng con người có thể đọc Www Mmm dd hh:mm:ss: ở đây Www là ngày trong tuần, Mmm là các ký tự chỉ tháng, dd là ngày của tháng, hh:mm:ss là thời gian và yyyy là năm.

Ví dụ:

Chương trình C sau minh họa cách sử dụng của asctime() trong C:

#include <stdio.h>
#include <string.h>
#include <time.h>

int main()
{
   struct tm t;
   /* Quantrimang.com */
   t.tm_sec    = 15;
   t.tm_min    = 16;
   t.tm_hour   = 6;
   t.tm_mday   = 18;
   t.tm_mon    = 6;
   t.tm_year   = 118;
   t.tm_wday   = 5;

   puts(asctime(&t));
   
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Fri Jul 18 06:16:15 2018

Hàm clock() trong C

Hàm clock_t clock(void) Trả về số tích tắc đồng hồ đã trôi qua từ khi chương trình được chạy. Để lấy số giây được sử dụng bởi CPU, bạn sẽ cần chia cho CLOCKS_PER_SEC.

Trên hệ điều hành 32 bit thì CLOCKS_PER_SEC bằng 1000000, hàm này sẽ trả về cùng giá trị xấp xỉ mỗi 72 phút.

Khai báo hàm clock() trong C:

Dưới đây là phần khai báo cho clock() trong C:

clock_t clock(void)

Tham số:

  • Hàm này không nhận tham số nào.

Trả về giá trị:

Hàm này trả về số tích tắc đồng hồ đã trôi qua từ khi chương trình được chạy. Nếu thất bại, hàm trả về -1.

Ví dụ:

Chương trình C sau minh họa cách sử dụng của clock() trong C:

#include <time.h>
#include <stdio.h>

int main()
{
   clock_t start_t, end_t, total_t;
   int i;

   start_t = clock();
   printf("Bat dau chuong trinh, start_t = %ld
", start_t);
    
   printf("Quet qua mot vong lap lon, start_t = %ld
", start_t);
   for(i=0; i< 10000000; i++)
   {
   }
   end_t = clock();
   printf("Ket thuc vong lap, end_t = %ld
", end_t);
   
   total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
   printf("Tong thoi gian su dung boi CPU: %f
", total_t  );
   printf("Thoat chuong trinh...
");

   return(0);
}

Chạy code trên ta nhận được kết quả như sau:

Bat dau chuong trinh, start_t = 884
Quet qua mot vong lap lon, start_t = 884
Ket thuc vong lap, end_t = 32819
Tong thoi gian su dung boi CPU: 0.000000
Thoat chuong trinh...

Hàm ctime() trong C

Hàm char *ctime(const time_t *timer) trả về một chuỗi biểu diễn localtime dựa trên tham số timer

Chuỗi trả về có định dạng sau: Www Mmm dd hh:mm:ss trong đó Www là ngày trong tuần, Mmm là các ký tự chỉ tháng, dd là ngày của tháng, hh:mm:ss là thời gian và yyyy là năm.

Khai báo hàm ctime() trong C:

Dưới đây là phần khai báo cho ctime() trong C:

char *ctime(const time_t *timer)

Tham số:

  • timer -- Đây là con trỏ tới một đối tượng time_t mà chứa một Calendar time.

Trả về giá trị:

Hàm này trả về một chuỗi chứa thông tin date và time trong một định dạng con người có thể đọc.

Ví dụ:

Chương trình C sau minh họa cách sử dụng của ctime() trong C:

#include <stdio.h>
#include <time.h>

int main ()
{
   time_t curtime;

   time(&curtime);

   printf("Thời gian hiện tại = %s", ctime(&curtime));

   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Thời gian hiện tại = Mon Oct 15 04:49:13 2018

Hàm difftime() trong C

Hàm double difftime(time_t time1, time_t time2) trả về số giây khác nhau giữa time1time2, ví dụ như là (time1 - time2). Hai time được xác định trong Calendar time, biểu diễn thời gian đã trôi qua từ Epoch (00:00:00 1/1/19700 theo UTC).

Khai báo hàm difftime() trong C:

Dưới đây là phần khai báo cho difftime() trong C:

double difftime(time_t time1, time_t time2)

Tham số:

  • time1 -- Đây là đối tượng time_t cho thời gian kết thúc.

  • time2 -- Đây là đối tượng time_t cho thời gian bắt đầu.

Trả về giá trị:

Hàm này trả về số giây khác nhau giữa hai thời gian (time2 – time1) dưới dạng một giá trị double.

Ví dụ:

Chương trình C sau minh họa cách sử dụng của difftime() trong C:

#include <stdio.h>
#include <time.h>

int main ()
{
   time_t start_t, end_t;
   double diff_t;

   printf("Bắt đầu chương trình...
");
   time(&start_t);

   time(&end_t);
   diff_t = difftime(end_t, start_t);

   printf("Thời gian thực thi = %f
", diff_t);
   printf("Thoát chương trình...
");

   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Bắt đầu chương trình...
Thời gian thực thi = 0.000000
Thoát chương trình...

Hàm gmtime() trong C

Hàm struct tm *gmtime(const time_t *timer) sử dụng giá trị được trỏ tới bởi timer để điền vào một cấu trúc tm với các giá trị mà biểu diễn thời gian tương ứng, được diễn đạt trong UTC hoặc GMT.

Khai báo hàm gmtime() trong C:

Dưới đây là phần khai báo cho gmtime() trong C:

struct tm *gmtime(const time_t *timer)

Tham số:

  • timeptr -- Đây là con trỏ trỏ tới một giá trị time_t biểu diễn một Calendar time.

Trả về giá trị:

Hàm này trả về con trỏ tới cấu trúc tm với thông tin thời gian được điền vào trong. Dưới đây là chi tiết về cấu trúc timeptr.

struct tm {
   int tm_sec;         /* biểu diễn giây, từ 0 tới 59 */
   int tm_min;         /* biểu diễn phút, từ 0 tới 59 */
   int tm_hour;        /* biểu diễn giờ, từ 0 tới 23  */
   int tm_mday;        /* biểu diễn ngày của tháng, từ 1 tới 31 */
   int tm_mon;         /* biểu diễn tháng, từ 0 tới 11  */
   int tm_year;        /* biểu diễn năm, bắt đầu từ 1900 */
   int tm_wday;        /* ngày trong tuần, từ 0 tới 6 */
   int tm_yday;        /* ngày trong năm, từ 0 tới 365 */
   int tm_isdst;       /* biểu diễn Daylight Saving Time */
};

Ví dụ:

Chương trình C sau minh họa cách sử dụng của gmtime() trong C, bạn có thể tham khảo thêm danh sách múi giờ tại đây: 

#include <stdio.h>
#include <time.h>

#define BST (+1)
#define CCT (+8)

int main ()
{

   time_t rawtime;
   struct tm *info;

   time(&rawtime);
   /* Get GMT time */
   info = gmtime(&rawtime );
   
   printf("Thời gian hiện tại:
");
   printf("Tại London: %2d:%02d
", (info->tm_hour+BST)%24, info->tm_min);
   printf("Tại Trung Quốc: %2d:%02d
", (info->tm_hour+CCT)%24, info->tm_min);

   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Thời gian hiện tại:
Tại London: 5:51
Tại Trung Quốc: 12:51

Hàm localtime() trong C

Hàm struct tm *localtime(const time_t *timer) sử dụng time được trỏ tới bởi timer để điền một cấu trúc tm với các giá trị mà biểu diễn Local time tương ứng. Giá trị của timer được chia vào trong cấu trúc tm và được diễn đạt trong Local Timezone.

Khai báo hàm localtime() trong C:

Dưới đây là phần khai báo cho localtime() trong C:

struct tm *localtime(const time_t *timer)

Tham số:

  • timer -- Là con trỏ trỏ tới giá trị time_t biểu diễn một calendar time.

Trả về giá trị:

Hàm này trả về con trỏ tới cấu trúc tm với thông tin thời gian được điền vào trong. Dưới đây là chi tiết về cấu trúc timeptr.

struct tm {
   int tm_sec;         /* biểu diễn giây, từ 0 tới 59 */
   int tm_min;         /* biểu diễn phút, từ 0 tới 59 */
   int tm_hour;        /* biểu diễn giờ, từ 0 tới 23 */
   int tm_mday;        /* biểu diễn ngày của tháng, từ 1 tới 31 */
   int tm_mon;         /* biểu diễn tháng, từ 0 tới 11  */
   int tm_year;        /* biểu diễn năm, bắt đầu từ 1900 */
   int tm_wday;        /* ngày trong tuần, từ 0 tới 6 */
   int tm_yday;        /* ngày trong năm, từ 0 tới 365 */
   int tm_isdst;       /* biểu diễn Daylight Saving Time */
};

Ví dụ:

Chương trình C sau minh họa cách sử dụng của localtime() trong C:

#include <stdio.h>
#include <time.h>

int main ()
{
   time_t rawtime;
   struct tm *info;
   char buffer[80];

   time( &rawtime );

   info = localtime( &rawtime );
   printf("Local time và Local date hiện tại là: 
%s", asctime(info));

   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Local time và Local date hiện tại là: 
Mon Oct 15 11:56:31 2018

Hàm mktime() trong C

Hàm time_t mktime(struct tm *timeptr) chuyển đổi cấu trúc được trỏ tới bởi timeptr vào trong một giá trị time_t theo Local Timezone.

Khai báo hàm mktime() trong C:

Dưới đây là phần khai báo cho mktime() trong C:

time_t mktime(struct tm *timeptr)

Tham số:

  • timeptr -- là con trỏ trỏ tới giá trị time_t biểu diễn một calendar time, mà được chia nhỏ thành các thành phần với cấu trúc:

struct tm {
   int tm_sec;         /* biểu diễn giây, từ 0 tới 59 */
   int tm_min;         /* biểu diễn phút, từ 0 tới 59  */
   int tm_hour;        /* biểu diễn giờ, từ 0 tới 23   */
   int tm_mday;        /* biểu diễn ngày của tháng, từ 1 tới 31 */
   int tm_mon;         /* biểu diễn tháng, từ 0 tới 11 */
   int tm_year;        /* biểu diễn năm, bắt đầu từ 1900 */
   int tm_wday;        /* ngày trong tuần, từ 0 tới 6  */
   int tm_yday;        /* ngày trong năm, từ 0 tới 365 */
   int tm_isdst;       /* biểu diễn Daylight Saving Time */
};

Trả về giá trị:

Hàm này trả về giá trị time_t tương ứng với tham số calendar time đã truyền. Nếu có lỗi, hàm này trả về giá trị -1.

Ví dụ:

Chương trình C sau minh họa cách sử dụng của mktime() trong C:

#include <stdio.h>
#include <time.h>

int main ()
{
   int ret;
   struct tm info;
   char buffer[80];

   info.tm_year = 2016 - 1900;
   info.tm_mon = 7 - 1;
   info.tm_mday = 4;
   info.tm_hour = 0;
   info.tm_min = 0;
   info.tm_sec = 1;
   info.tm_isdst = -1;

   ret = mktime(&info);
   if( ret == -1 )
   {
      printf("Error: không thể lấy time bằng cách sử dụng mktime
");
   }
   else
   {
      strftime(buffer, sizeof(buffer), "%c", &info );
      printf(buffer);
   }

   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Mon Jul 4 00:00:01 2016

Hàm strftime() trong C

Hàm size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) định dạng thời gian được biểu diễn trong cấu trúc timeptr theo các qui tắc định dạng được định nghĩa trong format và được lưu trữ vào trong str.

Khai báo hàm strftime() trong C:

Dưới đây là phần khai báo cho strftime() trong C:

size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)

Tham số:

  • str -- Đây là con trỏ tới mảng đích, nơi mà chuỗi kết quả được sao chép.

  • maxsize -- Đây là số ký tự tối đa để được sao chép tới str.

  • format -- Đây là chuỗi chứa bất cứ tổ hợp nào của các ký tự thông thường và các format specifier đặc biệt. Những format specifier này được thay thế bởi hàm này bởi các giá trị tương ứng để biểu diễn thời gian được xác định trong tm. Các format specifier là:

Specifier Thay thế cho Ví dụ
%a Tên ngày trong tuần viết tắt Sun
%A Tên ngày trong tuần đầy đủ Sunday
%b Tên tháng viết tắt Mar
%B Tên tháng đầy đủ March
%c Biểu diễn date và time Sun Aug 19 02:56:02 2012
%d Ngày trong tháng (01-31) 19
%H Giờ, trong định dạng 24h (00-23) 14
%I Giờ, trong định dạng 12h (01-12) 05
%j Ngày trong năm (001-366) 231
%m Tháng, dưới dạng biểu diễn số (01-12) 08
%M Phút (00-59) 55
%p AM hoặc PM PM
%S Giây (00-61) 02
%U Số tuần, có ngày Chủ nhật đầu tiên là ngày đầu tiên của tuần (00-53) 33
%w Ngày trong tuần dưới dạng biểu diễn số (0-6) 4
%W Số tuần, có ngày thứ Hai đầu tiên là ngày đầu tiên của tuần (00-53) 34
%x Biểu diễn date 08/19/12
%X Biểu diễn time 02:50:06
%y Năm, biểu diễn dưới dạng hai số cuối (00-99) 01
%Y Năm 2012
%Z Tên Timezone CDT
%% Ký hiệu % %
  • timeptr -- là con trỏ trỏ tới giá trị time_t biểu diễn một calendar time, mà được chia nhỏ thành các thành phần với cấu trúc:

struct tm {
   int tm_sec;         /* biểu diễn giây, từ 0 tới 59 */
   int tm_min;         /* biểu diễn phút, từ 0 tới 59 */
   int tm_hour;        /* biểu diễn giờ, từ 0 tới 23 */
   int tm_mday;        /* biểu diễn ngày của tháng, từ 1 tới 31 */
   int tm_mon;         /* biểu diễn tháng, từ 0 tới 11 */
   int tm_year;        /* biểu diễn năm, bắt đầu từ 1900 */
   int tm_wday;        /* ngày trong tuần, từ 0 tới 6 */
   int tm_yday;        /* ngày trong năm, từ 0 tới 365 */
   int tm_isdst;       /* biểu diễn Daylight Saving Time */
};

Trả về giá trị:

Nếu chuỗi kết quả có kích cỡ nhỏ hơn kích cỡ các ký tự (bao gồm ký tự null kết thúc), thì toàn bộ ký tự được sao chép tới str (không bao gồm ký tự null kết thúc) được trả về. Nếu không, hàm trả về 0.

Ví dụ:

Chương trình C sau minh họa cách sử dụng của strftime() trong C:

#include <stdio.h>
#include <time.h>

int main ()
{
   time_t rawtime;
   struct tm *info;
   char buffer[80];

   time( &rawtime );

   info = localtime( &rawtime );

   strftime(buffer,80,"%x - %I:%M%p", info);
   printf("Date & time đã định dạng theo hàm strftime là: 
|%s|
", buffer );
  
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Date & time đã định dạng theo hàm strftime là: 
|10/15/18 - 04:58AM|

Hàm time() trong C

Hàm time_t time(time_t *seconds) trả về thời gian từ Epoch (00:00:00 1/1/1970 theo UTC), được ước lượng bằng giây. Nếu tham số seconds không là NULL, thì giá trị trả về cũng được lưu trữ trong biến seconds.

Khai báo hàm time() trong C:

Dưới đây là phần khai báo cho time() trong C:

time_t time(time_t *t)

Tham số:

  • seconds -- Đây là con trỏ tới một đối tượng của kiểu time_t, nơi giá trị seconds sẽ được lưu trữ.

Trả về giá trị:

Hàm trả về Calendar time hiện tại dưới dạng một đối tượng time_t.

Ví dụ:

Chương trình C sau minh họa cách sử dụng của time() trong C:

#include <stdio.h>
#include <time.h>

int main ()
{
   time_t seconds;

   seconds = time(NULL);
   printf("Số giờ (h) bắt đầu từ 1/1/1970 = %ld giờ
", seconds/3600);
  
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Số giờ (h) bắt đầu từ 1/1/1970 = 427660 giờ
0