c++ - 获取给定日期对应于 ( local_timezone ) 午夜的 time_t/timeval

标签 c++ unix-timestamp time-t boost-date-time timeval

给定一个 time_t 或 struct timeval,我如何获得那天午夜 EST/EDT(本地时区)的 timeval 或 time_t? 假设本地时区是 EST/EDT,给定一个对应于 2010-11-30 08:00:00 EST/EDT 的 time_t,预期的答案是对应于 2010-11-30 00:00:00 EST 的 time_t/美国东部时间

尝试 1(不正确:因为它不处理 DST,并假设 EST/EDT 总是比 UTC 晚 5 小时):

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) 结构 tm、mktime 或 (ii) boost::local_date_time 也许?

最佳答案

由于 time_t 是自大纪元(00:00:00 UTC,1970 年 1 月 1 日)以来的秒数,您只需要去掉当天的秒数。一天有 86400 秒(闰秒通常被忽略)所以结果应该是 86400 的倍数。因此:

time_t now = time();
time_t midnight = now / 86400 * 86400

关于c++ - 获取给定日期对应于 ( local_timezone ) 午夜的 time_t/timeval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4910145/

相关文章:

shell - 用于查找最近创建的目录的 unix 命令

mysql - 返回生日为今天的数据

c - 向 tm 结构添加一些间隔

c++ - localtime_s 失败,而 gmtime_s 在 1-1-1970 之前的日期成功

c++ - 对具有重载运算符的类型进行就地销毁->

c++ - `type *var = (int)0` ,合法与否?

c++ - 如果我像对待 C++ 代码一样对待我的 C 代码,它会像平常一样运行吗?

c++ - 适用于 Linux 的 C/C++ RPC 教程

java - 如何在 Java 中将 YMD LDAP 时间戳转换为日期时间?

gcc - _USE_32BIT_TIME_T 相当于 gcc