5

1年の期間(in)が必要なプログラムを作成していますtime_t

他の方法でtime_tは、DD / MM /YYYY+期間= time_tDD/ MM / YYYY+1の

したがって、必ずしも365日とは限りません(2012年2月29日は2013年2月28日となります)

これが私が持ってきたアルゴリズムです:

if YEAR is leap than
    if we are before the 29th feb' than return 365+1 days
    else if we are the 29th feb' than return 365-1 days
    else return 365 days
else if YEAR+1 is leap than
    if we are before or the 28th feb' than return 365 days
    else return 365+1 days
else return 365 days

ここでは、1日は60 * 60*24秒です

このアルゴリズムは機能しているようです。しかし、これらすべての条件と2つの可能な戻り値だけを使用せずにこれを行う別の方法があるのか​​、それとも物事を最適化するための「トリック」があるのか​​疑問に思いました。

tm_year私はこのようなものからインクリメントしようとしましたstruct tm

// t is the input time_t
struct tm Tm (*localtime(&t));
if (Tm.tm_mon == 2 && Tm.tm_mday == 29) --Tm.tm_mday;
++Tm.tm_year;
return mktime(&Tm) - t;

しかし、結果は私が望むものではありません、私は-1時間、または-25を取得しました...

1年が365*24 * 60*60ではないからだと思います。

4

3 に答える 3

5

これにはBoostを使用します。これは、探しているものがすでに実装されているためです。

#include <iostream>
#include <boost/date_time/gregorian/gregorian_types.hpp>
namespace date = boost::gregorian;

int main() {
   date::date_period dp(date::date(2012, 6, 4), date::date(2013, 6, 4));
   long days = dp.length().days();
   std::cout << "Days between dates: " << days << std::endl;

}

より高い精度が必要な場合はposix_time、Boostからも使用できます。

namespace ptime = boost::posix_time;

...

ptime::ptime t1(date::date(2012, 6, 4), ptime::hours(0));
ptime::ptime t2(date::date(2013, 6, 4), ptime::hours(0));

ptime::time_duration td = t2 - t1;
std::cout << "Milliseconds: " << td.total_milliseconds() << std::endl;

通常time_t、秒単位で測定されます。td.total_seconds()したがって、探している値を取得するには、を呼び出す必要があります。

于 2012-06-04T08:34:21.990 に答える
2
if YEAR is leap than
    if we are before the 29th feb' than return 365+1 days
    else if we are the 29th feb' than return 365-1 days
    else return 365 days
else if YEAR+1 is leap than
    if we are before or the 28th feb' than return 365 days
    else return 365+1 days
else return 365 days

簡略化して:

if (YEAR is leap)
    if (< 29th Feb) return 365+1
    if (= 29th Feb) return 365-1
else if (YEAR+1 is leap)
    if (> 29th Feb) return 365+1

return 365

しかし、なぜあなたはこれをしたいのですか?「トリック」最適化よりも、読み取り可能なコードを使用する方がはるかに優れています。

@betabandidoが示唆しているように、のようなものdate(year+1, mon, day) - date(year, mon, day)ははるかに単純で、はるかに読みやすく、うるう年、うるう秒、9月の11日を処理できます。

于 2012-06-04T08:54:29.753 に答える
0

太陽年の長さは固定数ではありません。グレゴリオ暦は、うるう年を補正する方法を発明しましたが、これは完全には正確ではありません。つまり、「1年は100で割り切れない限り、4で割り切れる場合はうるう年ですが、400で割り切れる場合は再びうるう年になります。

私たちイランには、より正確なカレンダーがあります。このカレンダーでは、年が変わると、2番目の地球が太陽の周りを完全に一周します。同じリンクで、平均太陽年は365。2422日、春分点間の平均間隔は365。2424日であることがわかります。

このリンクでは、太陽年(熱帯年)の長さに関する詳細が秒単位で示されています。

于 2012-06-04T08:36:46.237 に答える