首页 > 解决方案 > SAP PI UDF 将没有时间的日期转换为日期时间 ISO8601 字符串

问题描述

我需要为 SAP PI 编写一个 java 函数,它以以下格式为我的 XML 映射返回一个字符串:yyyy-MM-dd T HH:mm:ss(例如,2018-08-15T00:00:00)即使我的源字段只是一个没有时间的日期字段(例如,2018-08-15)。

我已经尝试过SimpleDateFormatJava 类,但我无法让它工作。有没有一种简单的方法可以做到这一点?

在建议的帖子(答案/重复/链接)中,我找不到我要找的东西。猜想我没有足够清楚地描述问题,但问题是我从源 XML (SAP PO) 获取日期,我需要将其转换为目标 XML 中的 ISO 8601 日期。

感谢 Ole,我想出了以下“初学者”功能(为了完整性):

public String DH_FormatDateTimeStringB(String ndate, String npattern, Container container) throws StreamTransformationException{
//This function gets a date from the IDOC and returns it as a datetime string in ISO 8601 (ISO 8601 Representation of dates and times 
//in information interchange required. Ex: npattern = "yyyy-MM-dd")    

       DateTimeFormatter formatterDate = DateTimeFormatter.ofPattern(npattern);
       LocalDate date = LocalDate.parse(ndate, formatterDate);

       //Convert date to datetime
       LocalDateTime localDateTime1 = date.atStartOfDay(); 

       //System.out.println(localDateTime1.toString());

       return localDateTime1.toString(); 
}

因为它现在只需要一个没有时间的日期,它可能会使用“StartOfDay”。也许我稍后会调整它以查看字符串中是否有时间部分。

谢谢大家帮忙!

标签: javasapiso8601sap-xisap-pi

解决方案


    String dateStringFromSapPo = "2018-08-15";
    LocalDate date = LocalDate.parse(dateStringFromSapPo);
    LocalDateTime dateTime = date.atStartOfDay();
    String dateTimeStringForSapPi = dateTime.toString();
    System.out.println("String for SAP PI: " + dateTimeStringForSapPi);

这打印:

SAP PI 的字符串:2018-08-15T00:00

它没有几秒钟,但符合 ISO 8601 标准,因此应该在您的 XML 和 SAP 中工作。如果没有,您将需要使用显式格式化程序:

    DateTimeFormatter dateTimeFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
    String dateTimeStringForSapPi = dateTime.format(dateTimeFormatter);

现在秒数也出来了:

SAP PI 的字符串:2018-08-15T00:00:00

顺便说一句,给你一个没有时区或偏移量的日期时间字符串让我有点担心。这不是一个时间点,将其解释为一个时间点,SAP 将不得不假设一个时区。只有当你确定它选择了预期的那个,你就可以了。如果没有,我很抱歉我不能告诉你解决方案。

链接: Oracle 教程:日期时间解释如何使用java.time


推荐阅读