一种可能的解决方案是使用系统时间格式化程序(如:_tcsftime、strftime、wcsftime)将日期/时间结构格式化为运行系统的区域设置。由于您的程序和 excel 都应该在同一台 PC 上运行,因此它应该可以正常工作,甚至不知道本地日期/时间字符串的样子。
作为一种备用解决方案,您可能必须在程序的选项配置部分提供一系列硬编码格式字符串和/或用户手动输入的字符串,以防默认语言环境格式失败。
OP首次回复评论后的其他信息:--------------
区域设置仅影响 UI 中 datetime-binary-object 的文本显示呈现。这样的日期时间二进制对象总是以非常一致的方式存储为二进制结构,无论区域设置如何,即使在其每个不同的上下文中,无论是在 Excel(日期/时间格式单元格),C++(各种结构取决于 api) ,VisualBasic(变体)。
因此,如果您的意图是将日期时间二进制结构导出到 excel,而不是作为字符串,则始终可以使用“变体”类型来存储日期值,因为 excel-automation 使用 IDispatch 接口。您可以完全忘记语言环境设置。
添加代码片段以导出日期时间变量并按代码格式化单元格:----------------
我使用的是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...");