我有一种方法,给定.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
时的时间?
答案 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());
}
}