回答編集履歴

1

プログラムを掲載

2021/02/04 15:38

投稿

ppaul
ppaul

スコア24670

test CHANGED
@@ -1,4 +1,4 @@
1
- dateutil.relativedeltaでできます。
1
+ ~~dateutil.relativedeltaでできます。
2
2
 
3
3
 
4
4
 
@@ -18,4 +18,84 @@
18
18
 
19
19
 
20
20
 
21
- 何週間か前というのは、7倍してrelativedelta(day=7*n)を使ってください。
21
+ 何週間か前というのは、7倍してrelativedelta(day=7*n)を使ってください。~~
22
+
23
+
24
+
25
+ relativedeltaを使って補正をかける関数を作ってみました。
26
+
27
+ 結果は、(年、月、週、日)です。
28
+
29
+
30
+
31
+ ```python
32
+
33
+ from datetime import date
34
+
35
+ from dateutil.relativedelta import relativedelta
36
+
37
+
38
+
39
+ def ymd_diff(currentday, pastday):
40
+
41
+ days = (currentday - pastday).days
42
+
43
+ years_ago = days //365
44
+
45
+ months_ago = (days %365)//30
46
+
47
+ candidate = currentday - relativedelta(years=years_ago, months=months_ago)
48
+
49
+ days_ago = (candidate - pastday).days
50
+
51
+ while days_ago < 0:
52
+
53
+ if months_ago == 0:
54
+
55
+ years_ago = years_ago -1
56
+
57
+ months_ago = 11
58
+
59
+ else:
60
+
61
+ months_ago = months_ago - 1
62
+
63
+ candidate = currentday - relativedelta(years=years_ago, months=months_ago)
64
+
65
+ days_ago = (candidate - pastday).days
66
+
67
+ if days_ago <= 31:
68
+
69
+ if currentday - relativedelta(years=years_ago, months=months_ago, days=days_ago) == pastday:
70
+
71
+ return years_ago, months_ago, days_ago//7, days_ago%7
72
+
73
+ else:
74
+
75
+ print("error: ", years_ago, months_ago, days_ago)
76
+
77
+ else:
78
+
79
+ print("error: ", years_ago, months_ago)
80
+
81
+ ```
82
+
83
+
84
+
85
+ 実行例は以下です。
86
+
87
+
88
+
89
+ ```python
90
+
91
+ >>> ymwd_diff(date(2021, 3, 1),date(1990, 2, 21))
92
+
93
+ (31, 0, 1, 1)
94
+
95
+ >>> ymwd_diff(date(2021, 3, 1),date(1992, 2, 21))
96
+
97
+ (29, 0, 1, 2)
98
+
99
+ ```
100
+
101
+ もっと、まじめにテストしたほうが良いとは思いますが、一応動作しています。