Source code for pymap.parsing.specials.datetime_
from __future__ import annotations
from datetime import datetime, tzinfo
from .. import Params, Parseable
from ..exceptions import InvalidContent
from ..primitives import QuotedString
from ...bytes import BytesFormat
__all__ = ['DateTime']
[docs]
class DateTime(Parseable[datetime]):
"""Represents a date-time quoted string from an IMAP stream.
Args:
when: The date-time value.
raw: The raw bytestring from IMAP parsing.
"""
def __init__(self, when: datetime, raw: bytes | None = None) -> None:
super().__init__()
if when.tzinfo is None:
when = when.replace(tzinfo=self.get_local_tzinfo())
self.when = when
self._raw = raw
@property
def value(self) -> datetime:
"""The date-time value."""
return self.when
[docs]
@classmethod
def get_local_tzinfo(cls) -> tzinfo | None:
"""The system timezone, used when no timezone is specified."""
return datetime.now().astimezone().tzinfo
[docs]
@classmethod
def parse(cls, buf: memoryview, params: Params) \
-> tuple[DateTime, memoryview]:
string, after = QuotedString.parse(buf, params)
try:
when_str = str(string.value, 'ascii')
when = datetime.strptime(when_str, '%d-%b-%Y %X %z')
except ValueError as exc:
raise InvalidContent(buf) from exc
return cls(when, string.value), after
def __bytes__(self) -> bytes:
if self._raw is None:
raw_str = self.value.strftime('%d-%b-%Y %X %z')
self._raw = bytes(raw_str, 'ascii')
return BytesFormat(b'"%b"') % (self._raw, )