Reinhard在AIF中使用DateTime作为服务契约的参数,与DotNet程序进行交互时,总是因为时区的问题,导致DotNet提交的System.DateTime与AIF中接收的DateTime 不一致。

这个问题着实困扰了Reinhard 许久。为了解决这个问题,Reinhard这次专门写一篇博文,通过一系列的实验,找到通过AIF服务契约,对DateTime进行存储、获取、比较的最佳方式。

1、DateTime存储实验

在AX中,Reinhard写了三个存储DateTime方法,分别测试了System.DateTime和UtcDateTime作为服务契约参数的不同情况。这三个服务契约如下:

[SysEntryPointAttribute]

public void saveSystemDateTime(System.DateTime _dt)

{

ReinhardTest_Table table;

table.UtcDateTime=_dt;

table.insert();

}

[SysEntryPointAttribute]

public void saveSystemDateTime2(System.DateTime _dt)

{

ReinhardTest_Table table;

table.UtcDateTime=Global::clrSystemDateTime2UtcDateTime( _dt);

table.insert();

}

[SysEntryPointAttribute]

public void saveUtcDateTime( utcDateTime _utcDateTime)

{

ReinhardTest_Table table;

table.UtcDateTime=_utcDateTime;

table.insert();

}

接着,在VS中,Reinhard调用这三个服务契约,分别存储三个不同的System.DateTime实例,看哪个服务契约能够正确地存储DateTime。这三个日期分别是:

DateTime saveSystemDateTimeDT = new DateTime(2013, 3, 3, 3, 3, 3);

DateTime saveSystemDateTime2DT = new DateTime(2014, 4, 4, 4, 4, 4);

DateTime saveUtcDateTimeDT = new DateTime(2015, 5, 5, 5, 5, 5);

调用完毕后,到AX中,查看ReinhardTest_Table中保存的日期。

Reinhard发现,只有SaveUtcDateTime这个服务契约,正确保存了DotNet中System.DateTime的值。

结论:正确的日期存储方式是SaveUtcDateTime。

2、DateTime对比实验

在AX中,Reinhard写了两个比较DateTime方法,分别测试了System.DateTime和UtcDateTime作为服务契约参数的不同情况。这两个服务契约如下:

[SysEntryPointAttribute]

public boolean compareUtcDateTime(utcDateTime _utcDateTime)

{

ReinhardTest_Table table;

    select table order by table.UtcDateTime desc;

    return table.UtcDateTime==_utcDateTime;

}

[SysEntryPointAttribute]

public boolean compareSystemDateTime(System.DateTime _dt)

{

ReinhardTest_Table table;

    utcDateTime dt= Global::clrSystemDateTime2UtcDateTime(_dt);

    select table order by table.UtcDateTime desc;

    return table.UtcDateTime==dt;

}

这里,Reinhard选择了ReinhardTest_Table表中的最后一条记录,进行比较,也就是2015-05-05 05:05:05那条。

接着,在VS中,Reinhard调用这两个服务契约,与同一个System.DateTime实例做比较,这个DateTime是:

DateTime saveUtcDateTimeDT = new DateTime(2015, 5, 5, 5, 5, 5);

这个DateTime其实就是Reinhard在第一个实验中,最后一个保存的那个DateTime。不出意外的话,它应该与ReinhardTest_Table表中的最后一条记录是等价的。那么,我们来看看调用的结果吧。

Reinhard发现,只有CompareUtcDateTime这个服务契约,正确比较了DotNet中System.DateTime与AX中UtcDateTime的值。

    结论:正确的日期比较方式是CompareUtcDateTime。

3、DateTime获取实验

在AX中,Reinhard写了七个获取DateTime方法,分别测试了System.DateTime和UtcDateTime作为服务契约返回值的不同情况。这七个服务契约如下:

[SysEntryPointAttribute]

public utcDateTime getUtcDateTime()

{

ReinhardTest_Table table;

    select table order by table.UtcDateTime desc;

    return table.UtcDateTime;

}

[SysEntryPointAttribute]

public utcDateTime getUtcDateTime2()

{

ReinhardTest_Table table;

    select table order by table.UtcDateTime desc;

    return DateTimeUtil::applyTimeZoneOffset(table.UtcDateTime ,DateTimeUtil::getUserPreferredTimeZone());

}

[SysEntryPointAttribute]

public utcDateTime getUtcDateTime3()

{

ReinhardTest_Table table;

    str strDT;

    select table order by table.UtcDateTime desc;

    return DateTimeUtil::applyTimeZoneOffset(table.UtcDateTime ,DateTimeUtil::getCompanyTimeZone());

}

[SysEntryPointAttribute]

public System.DateTime getSystemDateTime()

{

ReinhardTest_Table table;

    select table order by table.UtcDateTime desc;

    return table.UtcDateTime;

}

[SysEntryPointAttribute]

public System.DateTime getSystemDateTime2()

{

ReinhardTest_Table table;

    select table order by table.UtcDateTime desc;

    return DateTimeUtil::removeTimeZoneOffset(table.UtcDateTime,DateTimeUtil::getCompanyTimeZone());

}

[SysEntryPointAttribute]

public System.DateTime getSystemDateTime3()

{

ReinhardTest_Table table;

System.DateTime dt;

    utcDateTime utcDT;

    select table order by table.UtcDateTime desc;

utcDT=DateTimeUtil::removeTimeZoneOffset(table.UtcDateTime,DateTimeUtil::getCompanyTimeZone());

dt=Global::utcDateTime2SystemDateTime(utcDT);

    return dt;

}

[SysEntryPointAttribute]

public System.DateTime getStringDateTime4()

{

ReinhardTest_Table table;

    str strDT;

    select table order by table.UtcDateTime desc;

strDT = DateTimeUtil::toStr(table.UtcDateTime);

    return System.DateTime::Parse(strDT);

}

这里,Reinhard同样选择了ReinhardTest_Table表中的最后一条记录,将其返回给DotNet,也就是2015-05-05 05:05:05那条。

接着,在VS中,Reinhard调用这七个服务契约,看看他们返回给DotNet的Date
Time:

Reinhard发现,只有GetUtcDateTime2和GetUtcDateTime3这个两个服务契约,给DotNet返回了正确的DateTime。

结论:正确的日期获取方式是GetUtcDateTime2和GetUtcDateTime3。

4、总结

下面,Reinhard对通过AIF服务契约,进行DateTime存储、获取、比较的正确方式,进行总结。

4.1、DateTime存储

[SysEntryPointAttribute]

public void saveUtcDateTime( utcDateTime _utcDateTime)

{

ReinhardTest_Table table;

table.UtcDateTime=_utcDateTime;

table.insert();

}

4.2、DateTime对比

[SysEntryPointAttribute]

public boolean compareUtcDateTime( utcDateTime _utcDateTime)

{

ReinhardTest_Table table;

    select table order by table.UtcDateTime desc;

    return table.UtcDateTime==_utcDateTime;

}

4.3、DateTime获取

[SysEntryPointAttribute]

public utcDateTime getUtcDateTime2()

{

ReinhardTest_Table table;

    select table order by table.UtcDateTime desc;

    return DateTimeUtil::applyTimeZoneOffset(table.UtcDateTime ,DateTimeUtil::getUserPreferredTimeZone());

}

[SysEntryPointAttribute]

public utcDateTime getUtcDateTime3()

{

ReinhardTest_Table table;

    str strDT;

    select table order by table.UtcDateTime desc;

    return DateTimeUtil::applyTimeZoneOffset(table.UtcDateTime ,DateTimeUtil::getCompanyTimeZone());

}

这次,Reinhard就分享到这里。如果同学们遇到什么问题,也欢迎和Reinhard沟通交流。

Dynamics AX 2012 R2 在AIF服务契约中使用DateTime的更多相关文章

  1. Dynamics AX 2012 R2 安装 AIF IIS上的Web服务

    1.为什么使用IIS上的WEB服务 组件? 如果你要在Dynamics AX Service中使用HTTP Adapter,那么你就要安装IIS上的WEB服务 组件.HTTP Adapter会在IIS ...

  2. Dynamics AX 2012 R2 SSRS报表在VS2010中预览没有数据

    今天,Reinhard 在VS中制作SSRS报表,预览的时候发现显示不出数据. 仔细检查了数据处理环节和临时表里的数据,都发现没有问题. 用同事的账号登陆同样的开发环境,发现他的账号可以在VS中预览到 ...

  3. Dynamics AX 2012 R2 安装Reporting Services 扩展

    今天Reinhard在VS中部署SSRS报表时,接到以下错误: 部署因错误而被取消.在报表服务器上,验证:-SQL Server Reporting Services 服务是否正在运行. 接着,Rei ...

  4. Dynamics AX 2012 R2 如何处理运行时间较长的报表

    当处理的数据量较多,逻辑比较复杂时,报表可能会超时.为了解决这个问题,Reinhard一直使用SrsReportDataProviderPreProcess来做预处理报表.它会在调用SSRS前,在AX ...

  5. Dynamics AX 2012 R2 电子邮件广播错误 0x80040213

    Dynamics AX 2012 R2 电子邮件广播错误 0x80040213 今天Reinhard在新环境做邮件广播测试时,发现无法发送邮件,并报以下错误: 类"CDO.Message&q ...

  6. Dynamics AX 2012 R2 安装额外的AOS

    众所周知,AX系统分为三层:Client,Application Server,Database Server. 我们添加额外的Application Server主要是出于以下两个原因: 使用多台服 ...

  7. Dynamics AX 2012 R2 AIF 内部异常

        今天,Reinhard发现某个入站端口,突然一直报错: The server was unable to process the request due to an internal erro ...

  8. Dynamics AX 2012 R2 Service Middle Tier WCF WCF转发

    参考了蒋金楠老师08年的文章.好吧,那时候我才大二.大三,大神果然是大神. http://www.cnblogs.com/artech/archive/2008/09/01/1280939.html ...

  9. Dynamics AX 2012 R2 业务系列-销售业务流程

    在博文Dynamics AX R2 业务系列中,Reinhard对这个系列做了一个规划,下面我们就按照规划开始说业务吧. 1.销售的主要职责 其实这里说的职责主要是针对销售文员,并非整天外面满世界跑业 ...

随机推荐

  1. Odoo 动态设置树形视图列表中的字段

    依赖第三方模块实现,实现效果图如下: 原模块只有9.0版本 ,今改成了8.0版本. git地址见群内公告.

  2. zk jquery的使用

    jQuery_effects.zul: <?page title="Jquery" contentType="text/html;charset=UTF-8&quo ...

  3. thinkphp框架3.2的cookie删除问题记录

    在使用框架删除cookie时,发现cookie(null)不起作用.后来查看官网相关信息,看到了讨论http://www.thinkphp.cn/bug/2602.html

  4. Emule Xtreme Kid eD2K 设置

    设置udp和tcp端口: 测试结果必须为通过,若不通过, 1.请将主机ip丢入路由器DMZ区(设置将以上端口与本机ip地址绑定) 2.在windows防火墙中加入以上端口允许通行项 测试结果: 其它一 ...

  5. js闭包初体验

      /* 闭包的定义:一个内部函数里变量作用域生命周期延续,直接访问一个函数里面的私有属性 闭包的作用:解决变量作用域延续的问题,同时解决全局变量冲突的问题 */ //1.定义内部函数,私有函数 fu ...

  6. window svn backup.bat

    help command /? call /? %cd% 可以用在批处理文件中,也可以用在命令行中:展开后,是驱动器盘符:+当前目录,如在dos窗口中进入c:\dir目录下面, %0代指批处理文件自身 ...

  7. firebox httprequester 模拟请求

    获取下载插件 httprequester 模拟POST请求,必须点击Parameter Body 参数写法:abc=123&id=456 也可以选择Headers栏目添加

  8. java中内部类使用小结

    内部类是指在一个外部类中再定义一个类,类名不需要和文件名相同 内部类可以是静态的,类的修饰符可以是private,default,protect,public修饰 ,而外部类只能是public 和 d ...

  9. Python强化训练笔记(三)——词频的统计

    现有列表如下: [6, 7, 5, 9, 4, 1, 8, 6, 2, 9] 希望统计各个元素出现的次数,可以看作一个词频统计的问题. 我们希望最终得到一个这样的结果:{6:2, 7:1...}即 { ...

  10. Oracle 10g ORA-01034: ORACLE not available 错误

    今天在开发系统的时候,刚开始还好好的,突然就遇到了一个错误 ORA-01034: ORACLE not available 感到莫名其妙.然后排查问题 监听器ok,各项服务ok. 最后解决办法如下: ...