diff --git a/python/pyspark/sql/types.py b/python/pyspark/sql/types.py index 920cf009f599..94dd385138e6 100644 --- a/python/pyspark/sql/types.py +++ b/python/pyspark/sql/types.py @@ -178,6 +178,9 @@ def fromInternal(self, v): return datetime.date.fromordinal(v + self.EPOCH_ORDINAL) +_is_utc = time.tzname[time.daylight] == "UTC" + + class TimestampType(AtomicType): """Timestamp (datetime.datetime) data type. """ @@ -196,7 +199,10 @@ def toInternal(self, dt): def fromInternal(self, ts): if ts is not None: # using int to avoid precision loss in float - return datetime.datetime.fromtimestamp(ts // 1000000).replace(microsecond=ts % 1000000) + y, m, d, hh, mm, ss, _, _, _ = (time.gmtime(ts // 1000000) if _is_utc + else time.localtime(ts // 1000000)) + ss = min(ss, 59) # leap seconds support + return datetime.datetime(y, m, d, hh, mm, ss, ts % 1000000) class DecimalType(FractionalType):