考えられる解決策の 1 つは、システム時刻フォーマッター (_tcsftime、strftime、wcsftime など) を使用して、実行中のシステムのロケールに合わせて日付/時刻構造をフォーマットすることです。プログラムと Excel の両方が同じ PC で実行されることが想定されているため、ローカルの日付/時刻文字列がどのように見えるかを知らなくても、正しく動作するはずです。
デフォルトのロケール形式が失敗した場合に備えて、フォールバック ソリューションとして、一連のハードコードされた形式文字列および/またはユーザーが手動で入力した文字列をプログラムのオプション構成セクションに提供する必要がある場合があります。
OPからの最初の返信コメント後の追加情報: --------------
locale 設定は、UI でのみ datetime-binary-object のテキスト表示プレゼンテーションに影響します。このような datetime-binary-object は、Excel (日付/時刻形式のセル)、C++ (さまざまな構造が api に依存する) など、それぞれ異なるコンテキストであっても、ロケール設定に関係なく、常に非常に一貫した方法でバイナリ構造として格納されます。 、VisualBasic (バリアント)。
そのため、datetime バイナリ構造を strng としてではなく Excel にエクスポートする場合は、excel-automation が IDispatch インターフェイスを使用するため、いつでも「バリアント」型を使用して日付値を格納できます。ロケール設定を完全に忘れることができます。
datetime バリアントをエクスポートし、コードでセルをフォーマットするためのコード フラグメントの追加: ----------------
私は MFC を使用しているため、コードは非常に単純です。自分で winapi に変換する必要がある場合があります。
_Application app;
if (!app.CreateDispatch("Excel.Application"))
{ AfxMessageBox("Cannot start Excel !");
return;
}
app.SetVisible(TRUE);
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
Workbooks objbooks = app.GetWorkbooks();
_Workbook objbook = objbooks.Add(VOptional);
Worksheets objsheets = objbook.GetWorksheets();
_Worksheet objsheet = objsheets.GetItem(COleVariant((short)1));
// get current date time
COleDateTime timeCurrent = COleDateTime::GetCurrentTime();
// setting date values
Range range;
range = objsheet.GetRange(COleVariant("A2"), COleVariant("B3"));
range.SetValue(COleVariant(timeCurrent));
// range.SetNumberFormat(COleVariant("dd/mm/yyyy"));
range.SetNumberFormat(COleVariant("dddd, mmmm dd, yyyy"));
AfxMessageBox("Done...");