This was a bit puzzling to me, but
date_i18n doesn't adjust to local timezone as one would think. If you set your timezone in wp-admin to GMT+1 this is what happens in the following 2 examples.
Let's say GMT time is 17:05.
echo date_i18n('H:i'); // Will output current hours and minutes of local timezone //Result: 18:05
However if you give this function a custom timestamp or time():
echo date_i18n('H:i', time()); // Output: 17:05 // $some_timestamp is set to time()-3600; echo date_i18n('H:i', $some_timestamp); // Output: 16:05
In both last examples date_i18n outputs GMT time.
The fix is to do add the following to your timestamp:
$timestamp += get_option( 'gmt_offset' ) * 3600; echo date_i18n('H:i', $timestamp );
Almost a bug if you ask me.