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)
역기로 변환할 수 있었다.
더 나은 구현은 다른 사람들에게 유래한다.
Reference
이 문제에 관하여(C++ Builder/TDateTime > from/to[새 원호] 변환 처리 > .NET Framework 관련 처리에서 VarToDateTime()이 제대로 작동하지 않기 때문에 자전 변환했다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/d6dadd3364362a2ea55d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)