我正在尝试编写一个.net类,它将一段xml转换为AX UtcDateTime类型。 该类用于入站转换。
原始xml:
<DateTime>
<Date>2014-06-12</Date>
<Time>10:52:00</Time>
<Zone>+02:00</Zone>
</DateTime>
我得到的xml导致了exeptionlog中的一个exeption:
&#34;价值&#39; 2014-06-12T12:52:00 + 02:00&#39;不是有效的UtcDateTime类型。&#34;
我认为AIF期望Z在值的末尾,并且我不确定localDateTime是否是强制性的,或者是否需要毫秒。
我想知道如何将转换后的xml中的UtcDateTime字段格式化为AIF接受。
像这样:
<MessageHeaderDateTime localDateTime="2014-06-12T10:52:00+02:00">2014-06-12T08:52:00Z</MessageHeaderDateTime>
或者像这样:
<MessageHeaderDateTime localDateTime="2014-06-12T10:52:00.1108723+02:00">2014-06-12T08:52:00.1108723Z</MessageHeaderDateTime>
还是缺少其他东西?
我的代码
DateTime netdttm = new DateTime(year, month, day, hour, minute, second, DateTimeKind.Utc);
TimeSpan timespan = new TimeSpan(zhour, zminute, 0);
DateTime netdttmoffset = netdttm.Subtract(timespan);
datetime.Value = netdttmoffset;
datetime.localDateTime = netdttmoffset.ToLocalTime();
datetime.localDateTimeSpecified = true;
对于我使用utcnow的情况,我使用类似的appraoch。
问题我的测试可能性有限,因为热交换在我必须开发代码的环境中被破坏了。所以我想确定格式化。
Thanx求助。
答案 0 :(得分:2)
我终于开始工作了。我的解决方案:
//declare the AX utcdatetime type from the cs class generate with:
//xsd C:\...\SharedTypes.xsd C:\..\AIFschema.xsd /Classes /Out:C:\location\of\csfile\
AxType_DateTime datetime = new AxType_DateTime();
//Ax store the time in GMT with an optional local time. My XML can have any timezone.
datetime.timezone = AxdEnum_Timezone.GMT_COORDINATEDUNIVERSALTIME;
//I set this to false as i am not interested in actually storing the local time. Plus AX fails over the formatting .net returns.
datetime.timezoneSpecified = false;
//{... left out code to retrieve the hours, minutes etc from my XML}
//declare the .net datetime variable with the values from the xml:
DateTime netdttm = new DateTime(year, month, day, hour, minute, second, millisecond, DateTimeKind.Utc);
DateTime netdttmoffset = new DateTime();
// (optional field) <zone>+01:00</zone>
if (message.Header.DateTime.Zone != null)
{
{... left out code to retrive zone offset info from xml}
TimeSpan timespan = new TimeSpan(zhour, zminute, 0);
netdttmoffset = netdttm.Subtract(timespan);
}
else //no zone, so datetime == GMT datetime.
{
netdttmoffset = netdttm;
}
datetime.Value = netdttmoffset;
datetime.localDateTime = netdttmoffset.ToLocalTime();
//do not output to xml, or AX will fail over this.
datetime.localDateTimeSpecified = false;
AX接受的结果xml片段:
<MessageHeaderDateTime>2014-07-30T16:41:10.001Z</MessageHeaderDateTime>
答案 1 :(得分:1)
我发现这更容易。如果你想要一个特定的日期时间,比如2015年1月31日上午8:00,要存储在AX中,那么实现它的.net代码将是
DateTime utcDateTime = new DateTime(2015,1,31,8,0,0).ToUniversalTime();
var workerStartDate = new AxdExtType_HcmEmploymentStartDateTime
{
Value = utcDateTime
};
生成的XML将是&lt; WorkerStartDate&gt; 2015-05-12T13:00:00Z&lt; / WorkerStartDate&gt ;,假设您在运行.net代码的计算机上落后GMT 5小时。 AX数据库也将存储值2015-05-12T13:00:00Z。
答案 2 :(得分:0)
<dyn:StartDate>2014-06-22T00:00:00.000+02:00</dyn:StartDate>
这种格式总是对我有用。 (注意ms)