Schedule/Program execution once at a specific date-time

Hey! I’m trying to offer my users an easy-to-use way of executing a Jenkins Pipeline at a specific date/time of their choosing.
Ideally, they would trigger a pipeline, input certain parameters including a date-time, and then automagically the pipeline would run at that time (days or even weeks after they set it)

For this, I though of creating a “wrapper” pipeline that schedules a second one, but I’m not finding a way to configure that schedule.

Using the “build periodically” option with a cron expression for a single day sounds like the obvious choice but the name of the feature itself hints at the first issue: I need a one-time execution, not a recurring one. It’s also not user friendly and users would need to go into the pipeline configuration to set it (I don’t think I could change it programmatically via jenkinsfiles?)

The Parameterized Scheduler Plugin suffers from pretty much the same issues.

I would obviously like to avoid weird hacky solutions like using Linux/Windows crontab/scheduler or a third pipeline that runs every minute looking at other pipelines to build…

is there really no built-in way to execute a pipeline at a specific date and time in the future?

Schedule Build would do the job. Though it has some limitations.
It basically adds the job to the queue with a correspondingly long delay.
If someone triggers the job with identical parameters, then it will start immediately and the queued entry disappears.
Also if the job has no parameters, as soon as something else triggers the job the queued one is gone.

The problem with the queue could be resolve by adding a otherwise not used parameters that you can give a random value.
Another thing to consider is that when you schedule a build far in the future there is no guarantee that the parameters are still valid when the job starts.

The only “built-in” way without installing additional plugins would be to have wrapper sleep and then trigger the target job:

int hours_to_wait = ...
sleep(unit: 'HOURS', time: hours_to_wait)
build(job: 'target-job', ...)

You can provide the datetime through job parameters, and then do some time manipulation through Java/Groovy internals.