InfoPath(XPath)剩余的一天

时间:2012-10-01 07:54:30

标签: xpath infopath infopath2010

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

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

1 个答案:

答案 0 :(得分: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),如果$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, ":")), ","))