C++(asctime()、ctime())

做梦当财神發表於2024-08-25

目錄
  • 1. asctime()
  • 2. ctime()
  • 3. 區別
    • 3.1 示例對比
  • 4. 總結



在C++中,asctime()ctime() 都是用於將時間轉換為可讀字串的函式,但它們有一些細微的區別。



1. asctime()

作用
asctime() 函式將 struct tm 型別的時間結構轉換為字串。這個函式通常與 localtime()gmtime() 配合使用,將分解後的時間結構轉化為字串形式。

函式原型

char *asctime(const struct tm *timeptr);
  • 引數

    • timeptr:指向 tm 結構的指標,表示要轉換的時間。
  • 返回值

    • 返回一個指向靜態記憶體中字串的指標,格式為:Www Mmm dd hh:mm:ss yyyy\n,例如:Sat Aug 25 14:32:00 2024\n

注意事項

  • 返回的字串儲存在靜態記憶體中,後續呼叫 asctime() 會覆蓋之前的內容。
  • 它要求輸入的必須是一個 struct tm 結構體,因此在使用之前通常需要透過 localtime()gmtime()time_t 轉換為 tm 結構。


2. ctime()

作用
ctime() 函式直接將 time_t 型別的時間戳轉換為可讀的字串,而不需要手動呼叫 localtime()gmtime()。它等效於將 time_t 先轉換為本地時間的 tm 結構體(透過 localtime()),然後呼叫 asctime() 進行格式化。

函式原型

char *ctime(const time_t *timep);
  • 引數

    • timep:指向 time_t 型別的指標,表示要轉換的時間戳。
  • 返回值

    • 返回一個指向靜態記憶體中字串的指標,格式與 asctime() 相同:Www Mmm dd hh:mm:ss yyyy\n

注意事項

  • 同樣地,返回的字串儲存在靜態記憶體中,後續呼叫 ctime() 會覆蓋之前的內容。
  • ctime() 不需要手動將 time_t 轉換為 tm 結構,它會自動呼叫 localtime()


3. 區別

  1. 輸入型別不同

    • asctime() 需要輸入一個 struct tm * 型別的指標,也就是說必須提供一個已經分解為年月日時分秒的時間結構。
    • ctime() 直接接受 time_t * 型別的指標,也就是自1970年1月1日以來的秒數,它會自動呼叫 localtime() 處理時間轉換。
  2. 使用場景不同

    • asctime() 主要用於當你已經有一個 struct tm 結構時,可以將其格式化為字串。
    • ctime() 適用於你直接有一個 time_t 型別的時間戳,可以快速將其轉為字串。

3.1 示例對比

asctime() 示例

#include <iostream>
#include <ctime>

int main() {
    time_t rawtime;
    struct tm *timeinfo;

    time(&rawtime);                  // 獲取當前時間(時間戳)
    timeinfo = localtime(&rawtime);  // 轉換為本地時間

    std::cout << "Using asctime: " << asctime(timeinfo) << std::endl;

    return 0;
}

ctime() 示例

#include <iostream>
#include <ctime>

int main() {
    time_t rawtime;

    time(&rawtime);  // 獲取當前時間(時間戳)

    std::cout << "Using ctime: " << ctime(&rawtime) << std::endl;

    return 0;
}


4. 總結

  • asctime() 用於將 tm 結構(分解後的時間)轉換為字串,必須先將 time_t 轉換為 tm 結構。
  • ctime() 更為簡化,直接將 time_t 轉換為字串,相當於自動呼叫了 localtime()asctime() 的組合。

兩者返回的字串格式相同,主要區別在於輸入的引數型別和適用的場景。