0

我目前正在 InfoPath 中处理用户在字段中输入特定日期的表单。

然后我想要一个公式来计算一年中剩余的天数。我也想把每一天都当作成本。假设每天花费 2 美元,输入的日期是 12 月 29 日。然后我希望函数返回“价格:4$”

4

1 回答 1

1

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), if$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, ":")), ","))
于 2012-10-01T10:10:29.783 回答