現在、ユーザーがフィールドに特定の日付を入力する InfoPath のフォームに取り組んでいます。
次に、その年の残り日数を計算する数式が必要です。私も一日一日を大切にしたいと思っています。毎日の費用が 2 ドルで、入力された日付が 12 月 29 日であるとします。次に、関数が「価格:4 $」を返すようにします
現在、ユーザーがフィールドに特定の日付を入力する InfoPath のフォームに取り組んでいます。
次に、その年の残り日数を計算する数式が必要です。私も一日一日を大切にしたいと思っています。毎日の費用が 2 ドルで、入力された日付が 12 月 29 日であるとします。次に、関数が「価格:4 $」を返すようにします
XPath 2.0 には非常に多くの日付/時刻関数があります。
2012 年の最後の日から現在の日までの日数を取得するには、次を使用できます。
days-from-duration(date("2012-12-31") - current-date() )
ユーザーが入力した日付がある場合は、それ$user-date
を置き換えcurrent-date()
て$user-date
、その年の最後の 12 月の日付オブジェクトを作成する必要があります。これは次のように行うことができます。
days-from-duration(date(concat(year-from-date($user-date), "-12-31")) - $user-date )
(またはが文字列のdate($user-date)
場合は を使用)$user-date
最終的な価格文字列を取得するには、次を使用します。
concat("price: ", 2 * days-from-duration(date(concat(year-from-date($user-date), "-12-31")) - $user-date ), "$")
XPath 1.0:
日付関数がなければ、これらすべてのばかげた計算を手動で行う必要があります。
各月から年末までの日数をマッピングするマップが必要です。その後、行うことができますMap[$month] - $day
。(または、月から年初までの日をマッピングするマップを使用し、それを 365 から減算します。そのマップは既に転がっているので)
現在、XPath 1.0 にはマップがありませんが、文字列を使用してマップをシミュレートできます。
365 - substring-before(substring-after( "1:00, 2:31, 3:59, 4:90, 5:120, 6:151, 7:181, 8:212, 9:243, 10:273, 11:304, 12:334, 13:365", concat($month, ":")), ",") - $day
これは、うるう年以外のすべての年で機能します。
うるう年の場合は、366 を使用し、2 月以降の各月に 1 を加算します。
366 - substring-before(substring-after( "1:00, 2:31, 3:60, 4:91, 5:121, 6:152, 7:182, 8:213, 9:244, 10:274, 11:305, 12:335, 13:366", concat($month, ":")), ",") - $day
うるう年を検出するには、モジュロ計算を行うことができます。すべてのうるう年のマップを使用する方がおそらく簡単です。
concat("0", substring-before(substring-after("...,2000:1,2004:1,2008:1,2012:1,2016:1,...", concat($year, ":")), ",")) * 1
その年が範囲内のうるう年である場合、これは 1 を返します。
次に、すべてをまとめます。
( 365 - substring-before(substring-after( "1:00, 2:31, 3:59, 4:90, 5:120, 6:151, 7:181, 8:212, 9:243, 10:273, 11:304, 12:334, 13:365", concat($month, ":")), ",") - $day) * ( 1 - concat("0", substring-before(substring-after("...,2000:1,2004:1,2008:1,2012:1,2016:1,...", concat($year, ":")), ",")) * 1) + (366 - substring-before(substring-after( "1:00, 2:31, 3:60, 4:91, 5:121, 6:152, 7:182, 8:213, 9:244, 10:274, 11:305, 12:335, 13:366", concat($month, ":")), ",") - $day) * concat("0", substring-before(substring-after("...,2000:1,2004:1,2008:1,2012:1,2016:1,...", concat($year, ":")), ","))