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

时间:2019-03-20 23:12:27

标签: axapta x++ dynamics-ax-2012

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

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

如果提供了仅包含日期的字符串(例如:2019-03-21),但是在此字符串中还提供了时间(例如:{{1 }}),它什么也不会返回。

最简单的解决方法是删除前10个字符后的所有内容,但是如果由于某种原因该字符串仅包含年份的2个字符,则会再次中断。有没有更健壮的方式来处理字符串,包括在调用2019-03-21T00:00:00时的时间?

1 个答案:

答案 0 :(得分:3)

我只是用大量示例编写了这份工作。第一行可能就是您想要的。您可以在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());
    }    
}