1

std.datetime の日付に日数を追加できないのはなぜですか? 月と年は追加できますが、日は追加できません。

最近、復活祭の日曜日の日付を計算する必要がありました。次に、最後の日付に特定の日数 (39、10、7、4) を追加して、関連する祝日 (アセンション、ペンテコステ、トリニティ、コーパス) を計算する必要がありました。

私はdayOfYearを使用することになりました:

date.dayOfYear(date.dayOfYear + offset);

これはうまくいきましたが、それは私が同じ年に残っていたからです. たとえば、12 月 28 日に 50 日を追加する必要がある場合はどうすればよいですか?

私が見落としていたこれを行う簡単な方法はありますか?

4

4 に答える 4

5

Durationからご利用いただけますcore.time。インポートstd.datetimeするとインポートされるcore.timeので、以下のようにそのまま使えます。

import std.stdio, std.datetime;

void main() {
  auto date = Date(2013, 12, 28);
  writefln("%s + %s = %s", date, 10.days(), date + 10.days());
}

ところで、構造体を構築days()するエイリアスです。詳細については、 http://dlang.org/phobos/core_time.htmlのドキュメントを確認してください。dur!"days"()Durationcore.time

于 2013-01-17T16:41:28.463 に答える
3

std.datetime に関するこの記事をまだ読んでいない場合は、使用方法に関する最も基本的な質問におそらく答えているはずです。

しかし、一般的には、std.datetime ( 、、、または)core.time.Durationのいずれかの時点タイプから単位を加算および減算するために使用する必要があるものです。したがって、次のようなコードが得られますSysTimeDateTimeDateTimeOfDay

auto date = Date(2012, 12, 21);
date += dur!"days"(50);

また

auto date = Date(2012, 12, 21);
date += days(50);

(テンプレートdur化された関数は を生成する一般的な方法ですが、Durationサポートするユニットごとにエイリアスがあるため、seconds(5)またはのようなもの22.minutes()も同様に機能します)。

aは月または年を保持できないため (特定の日付がないと、月または年をより小さな単位に変換できないため)、および 月または年を時点に追加する方法が必要なため、add関数は"months"andに対して存在します。また、日付に月や年を足したり引いたりするときにどうするかという問題があり、移動先の月にはその日が含まれないため、それを制御するために受け入れます(これはそうではありませんより小さなユニットでは必要です)。"years"DurationaddAllowDayOverflow

auto d3 = Date(2000, 2, 29);
d3.add!"years"(1);
assert(d3 == Date(2001, 3, 1));

auto d4 = Date(2000, 2, 29);
d4.add!"years"(1, AllowDayOverflow.no);
assert(d4 == Date(2001, 2, 28));

ただしadd、通常の算術演算を . で単純に使用できるため、他の単位は受け入れませんDuration。また、2 つの時点を減算すると、 になりDurationます。

assert(Date(2012, 12, 5) - Date(2002, 11, 17) == dur!"days"(3671));
assert(Date(2012, 12, 5) - dur!"days"(3671) == Date(2002, 11, 17));

とは異なりadd、はandrollだけでなく、型内のすべての単位を受け入れますが、それはとは異なる操作を行っているためです。したがって、 a の加算または減算は機能しません (既に加算または減算されているため)。むしろ、他のユニットに追加することなく、特定のユニットに追加します。"months""years"+Durationroll

auto d = Date(2010, 1, 1);
d.roll!"days"(33);
assert(d == Date(2010, 1, 3));
于 2013-01-17T17:58:16.280 に答える
0

私はそれを見落としました:あなたはdayOfGregorianCalを使うことができます:

import std.stdio, std.datetime;

void main() {
    auto d = Date(2012, 12, 28); 
    writeln(d);    // 2012-Dec-28
    d.dayOfGregorianCal(d.dayOfGregorianCal + 50); 
    writeln(d);    // 2013-Feb-16
}
于 2013-01-17T12:41:06.653 に答える
0

メソッドを使用できますroll

date.roll!"days"(50);
于 2013-01-17T12:30:01.407 に答える