1

我正在尝试编写一个 .net 类,将一段 xml 转换为 AX UtcDateTime 类型。该类用于入站转换。

原始xml:

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

我生成的 xml 导致 exeptionlog 中出现异常:

“值 '2014-06-12T12:52:00+02:00' 不是有效的 UtcDateTime 类型。”

我认为 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 的情况,我使用了类似的方法。

问题 i 由于在我必须开发代码的环境中禁用了热插拔,我的测试可能性有限。所以我想确定格式。

感谢您的帮助。

4

3 回答 3

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> 
于 2014-07-30T14:18:52.427 回答
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 将是 <WorkerStartDate>2015-05-12T13:00:00Z</WorkerStartDate>,假设您在运行 .net 代码的计算机上比 GMT 晚 5 小时。AX 数据库也将存储值 2015-05-12T13:00:00Z。

于 2015-10-07T22:09:55.247 回答
0
<dyn:StartDate>2014-06-22T00:00:00.000+02:00</dyn:StartDate>

这种格式总是对我有用。(注意毫秒)

于 2014-06-26T08:15:40.227 回答