我正在合同模板内创建一个“选择”,该合同需要检查今天的日期。我的DAML代码如下:
controller dealer can
Add_Car : CarId
with
startCoverage: Date
do
-- Check for a legal start date
assert (
startCoverage > *today* --should check that its not before today
)
create this with date_vehicle_added = startCoverage
我可以用来获取当前日期的函数的名称是什么?它需要转到显示“ *today*
”的地方。
答案 0 :(得分:3)
tldr::使用getTime : Update Time
和toDateUTC : Time -> Date
,
但要注意陷阱。最好使用公证日期
模式(如果可能)。
建模日期和时间始终是一个微妙的问题,当
处理确定性的分布式系统,例如数字
分类帐。 DAML提供了一个原始函数getTime
,它将返回
分类帐模型保证的“分类帐有效时间”(LET
)是
单调递增的时间值(以毫秒为单位),即
限制在壁钟UTC时间的分类帐定义的增量内。
可以使用中的toDateUTC
函数将其转换为UTC日期。
DA.Date
。这是您问题的直线答案,但有
一些警告。
此时间和日期为UTC,您必须显式建模 这与当地时间如何对应。由于DAML是确定性的, 分布式系统,没有给定交易的本地时间 必须在多个时区确定地执行。
随意使用日期/时间比较可能会导致合同产生 由于时间的流逝而隐性地停滞了。如果选择受到保护 通过检查挂钟时间,这可能意味着 您的应用程序在进行练习时可能会导致选择 变得无效。确保您在自己的情况下正确处理此案 应用程序代码是一个微妙的问题,因为这是一个隐式问题 您选择的参数,无需操作干预 即使您有高级警告,也可以避免该问题。
模型和应用程序的集成测试成为
在明确的时间中不确定性和不可重复性
比较。您可以为自己编写可重复的Scenario
测试
模型,因为您在那里拥有对LET
的显式控制,所以不会
行使您的分类帐申请。
替代方法是公证日期格式。在这里,签署人
合同约定受托方可以公证当前日期。这个
公证采用账本上的CurrentDate
合约形式。
该合同以公证人为签字人,通常具有
由公证人控制的单一消费选择,以推进
日期。
如果使用这种方法,您的Add_Car
选择将需要额外的费用
参数currentDate : ContractId CurrentDate
,您可以认为
作为控制者提供证据或证明已同意的
为此,公证人已证明了当前日期
合同。这样可以解决隐式时间模型的问题:
因为日期现在在分类帐上是显式的,所以时区在
CurrentDate
合同的进度。
如果公证人提前履行合同,合同仍然可以停滞 当前日期合同,日期管理的明确性质意味着 a)在公证日期更新之前进行的任何演习将是 处理成功;这意味着,b)现在有一条通往 事先警告您的操作干预 给定日期的处理已落后于计划-假设这样 公证协议预期并允许进行干预。
由于系统的操作再次只是分类帐内容的纯函数,因此较大应用程序的行为变得确定性和可重复性。这大大减少了所需的工作量 进行维护,测试和调试。
由于这些原因,我建议使用公证日期格式,其中 这是可能的,在以下情况下保留隐式Date处理: 真的没有其他选择。
答案 1 :(得分:2)
在assert
之前,您可以bind the result of the getTime
function。然后,我建议通过startCoverage
和Time
functions in DA.Date将toGregorian
转换为datetime
。
您可能没有足够的信息来使用示例代码正确执行此操作; Date
是一个“本地日期”,应该相对于某个时区进行解释,而Time
是一个绝对的UNIX时期偏移量。出于这个原因,手册中列出了toDateUTC
的许多警告,建议不要使用该功能。
此外,请记住,只有“分类帐有效时间”可用,这与“当前时间”不太一样。当然,为了进行Add_Car
的实时练习,getTime
的结果将与当前时间相对应。但是,事务必须是可重播的(出于验证或其他原因),对于这些执行,getTime
将产生其在行使时的原始状态。您无法使用getTime
来确定DAML执行某些代码所需的挂钟时间,这意味着即使在实时锻炼分类帐中,有效时间也不能精确地对应于壁挂式时间-时钟。当您运行test scenarios时,时间从UNIX时代开始,并且可以根据您的测试要求在场景中手动进行调整。实际上,我可以建议使用pass
或passToDate
来测试您正在编写的合同。