获取今天日期的功能?

时间:2019-02-19 20:44:50

标签: daml

我正在合同模板内创建一个“选择”,该合同需要检查今天的日期。我的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*”的地方。

2 个答案:

答案 0 :(得分:3)

tldr::使用getTime : Update TimetoDateUTC : Time -> Date, 但要注意陷阱。最好使用公证日期 模式(如果可能)。

隐式建模日期/时间

建模日期和时间始终是一个微妙的问题,当 处理确定性的分布式系统,例如数字 分类帐。 DAML提供了一个原始函数getTime,它将返回 分类帐模型保证的“分类帐有效时间”(LET)是 单调递增的时间值(以毫秒为单位),即 限制在壁钟UTC时间的分类帐定义的增量内。 可以使用中的toDateUTC函数将其转换为UTC日期。 DA.Date。这是您问题的直线答案,但有 一些警告。

  1. 此时间和日期为UTC,您必须显式建模 这与当地时间如何对应。由于DAML是确定性的, 分布式系统,没有给定交易的本地时间 必须在多个时区确定地执行。

  2. 随意使用日期/时间比较可能会导致合同产生 由于时间的流逝而隐性地停滞了。如果选择受到保护 通过检查挂钟时间,这可能意味着 您的应用程序在进行练习时可能会导致选择 变得无效。确保您在自己的情况下正确处理此案 应用程序代码是一个微妙的问题,因为这是一个隐式问题 您选择的参数,无需操作干预 即使您有高级警告,也可以避免该问题。

  3. 模型和应用程序的集成测试成为 在明确的时间中不确定性和不可重复性 比较。您可以为自己编写可重复的Scenario测试 模型,因为您在那里拥有对LET的显式控制,所以不会 行使您的分类帐申请。

显式建模日期/时间

替代方法是公证日期格式。在这里,签署人 合同约定受托方可以公证当前日期。这个 公证采用账本上的CurrentDate合约形式。 该合同以公证人为签字人,通常具有 由公证人控制的单一消费选择,以推进 日期。

如果使用这种方法,您的Add_Car选择将需要额外的费用 参数currentDate : ContractId CurrentDate,您可以认为 作为控制者提供证据或证明已同意的 为此,公证人已证明了当前日期 合同。这样可以解决隐式时间模型的问题:

  1. 因为日期现在在分类帐上是显式的,所以时区在 CurrentDate合同的进度。

  2. 如果公证人提前履行合同,合同仍然可以停滞 当前日期合同,日期管理的明确性质意味着 a)在公证日期更新之前进行的任何演习将是 处理成功;这意味着,b)现在有一条通往 事先警告您的操作干预 给定日期的处理已落后于计划-假设这样 公证协议预期并允许进行干预。

  3. 由于系统的操作再次只是分类帐内容的纯函数,因此较大应用程序的行为变得确定性和可重复性。这大大减少了所需的工作量 进行维护,测试和调试。

由于这些原因,我建议使用公证日期格式,其中 这是可能的,在以下情况下保留隐式Date处理: 真的没有其他选择。

答案 1 :(得分:2)

assert之前,您可以bind the result of the getTime function。然后,我建议通过startCoverageTime functions in DA.DatetoGregorian转换为datetime

您可能没有足够的信息来使用示例代码正确执行此操作; Date是一个“本地日期”,应该相对于某个时区进行解释,而Time是一个绝对的UNIX时期偏移量。出于这个原因,手册中列出了toDateUTC的许多警告,建议不要使用该功能。

此外,请记住,只有“分类帐有效时间”可用,这与“当前时间”不太一样。当然,为了进行Add_Car的实时练习,getTime的结果将与当前时间相对应。但是,事务必须是可重播的(出于验证或其他原因),对于这些执行,getTime将产生其在行使时的原始状态。您无法使用getTime来确定DAML执行某些代码所需的挂钟时间,这意味着即使在实时锻炼分类帐中,有效时间也不能精确地对应于壁挂式时间-时钟。当您运行test scenarios时,时间从UNIX时代开始,并且可以根据您的测试要求在场景中手动进行调整。实际上,我可以建议使用passpassToDate来测试您正在编写的合同。