anchor.diff:        end;
       stString:
         begin
  -        o := SO(obj.AsString);
  -        if not ObjectIsType(o, stString) then
  -          FromFloat(o) else
  -          Result := False;
  +        GetLocaleFormatSettings(GetSystemDefaultLCID, fmtSettings);
  +        fmtSettings.DateSeparator := '-';
  +        fmtSettings.TimeSeparator := ':';
  +        fmtSettings.ShortDateFormat := 'yyyy-mm-dd';
  +        fmtSettings.LongDateFormat := 'yyyy-mm-dd';
  +        fmtSettings.ShortTimeFormat := 'hh:nn:ss';
  +        fmtSettings.LongTimeFormat := 'hh:nn:ss';
  +        if TypeInfo.name = 'TDate' then
  +        begin
  +          value := TValue.from<TDate>(StrToDate(obj.AsString, fmtSettings));
  +          result := true;
  +        end
  +        else if TypeInfo.name = 'TTime' then
  +        begin
  +          value := TValue.from<TTime>(StrToTime(obj.AsString, fmtSettings));
  +          result := true;
  +        end
  +        else if TypeInfo.name = 'TDateTime' then
  +        begin
  +          ISO8601DateToDelphiDateTime(SOString(obj.AsString), dt);
  +          value := TValue.From<TDateTime>(dt);
  +          result := true;
  +        end
  +        else
  +        begin
  +          o := SO(obj.AsString);
  +          if not ObjectIsType(o, stString) then
  +            FromFloat(o) else
  +            Result := False;
  +        end;
         end
       else
          Result := False;
  
positive.code:           FromInt(o) else
            Result := False;
        end;
      else
        Result := False;
      end;
  
negative.code:   sign: SOChar;
    bias: Integer;
  begin
    try
      DecodeDate(dt, year, month, day);
      DecodeTime(dt, hour, min, sec, msec);
      bias := GetTimeBias;
      tzh := Abs(bias) div 60;
      tzm := Abs(bias) - tzh * 60;
      if Bias > 0 then
        sign := '-' else
        sign := '+';
      Result := Format('%.4d-%.2d-%.2dT%.2d:%.2d:%.2d.%d%s%.2d:%.2d',
        [year, month, day, hour, min, sec, msec, sign, tzh, tzm]);
    except
      if dt = 0 then
        raise
      else
        DelphiDateTimeToISO8601Date(0);
    end;
  end;
  
  function TryObjectToDate(const obj: ISuperObject; var dt: TDateTime): Boolean;
  