Учитывая time_t или struct timeval, как мне получить timeval или time_t полуночи EST / EDT (местный часовой пояс) в этот день?
Так как в предположении, что местным часовым поясом является EST / EDT, с учетом time_t, соответствующего, например, 2010-11-30 08:00:00 EST / EDT, ожидаемый ответ - это time_t, соответствующий 2010-11-30 00:00:00 EST / EDT
Попытка 1 (Неверно: поскольку она не обрабатывает DST и предполагает, что EST / EDT всегда на 5 часов позже UTC):
time_t RewindToMidnight ( const time_t temp_time_t_ )
{
return ( (5*3600) + ((( temp_time_t_ - 5*3600 )/86400 ) * 86400) );
}
Попытка 2 (Неверно: поскольку он возвращает time_t, который соответствует времени, когда была полночь UTC, а не EST / EDT, местный часовой пояс):
time_t RewindToMidnight ( const time_t temp_time_t_ )
{
boost::posix_time::ptime temp_ptime_ = boost::posix_time::from_time_t ( temp_time_t_ );
boost::gregorian::date temp_date_ = temp_ptime_.date();
boost::posix_time::ptime temp_ptime_midnight_ ( temp_date_,
boost::posix_time::time_duration ( 0, 0, 0 ) );
return to_time_t ( temp_ptime_midnight_ );
}
time_t to_time_t ( const boost::posix_time::ptime & temp_ptime_ )
{
boost::posix_time::ptime temp_epoch_ptime_(boost::gregorian::date(1970,1,1));
boost::posix_time::time_duration::sec_type temp_sec_type_ = ( temp_ptime_ - temp_epoch_ptime_ ).total_seconds();
return time_t ( temp_sec_type_ );
}
Я чувствую, что должно быть решение, включающее
(i) struct tm, mktime или
(ii) возможно, boost :: local_date_time?