class_docstr: Interact with FTP.
  
  Errors that may occur throughout but should be handled downstream.
  You can specify mode for data transfers in the extra field of your
  connection as ``{"passive": "true"}``.
  
  :param ftp_conn_id: The :ref:`ftp connection id <howto/connection:ftp>`
      reference.
class_docstr_tok: ["Interact","with","FTP",".","Errors","that","may","occur","throughout","but","should","be","handled","downstream",".","You","can","specify","mode","for","data","transfers","in","the","extra","field","of","your","connection","as","``","{","``","passive","''",":","``","true","''","}","``",".",":","param","ftp_conn_id",":","The",":","ref",":","`","ftp","connection","id","<","howto\/connection",":","ftp",">","`","reference","."]
docstr: Return a datetime object representing the last time the file was modified.
  
  :param path: remote file path
docstr_tok: ["Return","a","datetime","object","representing","the","last","time","the","file","was","modified",".",":","param","path",":","remote","file","path"]
code: def get_mod_time(self, path: str) -> datetime.datetime:
      """
      Return a datetime object representing the last time the file was modified.
  
      :param path: remote file path
      """
      conn = self.get_conn()
      ftp_mdtm = conn.sendcmd("MDTM " + path)
      time_val = ftp_mdtm[4:]
      # time_val optionally has microseconds
      try:
          return datetime.datetime.strptime(time_val, "%Y%m%d%H%M%S.%f")
      except ValueError:
          return datetime.datetime.strptime(time_val, "%Y%m%d%H%M%S")
  
imports: from __future__ import annotations
  import datetime
  import ftplib
  from typing import Any, Callable
  from airflow.hooks.base import BaseHook
label_desc: Use image node_id 14 for calling the FTPHook obj's underlying member method code with example usage: obj.get_mod_time(path) and returns: datetime, datetime