Класс std::tm
, возвращаемый std::gmtime
и std::localtime
, не содержит информацию о часовом поясе, кроме того, действует ли переход на летнее время. Для gmtime
оно никогда не действует, а для localtime
это зависит от текущей локали и времени.
%Z
спецификатор формата std::put_time
использует текущую локаль для информации о часовом поясе. На текущую активную локаль не влияет объект std::tm
, заданный в качестве аргумента.
Так что в первом случае вы печатаете местное время с информацией о местном часовом поясе (с включенным DST). А во втором случае вы печатаете время UTC с информацией о местном часовом поясе (с отключенным DST).
Мы можем сделать вывод, что использование %z
и %Z
неверно для печати времени из других часовых поясов, отличных от текущего местногоодин. Честно говоря, я считаю недостатком интерфейса std::put_time
(и интерфейса std::strftime
, который std::put_time
оборачивается) то, что невозможно передать информацию о часовом поясе в функцию, но можно случайно напечатать часовой пояс, который может не иметь отношения к std::tm
экземпляр печатается.
Для правильного вывода вы должны использовать:
ss2 << std::put_time(std::gmtime(¤tTime2),
"%Y-%m-%dT%H:%M:%S +0000 UTC");