Search code examples
c#utcdatetime-formataif

What are valid UTCDateTime type string formats for AIF transfomrmations?


Im am trying to write a .net class that transforms a piece of xml to a AX UtcDateTime type. The class is used in an inbound transformation.

Original xml:

<DateTime>
<Date>2014-06-12</Date>
<Time>10:52:00</Time>
<Zone>+02:00</Zone>
</DateTime>

My resulting xml leads to an exeption in the exeptionlog:

"The value '2014-06-12T12:52:00+02:00' is not a valid UtcDateTime type."

I think AIF expect the Z at the end of the value, and I am not sure if the localDateTime is mandatory and or if the milliseconds are a requirement.

I would like to know how the UtcDateTime field in transformed xml should be formatted to be accepted by AIF.

Like so:

<MessageHeaderDateTime localDateTime="2014-06-12T10:52:00+02:00">2014-06-12T08:52:00Z</MessageHeaderDateTime>

or like so:

<MessageHeaderDateTime localDateTime="2014-06-12T10:52:00.1108723+02:00">2014-06-12T08:52:00.1108723Z</MessageHeaderDateTime>

or are other things missing?

My Code

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;

I use a similar appraoch for the case where I use utcnow.

Problem i that I have limited testing possibilities due to hot-swapping being disbled in the environment where I have to develop my code. So I would like to be certainin about the formatting.

Thanx for your help.


Solution

  • I finally got it to work. My solution:

    //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;
    

    Result xml snippet as accepted by AX:

    <MessageHeaderDateTime>2014-07-30T16:41:10.001Z</MessageHeaderDateTime>