mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-07-14 01:52:21 +03:00
Fix for serialize datetime
This commit is contained in:
parent
f90cdf2ffb
commit
84cb1e0e0f
|
@ -4,23 +4,11 @@ import struct
|
||||||
from datetime import datetime, date, timedelta, timezone
|
from datetime import datetime, date, timedelta, timezone
|
||||||
import time
|
import time
|
||||||
|
|
||||||
_EPOCH_NAIVE = datetime(*time.gmtime(0)[:6])
|
def _getNativeTimeZone():
|
||||||
_EPOCH_NAIVE_LOCAL = datetime(*time.localtime(0)[:6])
|
offset = time.timezone
|
||||||
_EPOCH = _EPOCH_NAIVE.replace(tzinfo=timezone.utc)
|
if time.localtime().tm_isdst:
|
||||||
|
offset += 1
|
||||||
|
return timezone(timedelta(hours=offset))
|
||||||
def _datetime_to_timestamp(dt):
|
|
||||||
# If no timezone is specified, it is assumed to be in utc zone
|
|
||||||
if dt.tzinfo is None:
|
|
||||||
dt = dt.replace(tzinfo=timezone.utc)
|
|
||||||
# We use .total_seconds() method instead of simply dt.timestamp(),
|
|
||||||
# because on Windows the latter raises OSError on datetimes ~< datetime(1970,1,1)
|
|
||||||
secs = int((dt - _EPOCH).total_seconds())
|
|
||||||
# Make sure it's a valid signed 32 bit integer, as used by Telegram.
|
|
||||||
# This does make very large dates wrap around, but it's the best we
|
|
||||||
# can do with Telegram's limitations.
|
|
||||||
return struct.unpack('i', struct.pack('I', secs & 0xffffffff))[0]
|
|
||||||
|
|
||||||
|
|
||||||
def _json_default(value):
|
def _json_default(value):
|
||||||
if isinstance(value, bytes):
|
if isinstance(value, bytes):
|
||||||
|
@ -142,15 +130,17 @@ class TLObject:
|
||||||
if not dt and not isinstance(dt, timedelta):
|
if not dt and not isinstance(dt, timedelta):
|
||||||
return b'\0\0\0\0'
|
return b'\0\0\0\0'
|
||||||
|
|
||||||
|
try:
|
||||||
if isinstance(dt, datetime):
|
if isinstance(dt, datetime):
|
||||||
dt = _datetime_to_timestamp(dt)
|
dt = int(dt.timestamp())
|
||||||
elif isinstance(dt, date):
|
elif isinstance(dt, date):
|
||||||
dt = _datetime_to_timestamp(datetime(dt.year, dt.month, dt.day))
|
dt = int(datetime(dt.year, dt.month, dt.day).timestamp())
|
||||||
elif isinstance(dt, float):
|
elif isinstance(dt, float):
|
||||||
dt = int(dt)
|
dt = int(dt)
|
||||||
elif isinstance(dt, timedelta):
|
elif isinstance(dt, timedelta):
|
||||||
# Timezones are tricky. datetime.utcnow() + ... timestamp() works
|
dt = int(datetime.fromtimestamp(dt.total_seconds()).timestamp())
|
||||||
dt = _datetime_to_timestamp(datetime.utcnow() + dt)
|
except OSError:
|
||||||
|
dt = 0
|
||||||
|
|
||||||
if isinstance(dt, int):
|
if isinstance(dt, int):
|
||||||
return struct.pack('<i', dt)
|
return struct.pack('<i', dt)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user