【问题标题】:Converting string to TDateTime in C++Builder 2009在 C++Builder 2009 中将字符串转换为 TDateTime
【发布时间】:2017-10-17 12:25:02
【问题描述】:

我尝试使用 C++Builder 2009 将特定格式的字符串转换为 TDateTime

TDateTime dt, dt2;
TFormatSettings FS, FS2;

UnicodeString datestring = "17/10/2017 13:24:33";
UnicodeString datestring2 = "2017.17.10 13:24:33";

FS.DateSeparator = '/';
FS.ShortDateFormat = "dd/mm/yyyy";
FS.LongTimeFormat = "hh:nn:ss";
FS.TimeSeparator = ':';

FS2.DateSeparator = '.';
FS2.ShortDateFormat = "yyyy.dd.mm";
FS2.LongTimeFormat = "hh:nn:ss";
FS2.TimeSeparator = ':';

try{
    dt = StrToDateTime(datestring, FS);
    dt2 = StrToDateTime(datestring2,FS2);
}catch(EConvertError& e)
{
    int a = 2;
}

dt 的转换没问题,但是dt2 的转换抛出异常:

''2017.17.10 13:24:33'' 不是有效的日期和时间

【问题讨论】:

  • 非常奇怪的日期格式,但您的测试用例的等效 Delphi 版本适用于 FPC:ideone.com/Pr9ROO。现在无法检查真正的 Delphi 在做什么。
  • 是的。在 Lazarus 1.6.4 上工作正常,但在 C++ Builder 2009 上 reise 异常:(
  • 您正在声明TFormatSettings 变量,但在自定义它们的字段之前,您没有使用默认值初始化它们。您必须使用TFormatSettings::Create()GetLocaleFormatSettings() 初始化它们。另外仅供参考,StrToTime()(并且通过扩展,StrToDateTime() 不使用LongTimeFormat

标签: c++ c++builder vcl tdatetime c++builder-2009


【解决方案1】:

根据StrToDate() 的文档(也适用于StrToDateTime()):

S 必须由两个或三个数字组成,由DateSeparator 全局变量或其等效TFormatSettings 定义的字符分隔。月、日和年的顺序由ShortDateFormat 全局变量或其等效TFormatSettings 确定--可能的组合为 m/d/y、d/m/y 和 y/m/d

失败的日期是y/d/m 格式,这些 RTL 函数不支持这种格式。有效日期为d/m/y 格式,受支持。

【讨论】:

  • 好的,但是 Windows 支持格式 yyyy.dd.mm - 是否可以在 Delphi/C++ 中执行此操作而无需编写我自己的解析日期时间字符串的实现? ofc这个函数我可以写,但是我想先用一些已有的lib or api。
  • @lukas.gab RTL 不使用操作系统 API 来解析字符串,它是手动完成的。您必须自己解析不受支持的格式
  • 好的,谢谢您的帮助。 @hvd 给我们在 fpc 中的例子,这是可行的。 fpc 的 Doc 也只指定了三种格式,比如 delphi doc。这意味着,fpc,有bug还是UB?这应该是 fpc 中的 EConvertError 异常?
【解决方案2】:

谢谢大家!

好的,现在我知道,StrToDateTime 不支持这种日期格式。此问题的解决方案是,将 Windows ShortDateFormat 和 LongTimeFormat 转换并合并为 strptime() 从 time.h 接受的格式字符串。然后我使用 strptime() 并从 time.h 的tm struct 创建 TDateTime。我尝试链接文档,但是在文档中没有任何 strptime 函数。我在 CodeGear RTL 版本 13 中的 time.h 中找到了这个函数。我认为这相当于 strptime

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2023-04-06
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多