C 語言 時間函數使用技巧(彙總)

来源:https://www.cnblogs.com/wuyuenini/archive/2022/08/10/16573628.html
-Advertisement-
Play Games

time.h 頭文件 是 C 語言中 有關 時間的函數所儲存的頭文件 #include <time.h> 在介紹時間函數用法之前,我們首先要瞭解在 time.h 頭文件中已經聲明瞭的一個結構: struct tm 該結構在time.h 頭文件內聲明如下: #ifndef _TM_DEFINED #d ...


time.h 頭文件 是 C 語言中 有關 時間的函數所儲存的頭文件

#include <time.h>

在介紹時間函數用法之前,我們首先要瞭解在 time.h 頭文件中已經聲明瞭的一個結構: struct tm
該結構在time.h 頭文件內聲明如下:

#ifndef _TM_DEFINED
#define _TM_DEFINED
  struct tm {
    int tm_sec;
    int tm_min;
    int tm_hour;
    int tm_mday;
    int tm_mon;
    int tm_year;
    int tm_wday;
    int tm_yday;
    int tm_isdst;
  };
#endif

該結構內個成員所代表的意思:

struct tm 
   {
       int tm_sec;        //秒(0~61)
       int tm_min;        //分(0~59)
       int tm_hour;       //小時(0~23)
       int tm_mday;       //日(1~31)
       int tm_mon;        //月份(0~11)
       int tm_year;       //年,從1970年至今經過的年數
       int tm_wday;       // 星期:(0~6)
       int tm_yday;       // 天數(0~365)
       int tm_isdst;      //夏令時 daylight-saving time
   }

下麵來介紹幾種時間函數的用法:

//函數名稱:
time();
//函數原型:
time_t __cdecl time(time_t *_Time) 
{ 
	return _time64(_Time);
}
//函數功能:得到機器的日曆時間或設置日曆時間
//函數返回機器日曆時間
//用法:
參數說明: timer = NULL 時得到機器日曆時間, timer = 時間數值值,用於設置日曆時間, time_t  是一個long 類型
#include <stdio.h>
#include <time.h>

int main(void)
{
    time_t timer;
    timer = time(NULL);
    printf("%ld\n", timer);
}

運行結果是 秒數:在這裡插入圖片描述
將這個秒數通過時間戳線上轉換網站轉換為年月日,轉換網址為: https://tool.lu/timestamp/ 轉換結果如下
在這裡插入圖片描述

//函數名稱:
localtime();
//函數原型:
struct tm *__cdecl localtime(const time_t *_Time) 
{
	return _localtime32(_Time); 
}
//函數功能: 返回一個以 tm結構表達的機器時間信息
//函數返回:以 tm 結構表達的時間
//用法:
#include <stdio.h>
#include <time.h>

int main(void)
{
    time_t timer;
    struct tm *tblock;
    timer = time(NULL);
    tblock = localtime(&timer);
    printf("當地時間是 %s", tblock);
}

直接使用 tblock的值 輸出結果是有問題的:
在這裡插入圖片描述
想要獲取日常使用的時間格式 要多使用一個函數:

//函數名稱:
asctime();
//函數原型:
char *__cdecl asctime(const struct tm *_Tm) 
//函數功能:獲取機器時間(日期時間轉換成ASCII碼)
//函數返回:返回的時間字元串格式為: 星期,月,日,小時:分:秒,年
//用法:
#include <stdio.h>
#include <time.h>

int main(void)
{
    time_t timer;
    struct tm *tblock;
    timer = time(NULL);
    tblock = localtime(&timer);
    printf("當地時間是 %s", asctime(tblock));
}
//另一種用法:
//結合 struct tm 結構
#include <stdio.h>
#include <time.h>
#include <string.h>

int main(void)
{
    struct tm t;
    char str[80];

    t.tm_sec = 1;
    t.tm_min = 3;
    t.tm_hour = 7;
    t.tm_mday = 22;
    t.tm_mon = 11;
    t.tm_year = 56;
    t.tm_wday = 4;
    t.tm_yday = 0;
    t.tm_isdst = 0;
    strcpy(str, asctime(&t));
    printf("%s", str);
}

運行結果:
用法1:
在這裡插入圖片描述
用法2:
在這裡插入圖片描述
同樣使用 時間格式輸出時間的還有:

//函數名稱:
ctime();
//函數原型:
char *__cdecl ctime(const time_t *_Time)
 { 
 	return _ctime64(_Time); 
 }
//函數功能:得到日曆時間
//函數返回:返回字元串格式: 星期,月,日,小時:分:秒,年
//用法:
#include <stdio.h>
#include <time.h>

int main(void)
{
    time_t t;
    time(&t);
    printf("當地時間是 %s", ctime(&t));
}

運行結果:
在這裡插入圖片描述
兩次機器時間差的獲取方法:

//函數名稱:
difftime();
//函數原型:double __cdecl difftime(time_t _Time1,time_t _Time2)
//函數功能:得到兩次機器時間差,單位為秒
//函數返回:時間差,單位為秒
//用法:
//參數說明: time1 - 機器時間一, time2 - 機器時間二,該參數應使用 time函數獲得
#include <stdio.h>
#include <time.h>
#include <windows.h>

int main(void)
{
    time_t first, second;
    first = time(NULL);
    Sleep(2000);
    second = time(NULL);
    printf("兩者之間差了 %f 秒", difftime(second, first));
}

運行結果:
在這裡插入圖片描述
另一個 結構 時間信息 函數:

//函數名稱:
gmtime();
//函數原型:struct tm *__cdecl gmtime(const time_t *_Time) { return _gmtime64(_Time); }
//函數功能:得到以結構 tm 表示的時間信息
//函數返回:以結構 tm 表示的時間信息指針
//用法:
//參數說明: t 函數用 time()得到的時間信息
#include <stdio.h>
#include <time.h>
#include <windows.h>

int main(void)
{
    char *tzstr = "TZ = PST8PDT";
    time_t t;
    struct tm *gmt, *area;
    putenv(tzstr);
    tzset();
    time(&t);
    area = localtime(&t);
    printf("當地時間是: %s", asctime(area));
    gmt = gmtime(&t);
    printf("格林尼治時間是: %s", asctime(gmt));
}

運行結果:
在這裡插入圖片描述
上個示例中提到 tzset():

//函數名稱:
tzset();
//函數原型:void __cdecl tzset(void) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
//函數功能:對UNIX操作系統的時間相容性,用於得到時區 在 DOS 環境下無用途
//函數返回:無
//用法:
#include <stdio.h>
#include <time.h>
#include <windows.h>

int main(void)
{
    time_t td;
    putenv("TZ = PST8PDT");
    tzset();
    time(&td);
    printf("當前時間 = %s", asctime(localtime(&td)));
}

運行結果:
在這裡插入圖片描述
下麵來介紹實現 自定義 時間格式輸出函數:

//函數名稱:
strftime();
/*函數原型:size_t __cdecl strftime(char * __restrict__ _Buf,size_t _SizeInBytes,const char * __restrict__ _Format,const struct tm * __restrict__ _Tm);
    它有4個參數:

    _Buf, 表示返回的時間字元串
    _SizeInBytes, 要寫入的位元組的最大數量
    _Format, 這是 C 字元串,包含了普通字元和特殊格式說明符的任何組合。
    _Tm, 輸入時間結構體
    其中C字元串格式符說明如下:

    說明符	替換為	示例
    %a	縮寫的星期幾名稱	Sun
    %A	完整的星期幾名稱	Sunday
    %b	縮寫的月份名稱	Mar
    %B	完整的月份名稱	March
    %c	日期和時間表示法	Sun Jan 23 02:56:02 2022
    %d	一月中的第幾天(01-31)	19
    %H	24 小時格式的小時(00-23)	14
    %I	12 小時格式的小時(01-12)	05
    %j	一年中的第幾天(001-366)	231
    %m	十進位數表示的月份(01-12)	08
    %M	分(00-59)	55
    %p	AM 或 PM 名稱	PM
    %S	秒(00-61)	02
    %U	一年中的第幾周,以第一個星期日作為第一周的第一天(00-53)	33
    %w	十進位數表示的星期幾,星期日表示為 0(0-6)	4
    %W	一年中的第幾周,以第一個星期一作為第一周的第一天(00-53)	34
    %x	日期表示法	08/19/12
    %X	時間表示法	02:50:06
    %y	年份,最後兩個數字(00-99)	01
    %Y	年份	2012
    %Z	時區的名稱或縮寫	CDT
    %%	一個 % 符號	%
*/
//函數功能:將時間結構體轉換為指定的字元串格式
//函數返回:通過指定的字元串格式列印出來
//用法:
#include <stdio.h>
#include <time.h>

int main(void)
{
	time_t now_time;
	struct tm *info;
	char buffer[80];
	time( &now_time );
	info = localtime( &now_time );
	strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info);
	printf("格式化的日期和時間 : %s \n", buffer );
}

運行結果:
在這裡插入圖片描述

通過列印的結果可以看出,列印字元串的格式和函數中指定的字元串格式是一樣的,這樣通過對字元串格式的設置,就可按照自己的要求列印出時間和日期的字元串,使用起來更加靈活和方便。

關於 C 語言時間函數的用法和特色後續會在陸續補充

本文為博主原創文章,轉載請註明來源http://www.cnblogs.com/wuyuenini/
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、實現原理 在Servlet3協議規範中,包含在JAR文件/META-INFO/resources/路徑下的資源可以直接訪問。 二、舉例說明 如下圖所示,是我新建的一個Spring Boot Starter項目:zimug-minitor-threadpool,用於實現可配置、可觀測的線程池。其中 ...
  • 1、我們的目標是獲取微博某博主的全部圖片、視頻 2、拿到網址後 我們先觀察 打開F12 隨著下滑我們發現載入出來了一個叫mymblog的東西,展開響應發現需要的東西就在裡面 3、重點來了!!! 通過觀察發現第二頁比第一頁多了參數since_id 而第二頁的since_id參數剛好在上一頁中能獲取到, ...
  • django2 路由控制器 Route路由,是一種映射關係。路由是把客戶端請求的url路徑和用戶請求的應用程式,這裡意指django裡面的視圖進行綁定映射的一種關係。 請求路徑和視圖函數不是一一對應的關係 在django中所有的路由最終都被保存到一個叫urlpatterns的文件里,並且該文件必須在 ...
  • 索引時資料庫提高數據查詢處理性能的一個非常關鍵的技術,索引的使用可以對性能產生上百倍甚至上千倍的影響。接下來,會介紹索引的基本原理、概念,並深入學習資料庫中所使用的索引結構和存儲方式,以及如何管理、維護索引等。 1.索引的基本概念 索引時用來快速查詢表記錄的一種存儲結構,一般使用索引有一下兩個方面: ...
  • 1.避免Scoped模式註冊的服務變成Singleton模式 當提供一個生命周期模式為Singleton的服務實例時,如果發現該服務中還依賴生命周期模式為Scoped的服務實例(Scoped服務實例將被一個Singleton服務實例所引用),那麼這個被依賴的Scoped服務實例最終會成為一個Sing ...
  • 一、JSON(JavaScript Object Notation)的簡介: ① JSON和XML類似,主要用於存儲和傳輸文本信息,但是和XML相比,JSON更小、更快、更易解析、更易編寫與閱讀。 ② C、Python、C++、Java、PHP、Go等編程語言都支持JSON。 二、JSON語法規則: ...
  • WPF 實現帶蒙版的 MessageBox 消息提示框 WPF 實現帶蒙版的 MessageBox 消息提示框 作者:WPFDevelopersOrg 原文鏈接: https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal 框架使用大於等於.N ...
  • 使用原因: 在我們服務端調用第三方介面時,如:支付寶,微信支付,我們服務端需要模擬http請求並加上一些自己的邏輯響應給前端最終達到我們想要的效果 1.使用WebClient 引用命名空間 using System.Net; using System.Collections.Specialized; ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...