C++ Builder/TDateTime > from/to[새 원호] 변환 처리 > .NET Framework 관련 처리에서 VarToDateTime()이 제대로 작동하지 않기 때문에 자전 변환했다

운영 환경
C++ Builder XE4
Windows 7 pro (32bit)
.NET Framework: v4.5.1を有効化

VarToDateTime의 추가 원호에 대한 대응 정보 @ Delphi freeml

이전 준비



레지스트리에 새로운 원호를 등록한다.
"우주_우_Uchyu_U"로 했다.



v0.1 > 오류



code



FormatDateTime()과 VarToDateTime()로 구현.

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TDateTime startdt = VarToDateTime("2017/01/11 12:30:45");

    String strdt = FormatDateTime(L"ggee年mm月dd日", startdt);
    OutputDebugString(strdt.c_str());
    int nop1=1;

    TDateTime backdt = VarToDateTime(strdt);
    int nop2=1;

    OutputDebugString( DateTimeToStr(backdt).c_str() );
}
//---------------------------------------------------------------------------

실행



FormatDateTime() 부분에서는 레지스트리의 정보가 사용되고 있다.
VarToDateTime() 부분에서 다음 오류가 발생했습니다.



관련 정보



htps : // 소시아 l. msd 응. 미 c 로소 ft. 코 m/후우 ms/쟈-JP/아 93에 c79d-69아 5-4b b--아 5d-8 아 bfdcb9d/sys로 mg 흠 m = tfx 게네라 l
보면

설명된 대로 Windows 7 이상에서 네이티브 앱 또는 .NET 4.0을 사용한 경우에만 작동합니다. 손으로 레지스트리를 설정하고 시도했지만 Windows 10 + .NET 3.5에서도 새로운 원호가 표시되지 않았습니다. (Windows 10+.NET 4 이상에서는 표시되었습니다.)

C++ Builder XE4로 구현한 것은 .NET Framework와는 관계없을까 생각하고 있다.
그 때문에, 상기의 코멘트와 같이 설정한 레지스트리의 캐릭터 라인은 사용되고 있지 않는 (또는 올바르게 동작하지 않는) 것일 것이다.

v0.2 > 자전 변환



Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

static const TDate kDate_startNewEra = VarToDateTime("2016/01/01");


void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TDateTime startdt = VarToDateTime("2017/01/11 12:30:45");

    String strdt = FormatDateTime(L"ggee年mm月dd日", startdt);
    OutputDebugString(strdt.c_str());

    TDateTime backdt;
    try {
        backdt = VarToDateTime(strdt);
    } catch (...) {
        // Not (.NET Framework 4 or native)
        String wrk = strdt.SubString(3, MAXINT); // 元号2文字を除去
        int startYear = kDate_startNewEra.FormatString(L"YYYY").ToInt();
        int addYear = startYear - 2000 - 1;
        backdt = VarToDateTime(wrk);
        backdt = IncYear(backdt, addYear);
    }

    OutputDebugString( DateTimeToStr(backdt).c_str() );
}
//---------------------------------------------------------------------------

결과
デバッグ出力: 宇宙02年01月11日 プロセス Project1.exe (3668)
デバッグ出力: 2017/01/11 プロセス Project1.exe (3668)

역기로 변환할 수 있었다.

더 나은 구현은 다른 사람들에게 유래한다.

좋은 웹페이지 즐겨찾기