function msec = parse(str, format, timezone)
  
  % second and third arguments are optional
  if nargin < 3
    timezone = '';
  end
  if nargin < 2
    format = '';
  end
  
  % default timezone
  if isempty(timezone)
    timezone = time.timezone;
  end
  % convert string timezone into java object 
  if ischar(timezone)
    timezone = java.util.TimeZone.getTimeZone(timezone);
  end
  
  % obtain a java time format description to use for parsing
  if isempty(format)
    % infere it from the string
    format = parse_time_string(str);
  else
    % convert a given MATLAB time format into a Java one
    format = time.matfrmt2javafrmt(format);
  end
  
  % parse the string accordingly to the corrent format and timezone
  tformat = java.text.SimpleDateFormat(format, java.util.Locale.UK);
  tformat.setTimeZone(timezone);
  try
    % It is necessary to replace 'GMT+03' by 'GMT+03:00' because java
    % expects the ':00' at the end.
    str = regexprep(str, '([gG][mM][tT][+-]\d\d?$)', '$1:00');
    msec = tformat.parse(str).getTime();
  catch
    error('### unable to parse time string ''%s'' accordingly to format ''%s''', str, format);
  end
  
end


function str = parse_time_string(str)

  % supported patterns
  parse = { '\s[gG][mM][tT][+-]?\d\d?$',      ' z';      ... % GMT+1 or GMT+12
            '\s[gG][mM][tT][+-]?\d\d?:\d\d$', ' z';      ... % GMT+08:12
            '\s\w{3}$',                       ' z';      ... % PST
            '\s[+-]\d{4}$',                   ' Z';      ... % +0800
            '\d{2}:\d{2}:\d{2}',              'HH:mm:ss';    ...
            '\d{2}:\d{2}',                    'mm:ss';       ...
            '\d{2} \w{3} \d{4}',              'dd MMM yyyy'; ...
            '\d{2}-\w{3}-\d{4}',              'dd-MMM-yyyy'; ...
            '\d{2}.\w{3}.\d{4}',              'dd.MMM.yyyy'; ...
            '\d{2}-\d{2}-\d{4}',              'dd-MM-yyyy';  ...
            '\d{2}\.\d{2}\.\d{4}',            'dd.MM.yyyy';  ...
            '\d{4}-\d{2}-\d{2}',              'yyyy-MM-dd';  ...
            '\d{4}\.\d{2}\.\d{2}',            'yyyy.MM.dd';  ...
            '\d{2}-\d{2}',                    'MM-dd';       ...
            '\.\d{1,3}',                      '.SSS'};
            
  % try to match the patterns to the string and replace
  % it with the corresponding Java time format descriptor
  re   = parse(:,1);
  frmt = parse(:,2);
  str  = regexprep(str, re, frmt);
  
end
