質問

time_tまたはstruct timevalを指定して、その日にMidnight EST / EDT(ローカルタイムゾーン)のタイムブまたはtime_tを取得するにはどうすればよいですか。 地元のタイムゾーンがEST / EDTであると仮定すると、2010-11-30 08:00 EST / EDTに対応するtime_tが与えられると、期待される回答は2010-11-30 00:00:00に対応する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(不適切:それがITCの時に対応するtime_tを返すので、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 OR (ii)Boost :: local_date_timeおそらく?

役に立ちましたか?

解決 3

現在の解決策:

time_t RewindToMidnight ( const time_t & temp_time_t_ )
{
    int temp_yyyymmdd_ = iso_date_from_time_t ( temp_time_t_ );
    return time_t_from_iso_date ( temp_yyyymmdd_ );
}

int iso_date_from_time_t ( const time_t & in_time_t_ ) 
{
     tm temp_this_tm_;

     { // the following to set local dst fields of struct tm ?
         time_t tvsec_ = time(NULL);
         localtime_r ( & tvsec_, & temp_this_tm_ ) ;
     }
     localtime_r ( & in_time_t, & temp_this_tm_ ) ;

     return ( ( ( ( 1900 + temp_this_tm_.tm_year ) * 100 + ( 1 + temp_this_tm_.tm_mon ) ) * 100 ) + temp_this_tm_.tm_mday ) ;
}

time_t time_t_from_iso_date ( const int & temp_yyyymmdd_ ) 
{ 

     boost::gregorian::date d1 ( (int)( temp_yyyymmdd_/10000), 
                                 (int)( ( temp_yyyymmdd_/100) % 100), 
                                 (int)( temp_yyyymmdd_ % 100) );

     std::tm this_tm_ = to_tm ( d1 );
     return ( mktime ( & this_tm_ ) ) ;
}
.

助言してください。

他のヒント

time_tとしての時間(00:00:00 UTC、1970年1月1日)以来の時間単位の時間は、その日の秒を取り除く必要があります。1日に86400秒(うるう秒は通常無視されます)で、結果は86400の倍数になる必要があります。したがって、

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

time_t local_midnight(time_t x) {
  struct tm t;
  localtime_r(&x, &t);
  t.tm_sec = t.tm_min = t.tm_hour = 0;
  return mktime(&t);
}
.

私はあなたがあなたの答えでそれを使ったときに利用可能でなければならないので、localtime_rを使用しました。

href="http://codepad.org/wjqh2jyz" rel="nofollow">例:

int main() {
  time_t now = time(0);
  cout << "local: " << asctime(localtime(&now));
  cout << "UTC:   " << asctime(gmtime(&now));
  time_t midnight = local_midnight(now);
  cout << "\n       " << asctime(localtime(&midnight));
  return 0;
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top