我有一个方法,给定一个在内部文本中包含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
),它就不会返回任何内容。
对此最简单的解决方法是将所有内容都删除前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());
}
}