Dynamics Ax 2009 using the DateTimeUtil


Since i’m getting a lot of google hits on my Dynamics Ax – workdays to days post, i’ve decided to blog some more about it. The DateTimeUtil class is actually a wrapper of the .NET DateTime class.
A first thing to remember when using UtcDateTime EDT’s is that it is stored like the name says as Coordinated Universal Time.
The controls on the form will translate the DateTime to the timezone of the client. Now keeping this in mind is very important when mixing date, time and datetime controls. The following example will make it more clear.
The first field is a UtcDateTimeEdit control with a data method that returns DateTimeUtil::UtcNow().
As you can see the time is 08:58, but the first control on the form shows 10:58. This is correct because my client timezone is (GMT+01:00) Brussel, Kopenhagen, Madrid, Parijs and it’s summer time.
The second field is a TimeEdit control with a data method that returns DateTimeUtil::time(DateTimeUtil::utcNow()), this isn’t correct because it will always return the time in the UTC timezone and the control will not translate it to the correct timezone.
The third field is another TimeEdit control with a data method that returns TimeNow(), this is correct because the TimeNow method will also apply the client/server (depending on the tier) timezone.
this also applies to field in a table.
Another way to use Time controls and the DateTimeUtil is using the applyTimeZoneOffset method.
UtcDateTime ret;
;
 
ret = DateTimeUtil::applyTimeZoneOffset(DateTimeUtil::utcNow(),TimeZone::GMTPLUS0100BRUSSELS_COPENHAGEN_MADRID);
 
return  DateTimeUtil::time(ret);
but this is a lot of code for a rather more simple thing :-)
A second thing to remember, when querying with a date on UtcDateTime fields make sure you select the whole day from 00:00:00 to 23:59:59.
For this I like to implement a method on the Global class, it’s keeps you’re queries cleaner ;-) It works the same way as all .NET developers use, Add a with time 0 and subtract a second.
static UtcDateTime dateCompare(date      _date,
                                  boolean   _toDate = false)
{
    UtcDateTime ret;
    ;
 
    if(_toDate)
    {
        ret = DateTimeUtil::addSeconds(DateTimeUtil::newDateTime(_date + 1,0),-1);
    }
    else
    {
        ret = DateTimeUtil::newDateTime(_date,0);
    }
 
    return ret;
}
So you’re query looks like this.
Date        currectDate = SystemDateGet();
SalesLine   salesLine;
;
 
while select    salesLine
where           salesLine.createdDateTime >= dateCompare(currectDate)
&&              salesLine.createdDateTime  <= dateCompare(currectDate,true)
{
    //Do something
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.