I have a similar solution - instead of using contextual filters, I have an exposed date filter using BETWEEN. They are hidden using CSS, and are filled out "in the background" in the views_exposed_form submit. In that submit function, you can using $form_state->setValue('field_start_date_time_value', 'min', '2018-01-01') and $form_state->setValue('field_start_date_time_value', 'max', '2019-01-01') to get everything in 2018. Similar,y month would be 2018-01-01 to 2018-02-01. Obviously you can substitute any part of that date with variables from the custom filters you create as shown in the guide.
I have a similar solution - instead of using contextual filters, I have an exposed date filter using BETWEEN. They are hidden using CSS, and are filled out "in the background" in the views_exposed_form submit. In that submit function, you can using $form_state->setValue('field_start_date_time_value', 'min', '2018-01-01') and $form_state->setValue('field_start_date_time_value', 'max', '2019-01-01') to get everything in 2018. Similar,y month would be 2018-01-01 to 2018-02-01. Obviously you can substitute any part of that date with variables from the custom filters you create as shown in the guide.