在 Freemarker 中使用 NetSuite 日期
Working With NetSuite Dates in Freemarker
我一直在尝试向 NetSuite 中的声明高级 PDF 模板添加 "Days Open" 列和 "Days Overdue" 列。但是,我一直 运行 处理来自 NetSuite 记录的日期值的问题。试图操纵日期值不断导致未指定的错误。对于我现在是否可以完成这项工作,我有点困惑。
例如,如果我将以下内容应用于模板,它可以格式化输入到模板中的任何日期和 date/time 值:
<#setting date_format="dd-MM-yyyy">
<#setting datetime_format="dd-MM-yyyy hh:mm a">
但是,如果我尝试将这些值用作 date/datetime 对象,则会出错。因此,尝试执行以下操作失败:
<#assign d2 = line.duedate?long>
虽然这有效:
<#assign d1 = .now?date?long>
此外,尝试假设该值实际上是传入的字符串并转换为 date/datetime 也会失败。执行以下操作会导致错误:
<#assign d2 = line.datecol?date("M/d/yyyy")> // format used by default in NetSuite date output
另一件没有意义的事情是检查到期日期并仅在有到期日期时显示一个值(防止显示不是实际发票的报表条目的数据)。因此,即使在完成的 PDF 中设置并显示了截止日期,以下内容也无法显示正确的结果:
<#if line.duedate?has_content>${daysoverdue}<#else>empty</#if>
它不会显示过期值(此时只是用于测试的静态值),而是显示 "empty"。无论到期日期值是否可用,每一行的整个列都将显示为该字段为空。所以,我不知道这是否相关。
我已经研究了一段时间了,到目前为止还没有找到任何有用的搜索结果。
这里发生了一些事情:
line.duedate
并不总是具有有效的日期值 - 即:当该行是贷记凭证时,没有到期日适用。在这种情况下,尝试将 line.duedate?long
分配给变量将导致错误。为避免这种情况,您可以先检查以确保其有效。
- 但是,使用
?has_content
并不像您预期的那样适用于此。很难确切地确定这是为什么,但在 Freemarker 文档中有一条线索可以说明为什么会这样(强调已添加):
has_content
It is true if the variable exists (and isn't Java null) and is not "empty", otherwise it is false. The meaning of "empty" depends on the concrete case. This follows intuitive common-sense ideas. The following are empty: a string with 0 length, a markup output value with 0 length markup, a sequence or hash with no sub variables, a collection which has passed the last element. If the value is not of any of these types, then it counts as non-empty if it's a number or a date or a boolean (e.g. 0 and false are not empty), otherwise it counts as empty. Note that when your data-model implements multiple template model interfaces you may get unexpected results. However, when in doubt you can use always use expr!?size > 0 or expr!?length > 0 instead of expr?has_content.
This buit-in is exceptional in that you can use the parentheses trick like with the default value operator. That is, you can write both product.color?has_content and (product.color)?has_content. The first doesn't handle the case when product is missing, the last does.
line.datecol?date("M/d/yyyy")
将不起作用,因为 datecol
,例如 duedate
被 Freemarker 识别为 date_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>
然后您可以在其中一列中使用 ${daysoverdue}
。您可以按照类似的过程来计算和显示开放天数。
我一直在尝试向 NetSuite 中的声明高级 PDF 模板添加 "Days Open" 列和 "Days Overdue" 列。但是,我一直 运行 处理来自 NetSuite 记录的日期值的问题。试图操纵日期值不断导致未指定的错误。对于我现在是否可以完成这项工作,我有点困惑。
例如,如果我将以下内容应用于模板,它可以格式化输入到模板中的任何日期和 date/time 值:
<#setting date_format="dd-MM-yyyy">
<#setting datetime_format="dd-MM-yyyy hh:mm a">
但是,如果我尝试将这些值用作 date/datetime 对象,则会出错。因此,尝试执行以下操作失败:
<#assign d2 = line.duedate?long>
虽然这有效:
<#assign d1 = .now?date?long>
此外,尝试假设该值实际上是传入的字符串并转换为 date/datetime 也会失败。执行以下操作会导致错误:
<#assign d2 = line.datecol?date("M/d/yyyy")> // format used by default in NetSuite date output
另一件没有意义的事情是检查到期日期并仅在有到期日期时显示一个值(防止显示不是实际发票的报表条目的数据)。因此,即使在完成的 PDF 中设置并显示了截止日期,以下内容也无法显示正确的结果:
<#if line.duedate?has_content>${daysoverdue}<#else>empty</#if>
它不会显示过期值(此时只是用于测试的静态值),而是显示 "empty"。无论到期日期值是否可用,每一行的整个列都将显示为该字段为空。所以,我不知道这是否相关。
我已经研究了一段时间了,到目前为止还没有找到任何有用的搜索结果。
这里发生了一些事情:
line.duedate
并不总是具有有效的日期值 - 即:当该行是贷记凭证时,没有到期日适用。在这种情况下,尝试将line.duedate?long
分配给变量将导致错误。为避免这种情况,您可以先检查以确保其有效。- 但是,使用
?has_content
并不像您预期的那样适用于此。很难确切地确定这是为什么,但在 Freemarker 文档中有一条线索可以说明为什么会这样(强调已添加):
has_content
It is true if the variable exists (and isn't Java null) and is not "empty", otherwise it is false. The meaning of "empty" depends on the concrete case. This follows intuitive common-sense ideas. The following are empty: a string with 0 length, a markup output value with 0 length markup, a sequence or hash with no sub variables, a collection which has passed the last element. If the value is not of any of these types, then it counts as non-empty if it's a number or a date or a boolean (e.g. 0 and false are not empty), otherwise it counts as empty. Note that when your data-model implements multiple template model interfaces you may get unexpected results. However, when in doubt you can use always use expr!?size > 0 or expr!?length > 0 instead of expr?has_content.
This buit-in is exceptional in that you can use the parentheses trick like with the default value operator. That is, you can write both product.color?has_content and (product.color)?has_content. The first doesn't handle the case when product is missing, the last does.
line.datecol?date("M/d/yyyy")
将不起作用,因为datecol
,例如duedate
被 Freemarker 识别为date_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>
然后您可以在其中一列中使用 ${daysoverdue}
。您可以按照类似的过程来计算和显示开放天数。