3月1日の一日前を計算する方法

いろんな言語・コマンドラインで,日付の足し算・引き算をする方法をまとめます.

例として,3月1日の1日前を計算を考えます.この計算は,うるう年があるので面倒です.たとえば

  • 2021年3月1日の前日は 2月28日
  • 2020年3月1日は前日は 2月29日

となりますが,これを計算してみます

python で日付の引き算:datetimeモジュール

from datetime import datetime, timedelta
print( datetime(2021, 3, 1) + timedelta(days=-1) )
print( datetime(2020, 3, 1) + timedelta(days=-1) )

この実装はタイムゾーンの影響を受けません(考慮していません)

コマンドラインで date コマンドを使う方法

/usr/bin/date は実は日付の計算が出来ます

$ date --date="2021-03-01 -1 day"  
$ date --date="2020-03-01 -1 day"  

dateコマンドの日付の処理は,環境変数経由でタイムゾーンの影響を受けるので注意が必要です

心配な場合は環境変数TZを指定しておきましょう

$ TZ=UTC date --date="2021-03-01 -1 day"  

シェルスクリプトで日付計算が必要なら,実質 date コマンド一択になるでしょう.

コマンドラインで qalc コマンドを使う方法

ターミナルで動作する電卓コマンドだと次のようにします

$ qalc
> date(2021,3,1) - 1day

  date(2021, 3)(1 day) = "2021-02-28"

> date(2020,3,1) - 1day

  date(2020, 3)(1 day) = "2020-02-29"

C言語で計算:mktime()を使う方法

C言語で日付を計算するコードです

#include <stdio.h>
#include <time.h>

void add_days(int year, int month, int day, int offset){
	struct tm t = {0};
	t.tm_year = year - 1900;
	t.tm_mon = month - 1;
	t.tm_mday = day;

	t.tm_mday += offset;

	mktime(&t);

	printf("%s\n", asctime(&t));
}

int main()
{
	add_days(2021,3,1, -1);
	add_days(2020,3,1, -1);

	return 0;
}

PHPで日付の計算:strtotime()

echo date("Y-m-d", strtotime("2021-3-1 -1 day"));
echo date("Y-m-d", strtotime("2020-3-1 -1 day"));