Xml 在Freemarker中使用NetSuite日期

Xml 在Freemarker中使用NetSuite日期,xml,netsuite,freemarker,bfo,Xml,Netsuite,Freemarker,Bfo,我一直在努力尝试在NetSuite中的声明高级PDF模板中添加“开放天数”列和“过期天数”列。但是,在处理从NetSuite记录中获取的日期值时,我一直遇到问题。试图操纵日期值会导致未指定的错误。我有点困惑,我现在是否能做到这一点 例如,如果我将以下内容应用于模板,则可以对输入到模板中的任何日期和日期/时间值进行格式化: <#setting date_format="dd-MM-yyyy"> <#setting datetime_format="dd-MM-yyyy hh:mm

我一直在努力尝试在NetSuite中的声明高级PDF模板中添加“开放天数”列和“过期天数”列。但是,在处理从NetSuite记录中获取的日期值时,我一直遇到问题。试图操纵日期值会导致未指定的错误。我有点困惑,我现在是否能做到这一点

例如,如果我将以下内容应用于模板,则可以对输入到模板中的任何日期和日期/时间值进行格式化:

<#setting date_format="dd-MM-yyyy">
<#setting datetime_format="dd-MM-yyyy hh:mm a">

但是,如果我尝试将这些值用作日期/日期时间对象,则会出现错误。因此,尝试执行以下操作失败:

<#assign d2 = line.duedate?long>

虽然这样做有效:

<#assign d1 = .now?date?long>

此外,尝试假定值实际上是传入的字符串,并且转换为日期/日期时间也会失败。执行以下操作会导致错误:

<#assign d2 = line.datecol?date("M/d/yyyy")> // format used by default in NetSuite date output
//NetSuite日期输出中默认使用的格式
另一件毫无意义的事情是对照到期日进行检查,并仅在有到期日时显示值(防止实际不是发票的对账单条目显示数据)。因此,即使在已完成的PDF中设置并显示了截止日期,以下内容也无法显示正确的结果:

<#if line.duedate?has_content>${daysoverdue}<#else>empty</#if>
${daysoferdue}空
它不会显示过期值(此时只是用于测试的静态值),而是显示“空”。无论到期日值是否可用,每行的整个列都将显示为字段为空。所以,我不知道这是否相关


我已经研究了一段时间,到目前为止,haaven还没有找到任何有用的搜索方法。

这里有一些事情:

  • line.duedate
    并不总是具有有效的日期值-即:当该行是贷方备忘时,没有适用的到期日期。在这种情况下,尝试将
    line.duedate?long
    赋值给变量将导致错误。为了避免这种情况,您可以先检查以确保它是有效的
  • 但是,使用
    ?has_content
    并不像您所期望的那样适用于此。很难确定这到底是什么原因,但Freemarker文档中有一条线索可以解释这可能是什么原因(重点补充):
  • 有内容

    如果变量存在(且不是Java null)且不是“空”,则为true,否则为false。“空”的含义取决于具体情况。这遵循直觉的常识观念。以下内容为空:长度为0的字符串、长度为0的标记输出值、不含子变量的序列或哈希、已传递最后一个元素的集合。如果该值不是这些类型中的任何一种,则如果它是数字、日期或布尔值(例如0和false不为空),则它将计为非空,否则它将计为空请注意,当您的数据模型实现多个模板模型接口时,您可能会得到意外的结果。但是,如果有疑问,您可以始终使用expr!?大小>0或expr!?长度>0而不是expr?具有\u内容

    此内置项是一个例外,因为您可以像使用默认值运算符一样使用括号技巧。也就是说,您可以同时编写product.color?has_content和(product.color)?has_content。第一个不处理产品丢失的情况,最后一个处理

  • line.datecol?日期(“M/d/yyyy”)
    将不起作用,因为Freemarker将
    datecol
    ,如
    duedate
    识别为
    date\u like
    ——而不是字符串。其中为空,
    duedate
    被识别为字符串,但当然与格式不匹配,为空
  • daysoverdue
    在语句的数据模型中似乎不可用,但是可以进行计算
  • 要综合所有这些要点,您可以首先检查到期日是否有效,然后计算逾期天数:

    <#if line.duedate?is_date_like>
      <#assign d2 = line.duedate?long>
      <#assign daysoverdue = ((.now?date?long - d2) / (24*60*60*1000))?floor>
    <#else>
      <#assign d2 = "">
      <#assign daysoverdue = "">
    </#if>
    
    
    
    然后可以在其中一列中使用
    ${daysoferdue}
    。您可以按照类似的过程计算和显示开放日。

    我需要的是“is_date_like”,谢谢。我在文档中没有看到这一点。