Это известный Python 3.4 issue:
>>> from datetime import datetime
>>> local = datetime(2014, 1, 30, 23, 59, 40, 1999)
>>> datetime.fromtimestamp(local.timestamp())
datetime.datetime(2014, 1, 30, 23, 59, 40, 1998)
Примечание: микросекунд ушел. .timestamp()
уже возвращает результат, который немного меньше, чем 1999
микросекунд:
>>> from decimal import Decimal
>>> local.timestamp()
1391126380.001999
>>> Decimal(local.timestamp())
Decimal('1391126380.0019989013671875')
The rounding is fixed in the next 3.4, 3.5, 3.6 releases:
>>> from datetime import datetime
>>> local = datetime(2014, 1, 30, 23, 59, 40, 1999)
>>> datetime.fromtimestamp(local.timestamp())
datetime.datetime(2014, 1, 30, 23, 59, 40, 1999)
Чтобы обойти эту проблему, можно использовать явную формулу:
>>> from datetime import datetime, timedelta
>>> local = datetime(2014, 1, 30, 23, 59, 40, 1999)
>>> datetime.utcfromtimestamp(local.timestamp())
datetime.datetime(2014, 1, 30, 23, 59, 40, 1998) # UTC time
>>> datetime(1970, 1, 1) + timedelta(seconds=local.timestamp())
datetime.datetime(2014, 1, 30, 23, 59, 40, 1999) # UTC time
Примечание: вход во всех примерах - это местное время, но результатом является время UTC в последнем.
Я думаю, что это из-за операций с плавающей точкой, если вы печатаете, вы найдете значение, которое будет '1391144380.001999'. И при его преобразовании он теряет последний бит.То же самое не произойдет, если оно не так близко к следующему десятичному значению: '(2014, 1, 30, 23, 59, 40, 1996)' – roymustang86