【问题标题】:What are valid UTCDateTime type string formats for AIF transfomrmations?AIF 转换的有效 UTCDateTime 类型字符串格式是什么?
【发布时间】:2014-06-12 09:50:04
【问题描述】:

我正在尝试编写一个 .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 由于在我必须开发代码的环境中禁用了热插拔,我的测试可能性有限。所以我想确定格式。

感谢您的帮助。

【问题讨论】:

    标签: c# utc datetime-format aif


    【解决方案1】:

    我终于让它工作了。我的解决方案:

    //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 sn-p:

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

    【讨论】:

      【解决方案2】:

      我发现这更容易。如果您希望将特定日期时间(例如 2015 年 1 月 31 日上午 8:00)存储在 AX 中,实现它的 .net 代码将是

      日期时间 utcDateTime = new DateTime(2015, 1, 31, 8, 0, 0).ToUniversalTime();

              var workerStartDate = new AxdExtType_HcmEmploymentStartDateTime
              {
                  Value = utcDateTime
              };
      

      生成的 XML 将是 2015-05-12T13:00:00Z,假设您在运行 .net 代码的计算机上比 GMT 晚 5 小时。 AX 数据库也将存储值 2015-05-12T13:00:00Z。

      【讨论】:

        【解决方案3】:
        <dyn:StartDate>2014-06-22T00:00:00.000+02:00</dyn:StartDate>
        

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

        【讨论】:

        • 今天我添加了毫秒。太糟糕了,我仍然得到:值 '2013-12-28T14:15:00.001+01:00' 不是有效的 'UtcDateTime' 类型。
        猜你喜欢
        • 1970-01-01
        • 2021-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        • 2020-10-24
        • 2010-10-29
        相关资源
        最近更新 更多