Here is the code that flush cache on first hit of a day:

      public function build() {
        ...
        ...
        ...
        $this->handleCacheTag($build['#cache']['tags']);
      }
    
    
      protected function handleCacheTag(&$tags) {
        // Get the current date number.
        $current_date_number = date('z');
        $last_date_number = \Drupal\Core\Site\Settings::get('module_name.foo.date_counter', $current_date_number);
        // If last date in settings is different from current day, invalidate
        // tags.
        if ($last_date_number < $current_date_number) {
          $invalid_tags = range($last_date_number, $current_date_number);
          array_walk($invalid_tags, function(&$invalid_tag){
            $invalid_tag = 'foo:date.' . $invalid_tag;
          });
          Cache::invalidateTags($invalid_tags);
        }
        Settings::set('module_name.foo.date_counter', $current_date_number);
        $tags[] = 'foo:date.' . $current_date_number;
      }