名稱空間
變體
操作

std::get_time

來自 cppreference.com
< cpp‎ | io‎ | 操縱器
 
 
 
輸入/輸出操縱器
浮點格式化
整數格式化
布林格式化
欄位寬度和填充控制
其他格式化
空白字元處理
輸出重新整理
(C++20)  

狀態標誌操作
時間與金錢 I/O
(C++11)
get_time
(C++11)
(C++11)
(C++11)
帶引號的操縱器
(C++14)
 
定義於標頭檔案 <iomanip>
template< class CharT >
/*未指定*/ get_time( std::tm* tmb, const CharT* fmt );
(C++11 起)

當在表示式 in >> get_time(tmb, fmt) 中使用時,根據輸入流 in 中當前注入的區域設定的 std::time_get 面,將字元輸入解析為符合格式字串 fmt 的日期/時間值。結果值儲存在由 tmb 指向的 std::tm 物件中。

目錄

[編輯] 引數

tmb - 指向 std::tm 物件的有效指標,結果將儲存在此處
fmt - 指向 null 終止的 CharT 字串的指標,指定轉換格式

格式字串由零個或多個轉換說明符、空白字元和普通字元(除了 %)組成。每個普通字元應與輸入流中的一個字元進行大小寫不敏感的匹配。每個空白字元匹配輸入字串中的任意空白。每個轉換規範以 % 字元開頭,可選地後跟 EO 修飾符(如果區域設定不支援則忽略),然後是確定說明符行為的字元。格式說明符與 POSIX 函式 strptime() 匹配

轉換
說明符
解釋 寫入欄位
% 匹配字面值 %。完整的轉換規範必須是 %% (無)
t 匹配任何空白 (無)
n 匹配任何空白 (無)
Y 將完整的年份解析為 4 位十進位制數,允許但不要求前導零 tm_year
EY 解析年份的替代表示,例如,在 ja_JP 區域設定中將 平成23年(平成 23 年)解析為 tm_year 中的 2011 tm_year
y 年份的最後 2 位解析為十進位制數。範圍 [69,99] 產生值 1969 到 1999,範圍 [00,68] 產生值 2000-2068 tm_year
Oy 使用替代數字系統解析年份的最後 2 位,例如,在 ja_JP 區域設定中將 十一 解析為 11 tm_year
Ey 年份解析為與區域設定的替代日曆週期 %EC 的偏移量 tm_year
C 年份的前 2 位解析為十進位制數(範圍 [00,99] tm_year
EC 解析區域設定替代表示中的基準年(時期)名稱,例如,ja_JP 中的 平成(平成時代) tm_year
b 解析月份名稱,可以是完整的或縮寫的,例如 Oct tm_mon
h b 的同義詞 tm_mon
B b 的同義詞 tm_mon
m 月份解析為十進位制數(範圍 [01,12]),允許但不要求前導零 tm_mon
Om 使用替代數字系統解析月份,例如,在 ja_JP 區域設定中將 十二 解析為 12 tm_mon
U 年份中的周解析為十進位制數(星期日是第一天)(範圍 [00,53]),允許但不要求前導零 tm_year, tm_wday, tm_yday
OU 使用替代數字系統解析年份中的周,如 %U,例如,在 ja_JP 區域設定中將 五十二 解析為 52 tm_year, tm_wday, tm_yday
W 年份中的周解析為十進位制數(星期一是第一天)(範圍 [00,53]),允許但不要求前導零 tm_year, tm_wday, tm_yday
OW 使用替代數字系統解析年份中的周,如 %W,例如,在 ja_JP 區域設定中將 五十二 解析為 52 tm_year, tm_wday, tm_yday
年/月中的日
j 年份中的日解析為十進位制數(範圍 [001,366]),允許但不要求前導零 tm_yday
d 月份中的日解析為十進位制數(範圍 [01,31]),允許但不要求前導零 tm_mday
Od 使用替代數字系統解析月份中的日,例如,在 ja_JP 區域設定中將 二十七 解析為 27,允許但不要求前導零 tm_mday
e d 的同義詞 tm_mday
Oe Od 的同義詞 tm_mday
星期幾
a 解析星期幾的名稱,可以是完整的或縮寫的,例如 Fri tm_wday
A a 的同義詞 tm_wday
w 工作日解析為十進位制數,其中星期日是 0(範圍 [0-6] tm_wday
Ow 工作日解析為十進位制數,其中星期日是 0,使用替代數字系統,例如,在 ja_JP 區域設定中將 二 解析為 2 tm_wday
時、分、秒
H 小時解析為十進位制數,24 小時制(範圍 [00-23]),允許但不要求前導零 tm_hour
OH 使用替代數字系統從 24 小時制解析小時,例如,在 ja_JP 區域設定中將 十八 解析為 18 tm_hour
I 小時解析為十進位制數,12 小時制(範圍 [01,12]),允許但不要求前導零 tm_hour
OI 使用替代數字系統從 12 小時制解析小時,例如,在 ja_JP 區域設定中將 六 讀取為 06 tm_hour
M 分鐘解析為十進位制數(範圍 [00,59]),允許但不要求前導零 tm_min
OM 使用替代數字系統解析分鐘,例如,在 ja_JP 區域設定中將 二十五 解析為 25 tm_min
S 解析為十進位制數(範圍 [00,60]),允許但不要求前導零 tm_sec
OS 使用替代數字系統解析,例如,在 ja_JP 區域設定中將 二十四 解析為 24 tm_sec
其他
c 解析區域設定的標準日期和時間字串格式,例如 Sun Oct 17 04:41:13 2010(取決於區域設定) 所有
Ec 解析區域設定的替代日期和時間字串格式,例如在 ja_JP 區域設定中期望 平成23年 (平成 23 年) 而不是 2011年 (2011 年) 所有
x 解析區域設定的標準日期表示 所有
Ex 解析區域設定的替代日期表示,例如在 ja_JP 區域設定中期望 平成23年 (平成 23 年) 而不是 2011年 (2011 年) 所有
X 解析區域設定的標準時間表示 所有
EX 解析區域設定的替代時間表示 所有
D 等同於 "%m / %d / %y " tm_mon, tm_mday, tm_year
r 解析區域設定的標準 12 小時制時間(在 POSIX 中,"%I : %M : %S %p" tm_hour, tm_min, tm_sec
R 等同於 "%H : %M" tm_hour, tm_min
T 等同於 "%H : %M : %S" tm_hour, tm_min, tm_sec
p 解析區域設定的 a.m. 或 p.m. 等效項 tm_hour

注意:tm_isdst 不會被寫入,並且需要明確設定才能與 mktime 等函式一起使用


[編輯] 返回值

一個未指定型別的物件,使得

  • 如果 instd::basic_istream<CharT, Traits> 型別,則表示式 in >> get_time(tmb, fmt)
    • 型別為 std::basic_istream<CharT, Traits>&
    • 值為 in
    • 其行為如同呼叫了 f(in, tmb, fmt)

其中函式 f 定義為

template<class CharT, class Traits>
void f(std::basic_ios<CharT, Traits>& str, std::tm* tmb, const CharT* fmt)
{
    using Iter = std::istreambuf_iterator<CharT, Traits>;
    using TimeGet = time_get<CharT, Iter>;
 
    std::ios_base::iostate err = std::ios_base::goodbit;
    const TimeGet& tg = std::use_facet<TimeGet>(str.getloc());
 
    tg.get(Iter(str.rdbuf()), Iter(), str, err, tmb,
        fmt, fmt + Traits::length(fmt));
 
    if (err != std::ios_base::goodbit)
        str.setstate(err);
}

[編輯] 注意

根據此函式呼叫的 std::time_get::do_get 中指定,此函式是否將 *tmb 中未由 fmt 中出現的轉換說明符直接設定的欄位清零是未指定的:可移植程式應在呼叫 std::get_time 之前將 *tmb 的每個欄位初始化為零。

[編輯] 示例

注意:選擇 clang 或 gcc >= 12.1 以觀察輸出。12.1 之前的 libstdc++ 沒有正確實現 %b 說明符:bug #78714

#include <iomanip>
#include <iostream>
#include <locale>
#include <sstream>
 
int main()
{
    std::tm t = {};
    std::istringstream ss("2011-Februar-18 23:12:34");
    ss.imbue(std::locale("de_DE.utf-8"));
    ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S");
 
    if (ss.fail())
        std::cout << "Parse failed\n";
    else
        std::cout << std::put_time(&t, "%c") << '\n';
}

可能的輸出

Sun Feb 18 23:12:34 2011

[編輯] 參閱

從輸入字元序列解析時間/日期值到 std::tm
(類模板) [編輯]
(C++11)
根據指定格式格式化並輸出日期/時間值
(函式模板) [編輯]
(C++20)
從流解析 chrono 物件
(函式模板) [編輯]