class_docstr: Waits until the specified datetime.
  
  A major advantage of this sensor is idempotence for the ``target_time``.
  It handles some cases for which ``TimeSensor`` and ``TimeDeltaSensor`` are not suited.
  
  **Example** 1 :
      If a task needs to wait for 11am on each ``execution_date``. Using
      ``TimeSensor`` or ``TimeDeltaSensor``, all backfill tasks started at
      1am have to wait for 10 hours. This is unnecessary, e.g. a backfill
      task with ``{{ ds }} = '1970-01-01'`` does not need to wait because
      ``1970-01-01T11:00:00`` has already passed.
  
  **Example** 2 :
      If a DAG is scheduled to run at 23:00 daily, but one of the tasks is
      required to run at 01:00 next day, using ``TimeSensor`` will return
      ``True`` immediately because 23:00 > 01:00. Instead, we can do this:
  
      .. code-block:: python
  
          DateTimeSensor(
              task_id="wait_for_0100",
              target_time="{{ next_execution_date.tomorrow().replace(hour=1) }}",
          )
  
  :param target_time: datetime after which the job succeeds. (templated)
class_docstr_tok: ["Waits","until","the","specified","datetime",".","A","major","advantage","of","this","sensor","is","idempotence","for","the","``","target_time","``",".","It","handles","some","cases","for","which","``","TimeSensor","``","and","``","TimeDeltaSensor","``","are","not","suited",".","*","*","Example","*","*","1",":","If","a","task","needs","to","wait","for","11am","on","each","``","execution_date","``",".","Using","``","TimeSensor","``","or","``","TimeDeltaSensor","``",",","all","backfill","tasks","started","at","1am","have","to","wait","for","10","hours",".","This","is","unnecessary",",","e.g",".","a","backfill","task","with","``","{","{","ds","}","}","=","'1970-01-01","'","``","does","not","need","to","wait","because","``","1970-01-01T11:00:00","``","has","already","passed",".","*","*","Example","*","*","2",":","If","a","DAG","is","scheduled","to","run","at","23:00","daily",",","but","one","of","the","tasks","is","required","to","run","at","01:00","next","day",",","using","``","TimeSensor","``","will","return","``","True","``","immediately","because","23:00",">","01:00",".","Instead",",","we","can","do","this",":","..","code-block",":",":","python","DateTimeSensor","(","task_id=","''","wait_for_0100","''",",","target_time=","''","{","{","next_execution_date.tomorrow","(",")",".replace","(","hour=1",")","}","}","''",",",")",":","param","target_time",":","datetime","after","which","the","job","succeeds",".","(","templated",")"]
code: def poke(self, context: Context) -> bool:
      self.log.info(
          "Checking if the time (%s) has come", self.target_time
      )
      return timezone.utcnow() > timezone.parse(self.target_time)
  
file_path: airflow/airflow/sensors/date_time.py
imports: from __future__ import annotations
  import datetime
  from typing import TYPE_CHECKING, Sequence
  from airflow.sensors.base import BaseSensorOperator
  from airflow.triggers.temporal import DateTimeTrigger
  from airflow.utils import timezone
label_desc: Use image node_id 2 for calling the DateTimeSensor obj's underlying member method code with example usage: obj.poke(context) and returns: unknown