Вы ничего не упускаете.
Следующий стандарт С (который, вероятно, выйдет в этом году) определен в Приложении K:
struct tm *localtime_s(const time_t * restrict timer,
struct tm * restrict result);
И эта новая функция является поточно-ориентированной! Но не становись слишком счастливым. Есть две основные проблемы:
localtime_s
является необязательным расширением до C11.
C ++ 11 ссылки C99, а не C11. local_time_s
нельзя найти в C ++ 11, необязательно или нет.
Обновление
За 4 года, прошедшие с тех пор, как я ответил на этот вопрос, я также был разочарован плохим дизайном инструментов C ++ в этой области. Я был мотивирован для создания современных инструментов C ++, чтобы справиться с этим:
http://howardhinnant.github.io/date/tz.html
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
auto local_time = make_zoned(current_zone(), std::chrono::system_clock::now());
std::cout << local_time << '\n';
}
Это просто вывод для меня:
2015-10-28 14: 17: 31.980135 EDT
local_time
- это сочетание std::chrono::system_clock::time_point
и time_zone
, указывающее местное время.
Существуют утилиты для разбивки std::chrono::system_clock::time_point
на читаемые человеком типы полей, такие как год, месяц, день, час, минута, секунда и подсекунды. Вот презентация, посвященная этим (не часовым поясам) произведениям:
https://www.youtube.com/watch?v=tzyGjOm8AKo
Все это, конечно, потокобезопасно (это современный C ++).