在平面文件“MMddyyyy”和“MMddyyyyHHmm”中的一行中有两种日期格式

时间:2016-02-15 14:18:03

标签: spring-batch

如果我在平面文件中的一行中有2种日期格式,我该如何使用org.springframework.beans.propertyeditors.CustomDateEditor。

<bean id="dateEditor1"  class="org.springframework.beans.propertyeditors.CustomDateEditor">
<constructor-arg>
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="MMddyyyy" />
  </bean>
    </constructor-arg>
 <constructor-arg value="true" />
</bean>


<bean id="dateEditor2" class="org.springframework.beans.propertyeditors.CustomDateEditor">

<constructor-arg>
    <bean class="java.text.SimpleDateFormat">
        <constructor-arg value="MMddyyyyHHmm" />
    </bean>
</constructor-arg>
<constructor-arg value="true" />

</bean>

<property name="customEditors">
      <map>
        <entry key="java.util.Date" value-ref="dateEditor1"/>
        <entry key="java.util.Date" value-ref="dateEditor1"/>
      </map>
</property> 

我正在尝试上面的代码。但它不起作用。我正在使用PatternMatchingCompositeLineMapper。

2 个答案:

答案 0 :(得分:1)

使用以下自定义日期格式:

public class CustomDateFormats extends DateFormat {

private static final long serialVersionUID = 1L;
private static final String[] formats = new String[] { "MMddyyyy", "MMddyyyyHHmm", "MMdd" };
Date result = null;

@Override
public StringBuffer format(final Date date, final StringBuffer toAppendTo, final FieldPosition fieldPosition) {
    throw new UnsupportedOperationException("This custom date formatter can only be used to *parse* Dates.");
}

@Override
public Date parse(final String source, final ParsePosition pos) {
    Date res = null;

    for (String format : formats) {
        if (source != null && format.length() == source.length()) {
            SimpleDateFormat sdFormat = new SimpleDateFormat(format);
            res = sdFormat.parse(source, pos);
            break;
        }
    }
    return res;
 }

 }
 <bean id="dateEditor1"       class="org.springframework.beans.propertyeditors.CustomDateEditor">
    <constructor-arg>
<bean class="com.disney.wdpro.service.transaction.processing.batch.domain.logicalBatchOpen.CustomDateFormats" />
    </constructor-arg>
    <constructor-arg value="true" />
</bean>

                                                                 

答案 1 :(得分:0)

你不能这样做。查看使用java.util.Date作为键的地图,然后您希望它保存2个值。 map不会以这种方式工作,如果密钥已经存在,它将始终覆盖该值。因此,在您的情况下,您必须编写一个自定义bean来在平面文件中设置这些字段。

根据Spring doc,每个属性路径只支持一个注册的自定义编辑器。

但是你可以编写一个自定义的dateformat类,它将包含不同日期格式的列表,并使用此类自动装配到自定义编辑器。 例如,如下所示,或者您创建自定义编辑器并包装CustomDateEditor列表,有多种用途,您可以参考下面的一个示例。

<bean id="customer4" class="org.testSpring.util.DateBeanTest4">
    <property name="birthDate">
        <bean factory-bean="customDateFormat" factory-method="parse">
            <constructor-arg value="31-01-2010" />
            <!-- mm/dd/yyyy, dd-MM-yyyy, yyyyMMdd -->
        </bean>
    </property>
</bean>
   <bean id="customDateFormat" class="org.testSpring.util.CustomDateFormats">
</bean>

您的格式化程序类

public class CustomDateFormats extends DateFormat {

private static final List<? extends DateFormat> DATE_FORMATS = Arrays.asList(
    // or inject thorough construction with a list of formats
    new SimpleDateFormat("dd-MM-yyyy"),
    new SimpleDateFormat("mm/dd/yyyy"),
    new SimpleDateFormat("yyyyMMdd")); 


@Override
public StringBuffer format(final Date date, final StringBuffer toAppendTo, final FieldPosition fieldPosition) 
{
    throw new UnsupportedOperationException("This custom date formatter can only be used to *parse* Dates.");
}

@Override
public Date parse(final String source, final ParsePosition pos) {
    Date res = null;
    for (final DateFormat dateFormat : DATE_FORMATS) {
        if ((res = dateFormat.parse(source, pos)) != null) {
            return res;
        }
    }

    return null;
}

}