Talend Open Studio中t-map转换字符串至日期的异常问题
解决Talend Open Studio中特殊日期"12/30/1899 00:00:00 AM"的转换异常问题
我之前也碰到过Talend里这个1899-12-30日期的坑,大概率是原始数据里的空值、空格或者无效值被Talend自动转成了这个Excel风格的默认日期(Excel把1900-01-01作为日期起始值1,0就对应1899-12-30)。给你几个针对性的解决思路:
先排查原始数据真实值
先在数据流里加一个tLogRow组件,输出这两个日期字段的原始字符串值,确认是不是空字符串、全空格或者0值。Talend读取CSV时,如果字段定义为Date类型,会自动把这类无效值映射成12/30/1899这个日期,所以建议先把这两个字段的元数据类型设为String读取,避免提前被转换。在tMap中添加条件判断过滤异常值
在tMap的转换表达式里,先判断原始值是不是这个特殊日期,再进行解析:row1.dateField.equals("12/30/1899 00:00:00 AM") || StringHandling.IS_EMPTY(row1.dateField) ? null // 或者你需要的默认日期,比如TalendDate.getCurrentDate() : TalendDate.parseDate("MM/dd/yyyy hh:mm:ss aa", row1.dateField)这样就能跳过无效值的转换,返回你期望的结果。
用Java原生解析逻辑增强容错性
如果Talend自带的TalendDate.parseDate对这个特殊日期处理还是有问题,可以改用Java的SimpleDateFormat来处理,同时捕获异常:- 在tMap的Imports标签里添加:
import java.text.SimpleDateFormat; - 转换表达式写:
try { new SimpleDateFormat("MM/dd/yyyy hh:mm:ss aa").parse(row1.dateField); } catch (Exception e) { null; // 异常时返回null或默认值 }- 在tMap的Imports标签里添加:
输出组件的空值设置
在tOutputDelimited组件里,找到这两个日期字段的设置,确保勾选了Allow null value,这样当转换后返回null时,输出的CSV里会是空值,而不会被填充成奇怪的默认日期。
内容的提问来源于stack exchange,提问作者Steve Fortiber
相关产品推荐
相关产品推荐

