anchor.diff:      err := 'Timezone minutes is not valid';
     if err <> '' then
       raise EDateFormatError.Create(err+' ('+privToString+')');
  +end;
  +
  +function TDateTimeEx.checkNoException: boolean;
  +var
  +  err : String;
  +begin
  +  err := '';
  +  if (year < 1000) or (year > 3000) then
  +    err := 'Year is not valid'
  +  else if (FPrecision >= dtpMonth) and ((Month > 12) or (Month < 1)) then
  +    err := 'Month is not valid'
  +  else if (FPrecision >= dtpDay) and ((Day < 1) or (Day >= 32) or (MONTHS_DAYS[IsLeapYear(Year)][TMonthOfYear(Month-1)] < Day)) then
  +    err := 'Day is not valid for '+inttostr(Year)+'/'+inttostr(Month)
  +  else if (FPrecision >= dtpHour) and (Hour > 23) then
  +    err := 'Hour is not valid'
  +  else if (FPrecision >= dtpMin) and (Minute > 59) then
  +    err := 'Minute is not valid'
  +  else if (FPrecision >= dtpSec) and (Second > 59) then
  +    err := 'Second is not valid'
  +  else if (FPrecision >= dtpNanoSeconds) and (FractionPrecision > 999999999) then
  +    err := 'Fraction is not valid'
  +  else if (TimezoneType = dttzSpecified) and ((TimezoneHours < -13) or (TimezoneHours > 14)) then
  +    err := 'Timezone hours is not valid'
  +  else if (TimezoneType = dttzSpecified) and not ((TimezoneMins = 0) or (TimezoneMins = 15) or (TimezoneMins = 30) or (TimezoneMins = 45)) then
  +    err := 'Timezone minutes is not valid';
  +  result := err = '';
   end;
   
   function TDateTimeEx.DateTime: TDateTime;
  
positive.code:   result := StrToInt(v);
    if (result < min) or (result > max) then
      raise exception.create('Value for '+name+' in date/time "'+value+'" is not allowed');
  
  end;
  
  
  
negative.code:   result.Fraction := fraction;
  end;
  
  function TDateTimeEx.after(other : TDateTimeEx; inclusive : boolean) : boolean;
  var
    uSelf, uOther : TDateTimeEx;
  begin
    uSelf := UTC;
    uOther := other.UTC;
    if uSelf.equal(uOther) then
      exit(inclusive);
    result := (uSelf.year >= uOther.year) and (uSelf.month >= uOther.month) and (uSelf.day >= uOther.day) and
              (uSelf.hour >= uOther.hour) and (uSelf.minute >= uOther.minute) and (uSelf.second >= uOther.second) and (uSelf.fraction >= uOther.fraction);
  end;
  
  function TDateTimeEx.before(other : TDateTimeEx; inclusive : boolean):boolean;
  var
    uSelf, uOther : TDateTimeEx;
  begin
    uSelf := UTC;
    uOther := other.UTC;
    if uSelf.equal(uOther) then
      exit(inclusive);
    result := (uSelf.year <= uOther.year) and (uSelf.month <= uOther.month) and (uSelf.day <= uOther.day) and
              (uSelf.hour <= uOther.hour) and (uSelf.minute <= uOther.minute) and (uSelf.second <= uOther.second) and (uSelf.fraction <= uOther.fraction);
  end;
  
  function TDateTimeEx.between(min, max : TDateTimeEx; inclusive : boolean):boolean;
  begin
    result := after(min, inclusive) and before(max, inclusive);
  end;
  
  const
    DATETIME_FORMAT_XML = 'yyyy-mm-dd"T"hh:nn:ss';
  
  