Dynamics AX 2012 R2 在AIF服务契约中使用DateTime

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的更多相关文章
- Dynamics AX 2012 R2 安装 AIF IIS上的Web服务
1.为什么使用IIS上的WEB服务 组件? 如果你要在Dynamics AX Service中使用HTTP Adapter,那么你就要安装IIS上的WEB服务 组件.HTTP Adapter会在IIS ...
- Dynamics AX 2012 R2 SSRS报表在VS2010中预览没有数据
今天,Reinhard 在VS中制作SSRS报表,预览的时候发现显示不出数据. 仔细检查了数据处理环节和临时表里的数据,都发现没有问题. 用同事的账号登陆同样的开发环境,发现他的账号可以在VS中预览到 ...
- Dynamics AX 2012 R2 安装Reporting Services 扩展
今天Reinhard在VS中部署SSRS报表时,接到以下错误: 部署因错误而被取消.在报表服务器上,验证:-SQL Server Reporting Services 服务是否正在运行. 接着,Rei ...
- Dynamics AX 2012 R2 如何处理运行时间较长的报表
当处理的数据量较多,逻辑比较复杂时,报表可能会超时.为了解决这个问题,Reinhard一直使用SrsReportDataProviderPreProcess来做预处理报表.它会在调用SSRS前,在AX ...
- Dynamics AX 2012 R2 电子邮件广播错误 0x80040213
Dynamics AX 2012 R2 电子邮件广播错误 0x80040213 今天Reinhard在新环境做邮件广播测试时,发现无法发送邮件,并报以下错误: 类"CDO.Message&q ...
- Dynamics AX 2012 R2 安装额外的AOS
众所周知,AX系统分为三层:Client,Application Server,Database Server. 我们添加额外的Application Server主要是出于以下两个原因: 使用多台服 ...
- Dynamics AX 2012 R2 AIF 内部异常
今天,Reinhard发现某个入站端口,突然一直报错: The server was unable to process the request due to an internal erro ...
- Dynamics AX 2012 R2 Service Middle Tier WCF WCF转发
参考了蒋金楠老师08年的文章.好吧,那时候我才大二.大三,大神果然是大神. http://www.cnblogs.com/artech/archive/2008/09/01/1280939.html ...
- Dynamics AX 2012 R2 业务系列-销售业务流程
在博文Dynamics AX R2 业务系列中,Reinhard对这个系列做了一个规划,下面我们就按照规划开始说业务吧. 1.销售的主要职责 其实这里说的职责主要是针对销售文员,并非整天外面满世界跑业 ...
随机推荐
- 【android studio】解决android studio drawable新建项目时只有一个drawable目录的问题
概述 android studio默认新建Module时,只新建一个drawable目录,并不会新建适配不同分辨率的drawable目录.但其实,这是可以设置的.有以下两种方法: 方法1 详细步骤 进 ...
- Qt Write and Read XML File 读写XML文件
在Qt中,我们有时候需要把一些参数写入xml文件,方便以后可以读入,类似一种存档读档的操作,例如,我们想生成如下的xml文件: <?xml version="1.0" enc ...
- Hibernate常用增删改查方法
/** * @param obj * @return * 添加数据 */ public Serializable saveObject(Object obj){ return this.getHibe ...
- cat 显示指定行
[一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1000 [二]显示1000行到3000行 cat ...
- WIN8 MTK驱动不能安装解决办法
1.把鼠标移动到桌面最右下角的位置会出来一个侧边栏,按那个齿轮就是“设置”,会出来个菜单,选择最下边的“更多电脑设置” 注:也可以按快捷键“WIN+I” 2.选择“常规”→“高级启动”→”立即重启“ ...
- 定位position
position : absolute | relative | fixed | static 定位:子集可以超出父级的范围,如父级蛇overflow:hidden则看不到. absolute : 绝 ...
- linux笔记一
1.桌面环境:gnome,kde等 2.虚拟机网络模式: a.VMnet0:用于虚拟桥接网络下的虚拟交换机 b.VMnet1:用于虚拟HOST-Only网络下的虚拟交换机 c.VMnet8:用于虚拟N ...
- Xss里img标签的一些利用
<img src=x onerror=with(document)body.appendChild(document.createElement('script')).src="//x ...
- eclipse中如何修改dynamic web module version
java项目中,若切换服务器,经常会涉及到动态web模块版本的问题. 比如:新建了web项目,开始使用tomcat服务器,但是后来使用jboss服务器,就会出现:Project facet ...
- Excel和datatable相互操作
/// <summary> /// Excel文档 /// </summary> /// <param name="table"></pa ...