kubo39's blog

ただの雑記です。

D言語で一ヶ月前を表すとき

日付の扱いは忘れそうなのでメモ。

一ヶ月前を表す場合、可能であれば前月の同日同時刻を表し、前月に同日が存在しない場合は差分を計算して付け足す。

import std.datetime;
import std.stdio;

void main()
{
    auto currTime = Clock.currTime(UTC());
    writeln(currTime);                              //  2018-Sep-30 20:12:00.0198441Z
    writeln(currTime.add!"months"(-1));  // 2018-Aug-30 20:12:00.0198441Z
    currTime = Clock.currTime(UTC());
    writeln(currTime.add!"months"(1));  // 2018-Oct-30 20:12:00.0199153Z

    auto date = Date(2018, 7, 31);
    writeln(date.add!"months"(-1));  // 2018-Jul-01
    date = Date(2018, 7, 30);
    writeln(date.add!"months"(-1));  // 2018-Jun-30
}

なので3月とかはこうなる。

import std.datetime;
import std.stdio;

void main()
{
    auto date = Date(2018, 3, 31);
    writeln(date.add!"months"(-1));  // 2018-Mar-03
    date = Date(2018, 3, 29);
    writeln(date.add!"months"(-1));  // 2018-Mar-01

    // うるう年は考慮される
    date = Date(2016, 3, 29);
    writeln(date.add!"months"(-1));  // 2016-Feb-29
}