【问题标题】:Unreliable DateTime parsing by COleDateTimeCOleDateTime 不可靠的 DateTime 解析
【发布时间】:2021-05-21 09:37:34
【问题描述】:

我正在尝试使用COleDateTime 类提供的ParseDateTime 方法解析日期。但是在同一个程序中解析两个不同的日期会返回不一致的月份值。

代码片段:

COleDateTime dtCreated;
dtCreated.ParseDateTime(safe_cast<CString>(strCreatedDate));

结果不一致:

如果strCreatedDate = "10/7/2020"(mm.dd.yyyy 格式) 然后dtCreated.GetMonth() = 7 (但应该是 10)

如果strCreatedDate = "7/29/2020"(mm.dd.yyyy 格式) 然后dtCreated.GetMonth() = 7(在这种情况下,它是正确

更新:

strCreatedDate 变量中的日期值可以是“dd.mm.yyyy”或“mm.dd.yyyy”格式。但我确实在单独的变量中提供了有关可用数据格式的信息。根据格式,我希望 COleDateTime 正确解析 DateTime 字符串。我该怎么做?

【问题讨论】:

  • 尝试使用LCID参数。
  • @Dialectus:我确实在另一个变量中提供了有关日期格式(dd.mm.yyyy 或 mm.dd.yyyy)的信息。我可以以某种方式指定用于ParseDateTime() 的正确格式吗?日期是从服务器接收的,它可以是(dd.mm.yyyy OR mm.dd.yyyy)格式。
  • 好的,如果你有一个布尔值,并且你只有一个基于该布尔值的精确格式,然后用sscanf 自己解析日期,或者你想要的任何其他东西。你得到三个值,然后用它们调用SetDateTime
  • 日期和时间解析器有产生unexpected results 的历史。这不是我会依赖的东西。我可能只是编写自己的解析器,实际上只是一个字符串拆分,然后是 stoi 系列函数之一的 3 个应用程序。
  • 顺便说一句,strCreatedDate 是一个什么样的对象?这个safe_cast 在这个问题中看起来不合适。

标签: c++ mfc ole coledatetime


【解决方案1】:

由于String^ 是您的输入,您可以使用DateTime::ParseExact,然后使用DateTime.ToOADateDateTime 转换为COleDateTime

COleDateTime dtCreated(DateTime::ParseExact(
    strCreatedDate, isDMY ? "d.M.yyyy" : "M.d.yyyy", nullptr).ToOADate());

【讨论】:

  • 当问题是关于 Visual C++/MFC 的时候,你为什么要用托管 C++/CLI 来回答?!
  • @sergiol 因为 OP 在 cmets 中提到 strCreateDateString^,当您在问题中注意到 safe_cast 时,这是合乎逻辑的。虽然问题本身可以严格按照 MFC 来查看和回答,但也可以按照 C++/CLI + MFC 来查看和回答。我选择了后者。
  • String^ 可能是 C++/CLI 或 C++/CX。这些是完全不同的平台、运行时和支持库。
  • 我的源字符串 (String^ strCreateDate) 确实在 C++/CLI 中。但是有了这个实现,它会抛出一个异常,{"String was not recognized as a valid DateTime."}
  • 好的,问题cmets被折叠了,我没看到。我也可以从问题的safe_cast 中推断出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2018-12-26
  • 2021-12-04
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
相关资源
最近更新 更多