日付の扱いは忘れそうなのでメモ。
一ヶ月前を表す場合、可能であれば前月の同日同時刻を表し、前月に同日が存在しない場合は差分を計算して付け足す。
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 }