Source code for yarp.time_and_date
import asyncio
from yarp import NoValue, Value, ensure_value
import datetime as _datetime
__names__ = [
"now",
]
[docs]
def now(interval=1.0, tz=None, loop=None) -> Value:
"""
Returns a :py:class:`Value` containing a :py:class:`datetime.datetime`
object holding the current time, refreshed every ``interval`` seconds.
The ``interval`` argument may be a constant or a :py:class:`Value` giving
the number of seconds to wait between updates. If the Value changes, the
time until the next update will be reset starting from that moment in time.
The ``tz`` argument is passed on to :py:func:`datetime.datetime.now`. This
must be a constant.
The ``loop`` argument should be an :py:class:`asyncio.BaseEventLoop` in
which the delays will be scheduled. If ``None``, the default loop is used.
"""
loop = loop or asyncio.get_event_loop()
interval = ensure_value(interval)
v = Value()
timer_handle = None
next_update_time = loop.time()
def update_time():
nonlocal next_update_time, timer_handle
v.value = _datetime.datetime.now(tz)
next_update_time += interval.value
timer_handle = loop.call_at(next_update_time, update_time)
update_time()
@interval.on_value_changed
def on_interval_changed(new_interval):
nonlocal next_update_time, timer_handle
if timer_handle is not None:
timer_handle.cancel()
next_update_time = loop.time() + interval.value
timer_handle = loop.call_at(next_update_time, update_time)
return v