diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala index 006ef40c80f5..b2b68b9cb10a 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala @@ -101,16 +101,8 @@ object DateTimeUtils { * @return The number of days since epoch from java.sql.Date. */ def fromJavaDate(date: Date): SQLDate = { - val era = if (date.before(julianCommonEraStart)) 0 else 1 - val localDate = LocalDate - .of(date.getYear + 1900, date.getMonth + 1, 1) - .`with`(ChronoField.ERA, era) - // Add days separately to convert dates existed in Julian calendar but not - // in Proleptic Gregorian calendar. For example, 1000-02-29 is valid date - // in Julian calendar because 1000 is a leap year but 1000 is not a leap - // year in Proleptic Gregorian calendar. And 1000-02-29 doesn't exist in it. - .plusDays(date.getDate - 1) // Returns the next valid date after `date.getDate - 1` days - localDateToDays(localDate) + val rebasedMicros = rebaseJulianToGregorianMicros(millisToMicros(date.getTime)) + microsToDays(rebasedMicros) } /** @@ -127,8 +119,8 @@ object DateTimeUtils { * @return A `java.sql.Date` from number of days since epoch. */ def toJavaDate(daysSinceEpoch: SQLDate): Date = { - val localDate = LocalDate.ofEpochDay(daysSinceEpoch) - new Date(localDate.getYear - 1900, localDate.getMonthValue - 1, localDate.getDayOfMonth) + val rebasedMicros = rebaseGregorianToJulianMicros(daysToMicros(daysSinceEpoch)) + new Date(microsToMillis(rebasedMicros)) } /**