如何将交货日期设置为 Konik 的 ZUGFeRD 库中的某个时间段?

How can I set the delivery date to a time period in Konik's ZUGFeRD library?

我用Konik's Java library for creating electronic invoices in ZUGFeRD format。我想将交货日期设置为一段时间(例如"Q3 2016")。理想情况下,我想使用自定义字符串来表示此日期。

在将 Delivery 对象实例化为我的发票的一部分时,库需要传递一个 ZfDate 对象。由于 ZfDate(及其子类)基于 java.util.Date,因此我根本看不出如何在这种情况下处理时间段或自定义字符串。

这是这个库的限制还是 ZUGFeRD 规范的一般限制?可能有解决方法吗?

据我所知,从法律的角度来看(在德国),在(纸质)发票中使用时间段是可以的,因此电子格式支持此功能会很好还有。

一个 java.util.Date 代表一个瞬间,所以你不能用一个代表一个时期(瞬间的范围)。

三个明显的选择是周期的第一个、中间或最后一个瞬间作为 "the" 瞬间使用。

警告:我 熟悉 Konik 库、ZUGFeRD 或其基础规范。不过我很好奇,就随便逛了一下。

Zf… classes

是的,ZfDate extends the java.util.Date class。 ZfDate依次扩展为其他3个Zf…classes.

正如 Bohemian 的 所说,这意味着您不能存储日期范围,因为该数据类型表示时间轴上的单个时刻。但是请继续阅读我发现的“发票期”。

java.time

java.util.Date 继承是不幸的,因为与 Java 的最早版本捆绑在一起的旧日期时间 classes 现在是遗留的。它们已被 java.time framework built into Java 8 and later. See Oracle Tutorial. Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport and further adapted to Android in ThreeTenABP.

取代

java.time classes 包括 java.util.Datejava.time.Instant, as well as at least 1 of the 3 other Zf… classes, java.time.YearMonth. The ThreeTen-Extra project that extends java.time includes classes for YearQuarter, YearWeek, Interval 等的替换,仅供参考。

发票数据模型

按照您的链接,确定完整的确切规格并不容易。但是指向链接的链接将我带到了:

带有 UN/CEFACT CII 实施指南的欧洲 CORE INVOICE 数据模型指南 - 第 2 部分:欧洲 CORE INVOICE 数据模型

发票期

寻找 Rq024。在第 15 页的 table 中,找到“发票期信息”的定义。

For invoices that charge for services or items delivered over a time period, such as subscriptions or metered services, a Core Invoice may contain information about the date period to which the invoice applies.

作为该期间的一部分,它定义了一对日期,“发票期间开始日期”和“发票期间结束日期”。不幸的是,我找不到“日期”的任何定义。除了这对日期之外,我也没有注意到任何时间跨度的规定,但我只是快速浏览了一下。

ISO 8601

如果您使用字符串作为发票中的符号,请查看 ISO 8601 标准以了解表示各种日期时间值的字符串格式。 ISO 标准不是免费提供的,因此要么购买副本,要么研究 this Wikipedia page.

中的概要

该标准定义了一年中的一周,并提供了诸如 2016-W27 表示某一特定周和 2016-W27-7 表示该周特定日期的符号。

对于 start/end 对,使用斜杠作为分隔符。例如:“2007-03-01T13:00:00Z/2008-05-11T15:30:00Z”。

对于与时间轴无关的时间跨度,请使用 PnYnMnDTnHnMnS。例如,P3M 三个月。

遗憾的是,该标准不提供宿舍。有些人非正式地使用带有 Q 文字的 ISO 8601 样式,例如 2016-Q1.

如果你看一下
的类型层次结构 ZfDate 你会看到 3 个子类型。

这3种类型也代表了ZUGFeRD目前允许的可能性。

  • 日期代码 102 字符串 yyyyMMdd
  • 一年中的月份,代码为 610,字符串为 yyyyMM
  • 一年中的第几周,代码为 616,字符串为 yyyyww

请记住,在您的 ZUGFeRD 发票中使用像 'July to December 2016' 这样的奇特日期会使其他方难以或不可能自动处理发票。如果可能的话,保持简单。另外不要忘记,您可以将此类信息放在发票的可视化表示中(仅 pdf 部分),因为在大多数情况下,此信息仅供人类使用。