获取给定日期 ( local_timezone ) 午夜对应的 time_t / 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 /EDT
尝试 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(不正确:因为它返回对应于午夜 UTC 而非 EST/EDT 的 time_t ,本地时区):
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 也许?
Given a time_t or struct timeval, how do I get the timeval or time_t of midnight EST/EDT ( local timezone ) on that day ?
As in assuming local timezone is EST/EDT, given a time_t corresponding to say 2010-11-30 08:00:00 EST/EDT, the expected answer is a time_t that corresponds to 2010-11-30 00:00:00 EST/EDT
Attempt 1 ( Incorrect: since it does not handle DST, and assumes EST/EDT is always 5 hours behind UTC ):
time_t RewindToMidnight ( const time_t temp_time_t_ )
{
return ( (5*3600) + ((( temp_time_t_ - 5*3600 )/86400 ) * 86400) );
}
Attempt 2 ( Incorrect: since it returns a time_t that corresponds to when it was midnight UTC and not EST/EDT, local timezone ):
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 feel there should be a solution involving
(i) struct tm, mktime or
(ii) boost::local_date_time perhaps ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
由于 time_t 是自纪元(1970 年 1 月 1 日 00:00:00 UTC,1970 年 1 月 1 日)以来的秒数,因此您只需去掉当天的秒数即可。一天有 86400 秒(通常忽略闰秒),因此结果应该是 86400 的倍数。因此:
As time_t is time in seconds since the Epoch (00:00:00 UTC, January 1, 1970), you just need to get rid of the seconds of the day. There are 86400 seconds in a day (leap seconds are normally ignored) so the result should be a multiple of 86400. Hence:
我使用了 localtime_r 因为它必须可用,因为您也在答案中使用了它。
示例:
I used localtime_r since it must be available as you also used it in your answer.
Example:
目前的解决方案:
请指教。
Current solution :
Please advise.