将 str2date 与还包含时间的字符串一起使用

Using str2date with strings that also contain a time

我有一个方法,给定一个在内部文本中包含 ISO 8601 日期的 .NET XmlNode,将其转换为 X++ date 对象。

if (CLRInterop::isInitialized(childNode))
{
    return str2Date(childNode.innerText(), 321);
}
else return maxDate();

如果提供一个包含 日期的字符串(例如:2019-03-21),这会很好用,但是一旦此字符串中还提供了时间 (例如:2019-03-21T00:00:00),它将return什么都没有。

最简单的解决方法是去除前 10 个字符之后的所有内容,但如果由于某种原因该字符串仅包含 2 个字符,这将再次中断。在调用 str2date?

时是否有更可靠的方法来处理字符串,包括时间

我只是用一堆例子写了这篇文章。第一行可能就是你想要的。您可以在 AX 中将其创建为一个新作业,然后在第一行放置一个断点并逐步执行每个断点以查看会发生什么,或者修改以进行实验。

看起来你的字符串是标准的 ISO 格式,我也在下面介绍了各种方式。

static void DateTimeJob(Args _args)
{
    // This line looks about what you want
    utcDateTime     utcDateTimeFromString   = DateTimeUtil::anyToDateTime("2019-03-21T00:00:00");

    // ISO standard format. You can just assign it directly without quotes
    utcDateTime     utcDateTimeISOFormat = 2019-03-21T00:00:00;

    // Misc vars for below
    utcDateTime     utcNow;
    System.DateTime systemDateTime;
    date            dateOnly;
    str             systemDateTimeStr;

    // Look at
    // DateTimeUtil::<> // This has all sorts of useful functions
    // str2datetime() // May be useful to you
    try
    {
        // How to go from AX UTC to System.DateTime
        systemDateTime      = Global::utcDateTime2SystemDateTime(DateTimeUtil::utcNow());

        // How to go from System.DateTime to AX UTC
        utcNow              = Global::clrSystemDateTime2UtcDateTime(System.DateTime::get_UtcNow());

        // How to get ONLY the date portion from a UTC
        dateOnly            = DateTimeUtil::date(utcNow);

        // Cast to string for output
        systemDateTimeStr   = systemDateTime.ToString();

        // Output a few examples
        info(strFmt("%1, %2, %3",
                    systemDateTimeStr,
                    utcNow,
                    dateOnly));
    }
    catch (Exception::CLRError)
    {
        error(AifUtil::getClrErrorMessage());
    }    
}