什么是AIF transfomrmations的有效UTCDateTime类型字符串格式?

时间:2014-06-12 09:50:04

标签: c# utc datetime-format aif

我正在尝试编写一个.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求助。

3 个答案:

答案 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)