我目前正在使用InfoPath中的表单,用户在字段中输入特定日期。
然后,我想要一个公式来计算一年中剩余的天数。我也想每天珍惜成本。假设每天花费2美元,输入日期是12月29日。然后我希望函数返回“price:4 $”
答案 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, ":")), ","))