programing

Windows에서 strptime()과 동등합니까?

showcode 2023. 6. 9. 22:13
반응형

Windows에서 strptime()과 동등합니까?

이에 상응하는 효과적인 구현이 있습니까?strptime()Windows에 사용할 수 있습니까?안타깝게도 이 POSIX 기능은 사용할 수 없는 것 같습니다.

strptime - summary에 대한 그룹 설명 열기: 다음과 같은 텍스트 문자열을 변환합니다."MM-DD-YYYY HH:MM:SS"의 상태가.tm struct와 반대되는.strftime().

코드를 이식하거나 프로젝트를 강화하지 않으려면 다음 작업을 수행할 수 있습니다.

  1. 사용하여 날짜 구문 분석sscanf
  2. 그런 다음 정수를 복사합니다.struct tm(월에서 1, 연도에서 1900으로 계산 - 월은 0-11이고 연도는 1900으로 시작)
  3. 마지막으로, 사용합니다.mktimeUTC 에포크 정수를 구함

설정하는 것을 기억하십시오.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_timeGCC 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( &notAfterTm );

이것은 입력 문자열이 정확히 알려진 형식으로 되어 있어서 구문 분석하기가 매우 쉽습니다.

한 가지 대안은 다음과 같습니다.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

반응형