In the end I used EncodeDateTime
function:
var
time1, time2 : TDateTime;
year,month,day,hour,minute,second,mlsecond, hourOffset, minOffset : integer;
temp :string;
begin
temp := '2013-12-24T00:00:00.000-09:30';
//parse separate parts of the datetime
year := strtoint(copy(temp,1,4));
month := strtoint(copy(temp,6,2));
day := strtoint(copy(temp,9,2));
hour := strtoint(copy(temp,12,2));
minute := strtoint(copy(temp,15,2));
second := strtoint(copy(temp,18,2));
mlsecond := strtoint(copy(temp,21,3));
hourOffset := strtoint(copy(temp,25,2));
minOffset := strtoint(copy(temp,28,2));
//adjust timezone offset sign
if(temp[24]='+')then
begin
hourOffset := -1 * hourOffset;
minOffset := -1 * minOffset;
end;
//get time in the +00:00 timezone
time1 := EncodeDateTime(year,month,day,hour,minute,second,mlsecond);
time1 := IncHour(time1, hourOffset);
time1 := IncMinute(time1, minOffset);
//get time in local timezone
time2 := IncHour(time1, 9);
//...
end;