# Module `lib.tools.date`

Date and time utilities

Expand source code

    # Distributed under Pycameresp License
    # Copyright (c) 2023 Remi BERTHOLET
    # pylint:disable=consider-using-f-string
    """ Date and time utilities """
    import sys
    import time

    def local_time(current_date=None):
            """ Safe local time, it return 2000/1/1 00:00:00 if date can be extracted """
            try:
                    year,month,day,hour,minute,second,weekday,yearday = time.localtime(current_date)[:8]
            except:
                    year,month,day,hour,minute,second,weekday,yearday = 2000,1,1,0,0,0,0,0
            return year,month,day,hour,minute,second,weekday,yearday

    def date_to_string(current_date = None):
            """ Get a string with the current date """
            return date_to_bytes(current_date).decode("utf8")

    def date_to_bytes(current_date = None):
            """ Get a bytes with the current date """
            year,month,day,hour,minute,second = local_time(current_date)[:6]
            return b"%04d/%02d/%02d  %02d:%02d:%02d"%(year,month,day,hour,minute,second)

    def date_ms_to_string():
            """ Get a string with the current date with ms """
            current = time.time_ns()
            ms = (current // 1_000_000)%1000
            current //= 1_000_000_000
            year,month,day,hour,minute,second = local_time(current)[:6]
            return "%04d/%02d/%02d %02d:%02d:%02d.%03d"%(year,month,day,hour,minute,second,ms)

    def mktime(t):
            """ Portable mktime """
            year,month,day,hour,minute,second,weekday,yearday = t
            if sys.implementation.name == "micropython":
                    result = time.mktime((year, month, day, hour, minute, second, weekday, yearday))
            else:
                    result = time.mktime((year, month, day, hour, minute, second, weekday, yearday, 0))
            return result

    def html_to_date(current_date, separator=b"-"):
            """ Convert html date into time integer """
            result = 0
            try:
                    year, month, day = current_date.split(separator)
                    year  = int( year.lstrip(b"0"))
                    month = int(month.lstrip(b"0"))
                    day   = int(  day.lstrip(b"0"))
                    result = mktime((year, month, day, 1,0,0, 0,0))
            except:
                    result = (time.time() // 86400) * 86400
            return result

    def date_to_html(current_date = None, separator=b"-"):
            """ Get a html date with the current date """
            year,month,day = local_time(current_date)[:3]
            return b"%04d%s%02d%s%02d"%(year,separator,month,separator,day)

    def byte_to_int(data):
            """ Convert bytes buffer to integer """
            data = data.lstrip(b"0")
            if len(data) == 0:
                    data = b"0"
            return int(data)

    def html_to_time(time_, separator=b":"):
            """ Convert html time string into time integer """
            result = 0
            try:
                    hour, minute, second = time_.split(separator)
                    hour   = byte_to_int(hour)
                    minute = byte_to_int(minute)
                    second = byte_to_int(second)
                    result = hour * 3600 + minute * 60 * second
            except:
                    try:
                            hour, minute = time_.split(separator)
                            hour   = byte_to_int(hour)
                            minute = byte_to_int(minute)
                            result = hour * 3600 + minute * 60
                    except:
                            pass
            return result

    def time_to_html(t = None, seconds=False):
            """ Convert time into date bytes """
            if t is None:
                    t = time.time()
            t %= 86400
            result =  b"%02d:%02d:%02d"%(t//3600, (t%3600)//60, t%60)
            if seconds is False:
                    result = result[:-3]
            return result

    def date_to_filename(current_date = None):
            """ Get a filename with a date """
            filename = date_to_string(current_date)
            filename = filename.replace("  "," ")
            filename = filename.replace(" ","_")
            filename = filename.replace("/","-")
            filename = filename.replace(":","-")
            return filename

    def date_to_path(current_date=None):
            """ Get a path with year/month/day/hour """
            year,month,day,hour,minute = local_time(current_date)[:5]
            return b"%04d/%02d/%02d/%02dh%02d"%(year,month,day,hour,minute)

## Functions

`def byte_to_int(data)`

  Convert bytes buffer to integer

  Expand source code

      def byte_to_int(data):
              """ Convert bytes buffer to integer """
              data = data.lstrip(b"0")
              if len(data) == 0:
                      data = b"0"
              return int(data)

`def date_ms_to_string()`

  Get a string with the current date with ms

  Expand source code

      def date_ms_to_string():
              """ Get a string with the current date with ms """
              current = time.time_ns()
              ms = (current // 1_000_000)%1000
              current //= 1_000_000_000
              year,month,day,hour,minute,second = local_time(current)[:6]
              return "%04d/%02d/%02d %02d:%02d:%02d.%03d"%(year,month,day,hour,minute,second,ms)

`def date_to_bytes(current_date=None)`

  Get a bytes with the current date

  Expand source code

      def date_to_bytes(current_date = None):
              """ Get a bytes with the current date """
              year,month,day,hour,minute,second = local_time(current_date)[:6]
              return b"%04d/%02d/%02d  %02d:%02d:%02d"%(year,month,day,hour,minute,second)

`def date_to_filename(current_date=None)`

  Get a filename with a date

  Expand source code

      def date_to_filename(current_date = None):
              """ Get a filename with a date """
              filename = date_to_string(current_date)
              filename = filename.replace("  "," ")
              filename = filename.replace(" ","_")
              filename = filename.replace("/","-")
              filename = filename.replace(":","-")
              return filename

`def date_to_html(current_date=None, separator=b'-')`

  Get a html date with the current date

  Expand source code

      def date_to_html(current_date = None, separator=b"-"):
              """ Get a html date with the current date """
              year,month,day = local_time(current_date)[:3]
              return b"%04d%s%02d%s%02d"%(year,separator,month,separator,day)

`def date_to_path(current_date=None)`

  Get a path with year/month/day/hour

  Expand source code

      def date_to_path(current_date=None):
              """ Get a path with year/month/day/hour """
              year,month,day,hour,minute = local_time(current_date)[:5]
              return b"%04d/%02d/%02d/%02dh%02d"%(year,month,day,hour,minute)

`def date_to_string(current_date=None)`

  Get a string with the current date

  Expand source code

      def date_to_string(current_date = None):
              """ Get a string with the current date """
              return date_to_bytes(current_date).decode("utf8")

`def html_to_date(current_date, separator=b'-')`

  Convert html date into time integer

  Expand source code

      def html_to_date(current_date, separator=b"-"):
              """ Convert html date into time integer """
              result = 0
              try:
                      year, month, day = current_date.split(separator)
                      year  = int( year.lstrip(b"0"))
                      month = int(month.lstrip(b"0"))
                      day   = int(  day.lstrip(b"0"))
                      result = mktime((year, month, day, 1,0,0, 0,0))
              except:
                      result = (time.time() // 86400) * 86400
              return result

`def html_to_time(time_, separator=b':')`

  Convert html time string into time integer

  Expand source code

      def html_to_time(time_, separator=b":"):
              """ Convert html time string into time integer """
              result = 0
              try:
                      hour, minute, second = time_.split(separator)
                      hour   = byte_to_int(hour)
                      minute = byte_to_int(minute)
                      second = byte_to_int(second)
                      result = hour * 3600 + minute * 60 * second
              except:
                      try:
                              hour, minute = time_.split(separator)
                              hour   = byte_to_int(hour)
                              minute = byte_to_int(minute)
                              result = hour * 3600 + minute * 60
                      except:
                              pass
              return result

`def local_time(current_date=None)`

  Safe local time, it return 2000/1/1 00:00:00 if date can be extracted

  Expand source code

      def local_time(current_date=None):
              """ Safe local time, it return 2000/1/1 00:00:00 if date can be extracted """
              try:
                      year,month,day,hour,minute,second,weekday,yearday = time.localtime(current_date)[:8]
              except:
                      year,month,day,hour,minute,second,weekday,yearday = 2000,1,1,0,0,0,0,0
              return year,month,day,hour,minute,second,weekday,yearday

`def mktime(t)`

  Portable mktime

  Expand source code

      def mktime(t):
              """ Portable mktime """
              year,month,day,hour,minute,second,weekday,yearday = t
              if sys.implementation.name == "micropython":
                      result = time.mktime((year, month, day, hour, minute, second, weekday, yearday))
              else:
                      result = time.mktime((year, month, day, hour, minute, second, weekday, yearday, 0))
              return result

`def time_to_html(t=None, seconds=False)`

  Convert time into date bytes

  Expand source code

      def time_to_html(t = None, seconds=False):
              """ Convert time into date bytes """
              if t is None:
                      t = time.time()
              t %= 86400
              result =  b"%02d:%02d:%02d"%(t//3600, (t%3600)//60, t%60)
              if seconds is False:
                      result = result[:-3]
              return result