Views exposed date filter using "Is between" doesn't include end date SITUATION:

Create a view of transactions (a custom entity in my case, but I don't think this is relevant)
Filter against Authored on (which includes both the date and time of creation)
Expose the filter
Choose Operator: Is between
Display the view with 10/01/2020 and 10/31/2020 as start and end dates for October
Note: I'm using the Date Popup module for date entry, which accepts mm/dd/yyyy

PROBLEM:
Transactions on 10/31/2020 are omitted. How can I include end-date transactions, short of telling users to put 11/01/2020 instead of 10/31/2020 (which is what seems natural to them)?
SOLUTION:
Thanks to @prkos in his answer below that a time of 23:59:59 must be included with the end date to compare up to the last second of the day. After learning this, I added a custom submit function to the exposed filter that appends the end time, like so:
use \Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_views_exposed_form_alter(&amp;$form, FormStateInterface $form_state, $form_id) {
  // Use array_unshift() so custom submit runs before default submit
  array_unshift($form['#submit'], '_my_submit_function');
}

function _my_submit_function($form, FormStateInterface $form_state) {
  $created = $form_state-&gt;getValue('created');
  if ($created['max']) {
    $created['max'] = $created['max'] . ' 23:59:59';
    $form_state-&gt;setValue('created', $created);
  }
}

Thanks to @No Sssweat for pointing out in his accepted answer below that array_unshift must be used to make the submit function run before the default. Initially, I simply used
$form['#submit'][] = '_my_submit_function'; // Don't do this. It doesn't work

See the accepted answer below from @No Sssweat for an alternative method of solving the problem using views_query_alter. I tried this and it worked as well, although in the end I chose the simpler of the two solutions.
UPDATE:
Turns out that, although the &quot;simpler&quot; hook_form_alter solution appeared to work, changing the value of the filter by adding a time breaks the filter if you move to another page in the list because the filter is passed via the query string to the page and it includes the time, which won't display in the date field. Given this, I reverted back to the views_query_alter approach, which doesn't have the same problem. My simple code is
function mymodule_views_query_alter($view, $query)
{
  if (!empty($query-&gt;where[1]['conditions'])) {
    foreach ($query-&gt;where[1]['conditions'] as $key =&gt; &amp;$value) {
      if (strpos($value['field'], '.created &lt;=')) {
        $e = explode(' ', $value['field']);
        $e[2] += (24 * 60 * 60) - 1;
        $value['field'] = implode(' ', $e);
      }
    }
  }
}

Note that I have switched from using IS BETWEEN to using two, separate tests against the Author On variable, on with &gt;= and one with &lt;=. You can see in the code that I'm modifying only the &lt;= instance.
I agree this implementation lacks some UX polishing.
The reason why that day is omitted in your case is because you're not including the time, so a time of 00:00:00 is assumed, which is the beginning of the day and most of that day's time will be excluded. The first day also assumes it, but because it's the beginning of the range it includes the whole day.
The solution is to use the time along with the date, and give clues to users to orientate them with using Placeholder example values and the Filter field Description:
Empty form:

After filling in:

You can come up with better UX Label and Description, I'm just demonstrating a good starting point.