1

XML の一部を AX UtcDateTime 型に変換する .net クラスを作成しようとしています。クラスはインバウンド変換で使用されます。

元の XML:

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

私の結果のxmlは、例外ログの例外につながります:

「値 '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 に答える