std::time_get<CharT,InputIt>:: get, std::time_get<CharT,InputIt>:: do_get
|
헤더 파일에 정의됨
<locale>
|
||
|
public
:
iter_type get
(
iter_type beg, iter_type end,
std::
ios_base
&
str,
|
(1) | (C++11 이후) |
|
protected
:
virtual
iter_type do_get
(
iter_type beg, iter_type end,
std::
ios_base
&
str,
|
(2) | (C++11 이후) |
do_get
을 재정의하여 사용자 정의할 수 있습니다.
get
함수는 다음을 수행합니다:
먼저,
err
의 에러 비트를
err
=
std::
ios_base
::
goodbit
을 실행하여 초기화합니다. 그런 다음 다음 조건 중 하나가 참이 될 때까지(다음 순서로 확인) 루프를 실행합니다:
eofbit
와
failbit
를 모두
err
에 설정합니다.
-
- 루프 본문에서 다음과 같은 단계가 수행됩니다:
%
와 형식 문자 사이에 나타남). 수정자가 없는 경우
'
\0
'
값이 사용됩니다. 형식 문자열이 모호하거나
'%'
이후 변환 지정자를 결정하기에 너무 일찍 끝나는 경우,
eofbit
이
err
에 설정되고 루프가 종료됩니다.
do_get
호출 후에
err
에 오류 비트가 설정되지 않은 경우, 함수는
fmtbeg
을 변환 지정자 바로 다음을 가리키도록 증가시키고 루프를 계속합니다.
failbit
를
err
에 설정합니다.
-
-
먼저,
err
의 오류 비트들을
err
=
std::
ios_base
::
goodbit
을 실행하여 초기화합니다. 그런 다음 입력 시퀀스
[
beg, end
)
에서
std::time_get
형식 지정자에 의해 예상되는 문자들을 읽습니다. 이 형식 지정자는
'%'
,
modifier
(
'
\0
'
이 아닌 경우), 그리고
format
을 조합하여 형성됩니다. 만약 문자가 유효한 변환 지정자를 형성하지 않으면,
err
에
failbit를 설정합니다. 문자를 읽은 후 입력 스트림의 끝에 도달하면, err 에eofbit를 설정합니다. 입력 문자열이 성공적으로 파싱되면, * t 의 해당 필드들을 업데이트합니다.
-
먼저,
err
의 오류 비트들을
err
=
std::
ios_base
::
goodbit
을 실행하여 초기화합니다. 그런 다음 입력 시퀀스
[
beg, end
)
에서
std::time_get
형식 지정자에 의해 예상되는 문자들을 읽습니다. 이 형식 지정자는
'%'
,
modifier
(
'
\0
'
이 아닌 경우), 그리고
format
을 조합하여 형성됩니다. 만약 문자가 유효한 변환 지정자를 형성하지 않으면,
err
에
-
-
복잡한 변환 지정자, 예를 들어
'%x'
또는
'%c'
, 또는 수정자
'E'
와
'O'
를 사용하는 지시자의 경우, 함수가
*
t
에 저장할 일부 값을 결정하지 못할 수 있습니다. 이러한 경우에는
err
에서
eofbit을 설정하고 이러한 필드들을 지정되지 않은 상태로 남겨둡니다.
-
복잡한 변환 지정자, 예를 들어
'%x'
또는
'%c'
, 또는 수정자
'E'
와
'O'
를 사용하는 지시자의 경우, 함수가
*
t
에 저장할 일부 값을 결정하지 못할 수 있습니다. 이러한 경우에는
err
에서
목차 |
매개변수
| beg | - | 파싱할 시퀀스의 시작을 지정하는 반복자 |
| end | - | 파싱할 시퀀스의 끝 바로 다음을 가리키는 반복자 |
| str | - | 이 함수가 필요할 때 로케일 패싯을 얻기 위해 사용하는 스트림 객체, 예를 들어 std::ctype 으로 공백을 건너뛰거나 std::collate 로 문자열을 비교할 때 사용됨 |
| err | - | 이 함수에 의해 오류를 표시하기 위해 수정되는 스트림 오류 플래그 객체 |
| t | - | 이 함수 호출의 결과를 담을 std::tm 객체에 대한 포인터 |
| fmtbeg | - |
변환 형식을 지정하는
char_type
문자 시퀀스의 첫 번째 문자에 대한 포인터 (아래 참조)
|
| fmtend | - |
변환 형식을 지정하는
char_type
문자 시퀀스의 마지막 문자 바로 다음을 가리키는 포인터
|
| format | - | 변환 지정자를 나타내는 문자 |
| modifier | - |
%
와 변환 지정자 사이에 나타날 수 있는 선택적 수정자
|
형식 문자열은 0개 이상의 변환 지정자, 공백 문자, 그리고 일반 문자(
%
제외)로 구성됩니다. 각 일반 문자는 대소문자를 구분하지 않는 비교에서 입력 스트림의 한 문자와 일치할 것으로 예상됩니다. 각 공백 문자는 입력 문자열의 임의의 공백과 일치합니다. 각 변환 지정은
%
문자로 시작하며, 선택적으로
E
또는
O
수식어(로캘에서 지원되지 않으면 무시됨)가 뒤따르고, 해당 지정자의 동작을 결정하는 문자로 끝납니다. 형식 지정자는 POSIX 함수
strptime()
와 일치합니다:
|
변환
지정자 |
설명 | 필드에 기록 |
|---|---|---|
%
|
리터럴
%
를 매칭합니다. 전체 변환 지정자는
%%
이어야 합니다.
|
(없음) |
t
|
모든 공백 문자와 일치 | (없음) |
n
|
모든 공백 문자와 일치 | (없음) |
| 연도 | ||
Y
|
4자리 10진수로 전체 연도 를 파싱합니다. 앞에 0이 허용되지만 필수는 아닙니다 |
tm_year
|
EY
|
대체 표현으로 연도 를 파싱합니다, 예: 平成23年 (헤이세이 23년) - ja_JP 로케일에서 2011을 tm_year에 기록합니다 |
tm_year
|
y
|
연도의 마지막 2자리를 10진수로 파싱합니다.
year
범위
[69,99]
는 1969~1999 값을, 범위
[00,68]
는 2000~2068을 결과로 합니다
|
tm_year
|
Oy
|
연도의 마지막 두 자리를 대체 숫자 체계를 사용하여 파싱합니다. 예를 들어 ja_JP locale에서 十一은 11로 파싱됩니다 |
tm_year
|
Ey
|
year
를 로케일의 대체 달력 기간
%EC
에서의 오프셋으로 파싱합니다
|
tm_year
|
C
|
year
의 첫 2자리를 10진수로 파싱합니다 (범위
[00,99]
)
|
tm_year
|
EC
|
기준 연도(기간)의 이름을 로캘의 대체 표현으로 파싱합니다. 예: ja_JP 로캘에서 平成 (헤이세이 시대) |
tm_year
|
| 월 | ||
b
|
월 이름을 전체 또는 약어로 파싱합니다, 예:
Oct
|
tm_mon
|
h
|
의 동의어
b
|
tm_mon
|
B
|
b
의 동의어
|
tm_mon
|
m
|
월(month)
을 10진수로 파싱합니다 (범위
[01,12]
), 선행하는 0이 허용되지만 필수는 아닙니다
|
tm_mon
|
Om
|
월 을 대체 숫자 체계를 사용하여 파싱합니다, 예: ja_JP 로캘에서 十二는 12로 파싱됨 |
tm_mon
|
| 주간 | ||
U
|
연중 주차(週次)를 10진수로 파싱합니다 (일요일이 주의 첫 번째 날) (범위
[00,53]
), 선행 0이 허용되지만 필수는 아님
|
tm_year
,
tm_wday
,
tm_yday
|
OU
|
연중 주차
를 파싱합니다.
%U
와 동일하게 동작하며, 대체 숫자 체계를 사용합니다. 예: ja_JP 로케일에서 五十二는 52로 파싱됨
|
tm_year
,
tm_wday
,
tm_yday
|
W
|
연중 주차(週次)를 10진수로 파싱합니다 (월요일이 주의 첫 번째 날) (범위
[00,53]
), 선행 0이 허용되지만 필수는 아닙니다
|
tm_year
,
tm_wday
,
tm_yday
|
OW
|
연중 주차를 파싱합니다,
week of the year
,
%W
와 동일하게, 대체 숫자 체계를 사용하여, 예를 들어 ja_JP 로케일에서 五十二는 52로 파싱됩니다
|
tm_year
,
tm_wday
,
tm_yday
|
| 연중/월별 날짜 | ||
j
|
연중 일자(day of the year)를 10진수로 파싱합니다 (범위
[001,366]
), 앞에 오는 0은 허용되지만 필수는 아닙니다
|
tm_yday
|
d
|
월의 날짜를 10진수로 파싱합니다 (범위
[01,31]
), 앞에 오는 0이 허용되지만 필수는 아닙니다
|
tm_mday
|
Od
|
월의 날짜 를 대체 숫자 체계를 사용하여 파싱합니다. 예: ja_JP 로케일에서 二十七은 27로 파싱되며, 앞에 오는 0은 허용되지만 필수는 아닙니다 |
tm_mday
|
e
|
d
의 동의어
|
tm_mday
|
Oe
|
의 동의어:
Od
|
tm_mday
|
| 요일 | ||
a
|
요일 이름을 전체 또는 약어로 파싱합니다. 예:
Fri
|
tm_wday
|
A
|
의 동의어
a
|
tm_wday
|
w
|
요일
을 10진수로 파싱하며, 일요일은
0
입니다
(범위
[0-6]
)
|
tm_wday
|
Ow
|
weekday
를 10진수로 파싱하며, 여기서 일요일은
0
에 해당합니다. 대체 숫자 체계를 사용하며, 예를 들어 ja_JP 로케일에서 二는 2로 파싱됩니다
|
tm_wday
|
| 시, 분, 초 | ||
H
|
시간을 10진수로 파싱합니다, 24시간제 (범위
[00-23]
), 앞에 오는 0은 허용되지만 필수는 아닙니다
|
tm_hour
|
OH
|
24시간 시계에서 시간 을 대체 숫자 체계로 파싱합니다. 예: ja_JP 로캘에서 十八은 18로 파싱됨 |
tm_hour
|
I
|
12시간제로
hour
를 10진수로 파싱합니다 (범위
[01,12]
), 앞에 오는 0은 허용되지만 필수는 아닙니다
|
tm_hour
|
OI
|
12시간제 시계에서 hour 를 대체 숫자 체계로 파싱합니다. 예: ja_JP 로케일에서 六은 06로 읽힘 |
tm_hour
|
M
|
분(minute)을 십진수로 파싱합니다 (범위
[00,59]
), 앞에 오는 0은 허용되지만 필수는 아닙니다
|
tm_min
|
OM
|
분 을 대체 숫자 체계를 사용하여 파싱합니다. 예: ja_JP 로캘에서 二十五는 25로 파싱됨 |
tm_min
|
S
|
second
를 10진수로 파싱합니다 (범위
[00,60]
), 앞에 오는 0은 허용되지만 필수는 아닙니다
|
tm_sec
|
OS
|
초 를 대체 숫자 체계를 사용하여 파싱합니다. 예: ja_JP 로캘에서 二十四는 24로 파싱됨 |
tm_sec
|
| 기타 | ||
c
|
로케일의 표준 날짜 및 시간 문자열 형식을 파싱합니다. 예:
Sun Oct 17 04:41:13 2010
(로케일 의존적)
|
전체 |
Ec
|
로케일의 대체 날짜 및 시간 문자열 형식을 파싱합니다. 예를 들어 ja_JP 로케일에서 2011년 (year 2011) 대신 平成23年 (헤이세이 23년)을 기대합니다 | 전체 |
x
|
로케일의 표준 날짜 표현을 파싱합니다 | all |
Ex
|
로캘의 대체 날짜 표현을 파싱합니다. 예를 들어 ja_JP 로캘에서 2011년 (year 2011) 대신 平成23年 (헤이세이 23년)을 기대합니다 | all |
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
와 같은 함수와 함께 사용하려면 명시적으로 설정해야 합니다.
반환값
성공적으로 파싱된 [ beg, end ) 범위에서 마지막 문자 바로 다음을 가리키는 반복자.
참고 사항
형식 문자열에서 공백이 아닌 비- '%' 문자들에 대한 대소문자 구분 없는 비교는 일반적으로 str 이 제공하는 로캘의 std::collate 패싯을 사용하지만, 반드시 그런 것은 아닙니다.
파싱 오류가 발생하면, 이 함수의 많은 구현에서 * t 를 완전히 변경하지 않고 그대로 둡니다.
이러한 함수들이 직접 설정하지 않는
*
t
의 필드들을 제로 아웃하는지 여부는 명시되지 않았습니다: 이식 가능한 프로그램들은
get()
을 호출하기 전에 모든 필드를 0으로 초기화해야 합니다.
예제
#include <iomanip> #include <iostream> #include <locale> #include <sstream> int main() { std::istringstream ss("2026-März-12 23:45:56"); ss.imbue(std::locale("de_DE.utf8")); auto& f = std::use_facet<std::time_get<char>>(ss.getloc()); std::tm t{}; std::string s = "%Y-%b-%d %H:%M:%S"; std::ios_base::iostate err = std::ios_base::goodbit; auto ret = f.get({ss}, {}, ss, err, &t, &s[0], &s[0] + s.size()); ss.setstate(err); std::istreambuf_iterator<char> last{}; if (ss) { std::cout << "Successfully parsed as " << std::put_time(&t, "%c") << '\n'; if (ret != last) { std::cout << "Remaining content: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } else std::cout << "The input was fully consumed."; } else { std::cout << "Parse failed.\nUnparsed string: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } std::cout << '\n'; }
출력:
Successfully parsed as Sun Mar 12 23:45:56 2026 The input was fully consumed.
참고 항목
|
(C++11)
|
지정된 형식의 날짜/시간 값을 파싱함
(함수 템플릿) |