我正在契约(Contract)模板中创建一个“选择”,需要检查今天的日期。我的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*
”所在的位置。
最佳答案
tldr:使用getTime:更新时间
和toDateUTC:时间->日期
,
但要注意其中的陷阱。最好使用公证日期
如果可能的话,模式。
隐式建模日期/时间
对日期和时间建模始终是一个微妙的问题,当
处理确定性的分布式系统,例如数字系统
分类帐。 DAML 提供了一个原始函数 getTime
,它将返回
账本模型保证的“账本有效时间”(LET
)
单调递增的时间值(以毫秒为单位),即
限制在账本定义的挂钟 UTC 时间增量内。
可以使用 toDateUTC
函数将其转换为 UTC 日期
DA.日期
。这是对你的问题的直接回答,但有
一些注意事项。
此时间和日期采用 UTC 格式,您必须显式建模 这与本地时间如何对应。由于 DAML 是确定性的, 分布式系统,任何给定的事务都没有本地时间 必须跨多个时区确定性地执行。
无端使用日期/时间比较可能会导致契约(Contract)被 因时间的流逝而悄然停滞。如果一个选择受到保护 通过检查挂钟时间,这可能意味着任何延迟 您的应用程序处理练习可能会导致选择 变得无效。确保您在自己的国家妥善处理此案 应用程序代码是一个微妙的问题——因为这是一个隐含的问题 参数由您选择,无需操作干预 即使您有提前警告,也可以避免该问题。
模型和应用程序的集成测试变得 在存在明确时间的情况下是非确定性和不可重复的 比较。虽然您可以为您的项目编写可重复的
Scenario
测试 模型,因为您在那里有明确的LET
控制,这不会 行使您的账外应用程序。
显式建模日期/时间
另一种选择是公证日期模式。在此,签署者
契约(Contract)约定受信任方对当前日期进行公证。这
公证采用账本上的 CurrentDate
契约(Contract)的形式。
本契约(Contract)由公证人作为签字人,一般有
由公证人控制的单一消费选择,以推进
日期。
如果您使用此方法,您的 Add_Car
选择将需要额外的时间
参数currentDate : ContractId CurrentDate
,你可以认为
作为控制者提供证据或证明同意的
出于本目的,公证人已证明当前日期
契约(Contract)。这解决了隐式时间模型的问题:
由于日期现在在分类帐上是明确的,所以时区在
CurrentDate
合约的进度。如果公证人提前付款,契约(Contract)仍可能被搁置 当前日期契约(Contract),日期管理手段的明确性 a) 在公证日期更新之前排序的任何事件都将 处理成功;这意味着,b)现在有一条途径 预先警告您的操作干预 某一天的处理进度落后于计划 - 假设这样 公证协议(protocol)预期并允许干预。
由于系统的操作再次成为账本内容的纯粹函数,因此大型应用程序的行为变得确定性且可重复。这大大减少了所需的工作量 用于维护、测试和调试。
出于这些原因,我建议使用公证日期模式,其中 这是可能的,为那些情况保留隐式日期处理 确实没有其他选择。
关于daml - 获取今天日期的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54774634/