teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

プログラムを掲載

2021/02/04 15:38

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -1,4 +1,4 @@
1
- dateutil.relativedeltaでできます。
1
+ ~~dateutil.relativedeltaでできます。
2
2
 
3
3
  [Pythonで翌日や翌月みたいな日付の計算をする](https://qiita.com/dkugi/items/8c32cc481b365c277ec2)
4
4
 
@@ -8,4 +8,44 @@
8
8
 
9
9
  も使えます。
10
10
 
11
- 何週間か前というのは、7倍してrelativedelta(day=7*n)を使ってください。
11
+ 何週間か前というのは、7倍してrelativedelta(day=7*n)を使ってください。~~
12
+
13
+ relativedeltaを使って補正をかける関数を作ってみました。
14
+ 結果は、(年、月、週、日)です。
15
+
16
+ ```python
17
+ from datetime import date
18
+ from dateutil.relativedelta import relativedelta
19
+
20
+ def ymd_diff(currentday, pastday):
21
+ days = (currentday - pastday).days
22
+ years_ago = days //365
23
+ months_ago = (days %365)//30
24
+ candidate = currentday - relativedelta(years=years_ago, months=months_ago)
25
+ days_ago = (candidate - pastday).days
26
+ while days_ago < 0:
27
+ if months_ago == 0:
28
+ years_ago = years_ago -1
29
+ months_ago = 11
30
+ else:
31
+ months_ago = months_ago - 1
32
+ candidate = currentday - relativedelta(years=years_ago, months=months_ago)
33
+ days_ago = (candidate - pastday).days
34
+ if days_ago <= 31:
35
+ if currentday - relativedelta(years=years_ago, months=months_ago, days=days_ago) == pastday:
36
+ return years_ago, months_ago, days_ago//7, days_ago%7
37
+ else:
38
+ print("error: ", years_ago, months_ago, days_ago)
39
+ else:
40
+ print("error: ", years_ago, months_ago)
41
+ ```
42
+
43
+ 実行例は以下です。
44
+
45
+ ```python
46
+ >>> ymwd_diff(date(2021, 3, 1),date(1990, 2, 21))
47
+ (31, 0, 1, 1)
48
+ >>> ymwd_diff(date(2021, 3, 1),date(1992, 2, 21))
49
+ (29, 0, 1, 2)
50
+ ```
51
+ もっと、まじめにテストしたほうが良いとは思いますが、一応動作しています。