Masalah dasarnya adalah bahwa java.sql.Timestamp tidak berisi informasi zona waktu. Saya pikir itu selalu dianggap sebagai "zona waktu lokal".
Pada solusi yang dapat saya pikirkan adalah tidak menggunakan parameter dalam PreparedStatement, tetapi literal zona waktu dalam SQL:
update foo
set ts_col = timestamp with time zone '2012-08-24 14:00:00 +02:00'`;
Solusi lain yang mungkin adalah meneruskan String yang diformat dengan benar ke PrepareStatement yang menggunakan to_timestamp():
String sql = "update foo set ts_col = to_timestamp(?, 'yyyy-mm-dd hh24:mi:ss')";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "2012-08-24 14:00:00 +02:00");