blob: 76d7f8bcdbaa365472c584f41ec5ccb7e814e091 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# The Timestamp type.
Timestamp = datetime.datetime
# There is a loss of precision when converting from Rust timestamps,
# which are accurate to the nanosecond,
# to Python datetimes, which have a variable precision due to the use of float as representation.
class _UniffiConverterTimestamp(_UniffiConverterRustBuffer):
@staticmethod
def read(buf):
seconds = buf.read_i64()
microseconds = buf.read_u32() / 1000
# Use fromtimestamp(0) then add the seconds using a timedelta. This
# ensures that we get OverflowError rather than ValueError when
# seconds is too large.
if seconds >= 0:
return datetime.datetime.fromtimestamp(0, tz=datetime.timezone.utc) + datetime.timedelta(seconds=seconds, microseconds=microseconds)
else:
return datetime.datetime.fromtimestamp(0, tz=datetime.timezone.utc) - datetime.timedelta(seconds=-seconds, microseconds=microseconds)
@staticmethod
def check_lower(value):
pass
@staticmethod
def write(value, buf):
if value >= datetime.datetime.fromtimestamp(0, datetime.timezone.utc):
sign = 1
delta = value - datetime.datetime.fromtimestamp(0, datetime.timezone.utc)
else:
sign = -1
delta = datetime.datetime.fromtimestamp(0, datetime.timezone.utc) - value
seconds = delta.seconds + delta.days * 24 * 3600
nanoseconds = delta.microseconds * 1000
buf.write_i64(sign * seconds)
buf.write_u32(nanoseconds)
|