逆引きFormula 2.0 に戻る
以下のような質問がありました。
年は式がありますし、月は12の剰余を取ればいいので簡単でしたが、最後の日付をどうやったら取得できるかを考えていました。取得した年と月をずらしてあげればよいのではと気づき、以下のような形で実装できました。一つずつの機能を確認していき、それらをまとめ上げて一つのフォーミュラにまとめてみます。要望通りのものが作れているのではないかと思います。Formula 2.0 で let が用意されたので、過去の日付を st に未来の日付を et に設定し、負の値の取り扱いをしないように変更します。
○年を取得 (常に正の値が出る)
lets(
/* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */
ds, [prop("Start"), prop("End")].sort(),
/* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/
st, ds.first(),
/* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/
et, ds.last(),
/* et と st の間の年数を取得 */
et.dateBetween(st, "years")
)
○ヶ月を取得 (常に正の値が出る)
lets(
/* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */
ds, [prop("Start"), prop("End")].sort(),
/* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/
st, ds.first(),
/* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/
et, ds.last(),
/* et と st の間の月数を取得 */
et.dateBetween(st, "months") % 12
)
1, 2 のオフセットをずらした日付を取得
lets(
/* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */
ds, [prop("Start"), prop("End")].sort(),
/* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/
st, ds.first(),
/* 1 で取得した年数を st に追加 */
st.dateAdd(prop("year"), "years")
/* 2 で取得した月数をさらに追加 */
.dateAdd(prop("month"), "months")
)
オフセットをずらした日付と比較することで○日を取得 (常に正の値が出る)
lets(
/* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */
ds, [prop("Start"), prop("End")].sort(),
/* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/
et, ds.last(),
/* et と year_month_add プロパティの間の日数を取得 */
et.dateBetween(prop("year_month_add"), "days")
)
○年○ヶ月○日の文字列を作成 (1-4 を lets で変数化して一括作成)
lets(
/* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */
ds, [prop("Start"), prop("End")].sort(),
/* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/
st, ds.first(),
/* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/
et, ds.last(),
/* et と st の間の年数を取得し、変数 yd に代入 */
yd, et.dateBetween(st, "years"),
/* et と st の間の月数を取得し、変数 md に代入 */
md, et.dateBetween(st, "months") % 12,
/* yd の年数を st に追加、md の月数をさらに追加 */
yma, st.dateAdd(yd, "years").dateAdd(md, "months"),
/* et と yma の間の日数を取得 */
dd, et.dateBetween(yma, "days"),
(yd.empty() ? "" : yd + "年")
+ (md.empty() ? "" : md + "ヶ月")
+ (dd.empty() ? "" : dd + "日")
)
→ sortfirstlastdateBetweendateAddformat==, equal?:, if+, add