Использование str2date со строками, которые также содержат время - PullRequest
0 голосов
/ 21 марта 2019

У меня есть метод, который, учитывая .NET XmlNode, содержащий дату ISO 8601 во внутреннем тексте, преобразует его в объект X ++ date.

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

Это прекрасно работает, еслипредоставил строку, которая содержит только дату (например: 2019-03-21), но как только в этой строке также будет указано время (например: 2019-03-21T00:00:00), он ничего не вернет.

Самым простым решением для этого было бы просто убрать все после первых 10 символов, но это снова сломалось бы, если бы по какой-то причине строка содержала только 2 символа за год.Есть ли более надежный способ обработки строк, включая время при вызове str2date?

1 Ответ

3 голосов
/ 21 марта 2019

Я только что написал эту работу с кучей примеров.Самая первая строка может быть тем, что вы хотите.Вы можете просто создать это как новое задание в 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());
    }    
}
...