将 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());
}
}
我有一个方法,给定一个在内部文本中包含 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());
}
}