我目前正在 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)
, 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, ":")), ","))