解析 2 位数字的年份字符串受到一些相关解释的约束,这些解释记录在SimpleDateFormat docs https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html:
为了使用缩写年份模式(“y”或“yy”)进行解析,SimpleDateFormat 必须解释相对于某个世纪的缩写年份。它通过将日期调整为创建 SimpleDateFormat 实例之前 80 年和创建之后 20 年之内来实现此目的。例如,使用模式“MM/dd/yy”和创建于 1997 年 1 月 1 日的 SimpleDateFormat 实例,字符串“01/11/12”将被解释为 Jan 11, 2012,而字符串“05/04/ 64”将被解释为 1964 年 5 月 4 日。
So, 2043
由于距今已有 20 多年的时间,解析器使用记录的 1943 年。
这是一种使用 UDF 显式调用的方法set2DigitYearStart
on a SimpleDateFormat
在解析日期之前对象(我选择 1980 只是作为例子):
def parseDate(date: String, pattern: String): Date = {
val format = new SimpleDateFormat(pattern);
val cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 1980)
val beginning = cal.getTime();
format.set2DigitYearStart(beginning)
return new Date(format.parse(date).getTime);
}
进而:
val custom_to_date = udf(parseDate _);
df.withColumn("newdate", custom_to_date($"Date", lit("mm/dd/yy"))).show(false)
+--------+----------+
|Date |newdate |
+--------+----------+
|06/03/35|2035-01-03|
|07/24/40|2040-01-24|
|11/15/43|2043-01-15|
|12/15/12|2012-01-15|
|11/15/20|2020-01-15|
|12/12/22|2022-01-12|
+--------+----------+
了解您的数据,您就会知道为参数选择哪个值set2DigitYearStart()