Windows에서 strptime()과 동등합니까?
이에 상응하는 효과적인 구현이 있습니까?strptime()
Windows에 사용할 수 있습니까?안타깝게도 이 POSIX 기능은 사용할 수 없는 것 같습니다.
strptime - summary에 대한 그룹 설명 열기: 다음과 같은 텍스트 문자열을 변환합니다."MM-DD-YYYY HH:MM:SS"
의 상태가.tm struct
와 반대되는.strftime()
.
코드를 이식하거나 프로젝트를 강화하지 않으려면 다음 작업을 수행할 수 있습니다.
- 사용하여 날짜 구문 분석
sscanf
- 그런 다음 정수를 복사합니다.
struct tm
(월에서 1, 연도에서 1900으로 계산 - 월은 0-11이고 연도는 1900으로 시작) - 마지막으로, 사용합니다.
mktime
UTC 에포크 정수를 구함
설정하는 것을 기억하십시오.isdst
의 일원struct tm
-1로, 그렇지 않으면 일광 절약 문제가 발생할 것입니다.
Visual Studio 2015 이상을 사용하고 있다고 가정하면 strptime에 대한 드롭인 대체 기능으로 사용할 수 있습니다.
#include <time.h>
#include <iomanip>
#include <sstream>
extern "C" char* strptime(const char* s,
const char* f,
struct tm* tm) {
// Isn't the C++ standard lib nice? std::get_time is defined such that its
// format parameters are the exact same as strptime. Of course, we have to
// create a string stream first, and imbue it with the current C locale, and
// we also have to make sure we return the right things if it fails, or
// if it succeeds, but this is still far simpler an implementation than any
// of the versions in any of the C standard libraries.
std::istringstream input(s);
input.imbue(std::locale(setlocale(LC_ALL, nullptr)));
input >> std::get_time(tm, f);
if (input.fail()) {
return nullptr;
}
return (char*)(s + input.tellg());
}
크로스 플랫폼 애플리케이션의 경우,std::get_time
GCC 5.1까지 구현되지 않았기 때문에 호출로 전환합니다.std::get_time
직접적으로 선택할 수 없습니다.
의 오픈 소스 버전(BSD 라이센스)strptime()
http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=HEAD 에서 확인할 수 있습니다.
이를 사용하려면 다음 선언을 추가해야 합니다.
char *strptime(const char * __restrict, const char * __restrict, struct tm * __restrict);
이렇게 하면 작업이 수행됩니다.
#include "stdafx.h"
#include "boost/date_time/posix_time/posix_time.hpp"
using namespace boost::posix_time;
int _tmain(int argc, _TCHAR* argv[])
{
std::string ts("2002-01-20 23:59:59.000");
ptime t(time_from_string(ts));
tm pt_tm = to_tm( t );
그러나 입력 문자열은 YYYY-MM-DD입니다.
@amwinter 게시된 답변의 복사 및 붙여넣기 가능한 C 예제입니다. 사용하지 않았지만sscanf()
그*scanf()
함수 계열은 IMO가 너무 비뚤어져서 다음을 사용하여 강력한 구문 분석을 수행할 수 없습니다.
(수직 스크롤 막대가 생성되지 않도록 예제를 충분히 짧게 유지하기 위해 오류 및 오류 검사 생략)
// format will be YYYYmmddHHMMSSZ
const char *notAfter = getNotAfterStringFromX509Cert( x509 );
struct tm notAfterTm = { 0 };
#ifdef _WIN32
char buffer[ 8 ];
memset( buffer, 0, sizeof( buffer ) );
strncpy( buffer, notAfter, 4 );
notAfterTm.tm_year = strtol( buffer, NULL, 10 ) - 1900;
memset( buffer, 0, sizeof( buffer ) );
strncpy( buffer, notAfter + 4, 2 );
notAfterTm.tm_mon = strtol( buffer, NULL, 10 ) - 1;
memset( buffer, 0, sizeof( buffer ) );
strncpy( buffer, notAfter + 6, 2 );
notAfterTm.tm_mday = strtol( buffer, NULL, 10 );
memset( buffer, 0, sizeof( buffer ) );
strncpy( buffer, notAfter + 8, 2 );
notAfterTm.tm_hour = strtol( buffer, NULL, 10 );
memset( buffer, 0, sizeof( buffer ) );
strncpy( buffer, notAfter + 10, 2 );
notAfterTm.tm_min = strtol( buffer, NULL, 10 );
memset( buffer, 0, sizeof( buffer ) );
strncpy( buffer, notAfter + 12, 2 );
notAfterTm.tm_sec = strtol( buffer, NULL, 10 );
time_t result = mktime( ¬AfterTm );
이것은 입력 문자열이 정확히 알려진 형식으로 되어 있어서 구문 분석하기가 매우 쉽습니다.
한 가지 대안은 다음과 같습니다.GetSystemTime
다음을 사용하여 시간 정보를 형식에 따라 구문 분석하는 함수로 보냅니다.vsnprintf_s
아래 예제에는 밀리초의 정밀도로 시간 문자열을 생성하는 함수가 있습니다.그런 다음 문자열을 원하는 형식에 따라 형식을 지정하는 함수로 보냅니다.
#include <string>
#include <cstdio>
#include <cstdarg>
#include <atlstr.h>
std::string FormatToISO8601 (const std::string FmtS, ...) {
CStringA BufferString;
try {
va_list VaList;
va_start (VaList, FmtS);
BufferString.FormatV (FmtS.c_str(), VaList);
} catch (...) {}
return std::string (BufferString);
}
void CreateISO8601String () {
SYSTEMTIME st;
GetSystemTime(&st);
std::string MyISO8601String = FormatToISO8601 ("%4u-%02u-%02uT%02u:%02u:%02u.%03u", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
}
https://github.com/p-j-miller/date-time 에서 Windows용 strptime209 버전이 제공됩니다.동일한 위치에 일치하는 strftime() 기능과 종합 테스트 프로그램이 포함됩니다.두 OS 모두에서 작동하는 코드를 만들어야 하는 경우에도 Linux에서 작동합니다.
언급URL : https://stackoverflow.com/questions/321849/strptime-equivalent-on-windows
'programing' 카테고리의 다른 글
R에서 두 히스토그램을 함께 표시하는 방법은 무엇입니까? (0) | 2023.06.14 |
---|---|
HTTP POST/GET 요청에 대해 ASP.NET ASMX 웹 서비스 사용 (0) | 2023.06.09 |
HttpRequest 대 HttpRequestMessage 대 HttpRequestBase (0) | 2023.06.09 |
오라클의 테이블 수 (0) | 2023.06.09 |
기능을 병렬로 실행하는 방법은 무엇입니까? (0) | 2023.06.09 |