This happens because the current version of TZInfo always returns local times as UTC (with an offset of 0):
tz=TZInfo::Timezone.get('Europe/Berlin')time=Time.at(1478874502).utc# -> 2016-11-11 14:28:22 UTCconverted_time=tz.utc_to_local(time)# -> 2016-11-11 15:28:22 UTC
The converted_time instance is already in UTC, so calling .utc won't change anything.
TZInfo works this way because because the Time class in older versions of Ruby could only represent times in either UTC or the configured local time zone.
The next major version of TZInfo will return local times using the correct offset (and only support Ruby 1.9.3 or later). This will allow conversion back to UTC. The latest code in the git master branch will give you the result you are expecting: