In TimerTrigger.java the check is implemented by:
public FormValidation doCheckSpec(@QueryParameter String value, @AncestorInPath Item item) {
try {
CronTabList ctl = CronTabList.create(fixNull(value), item != null ? Hash.from(item.getFullName()) : null);
which I guess is finding the name of the item in the URL for the hash.
It looks like "Build Periodically" is using the checkUrl:http://<jenkins>/job/TestCron/descriptorByName/hudson.triggers.TimerTrigger/checkSpec?value=%40daily but "Poll SCM" is using http://<jenkins>/trigger/TimerTrigger/check?value=%40daily.
So Poll SCM is probably unable to find the item name in the URL so initialises the hash with null and generates the previous and next times for that. This matches up with the fact that changing the job name affects the periodic schedule but not the SCM schedule (which is 0 apart from the seconds).
In TimerTrigger.java the check is implemented by:
which I guess is finding the name of the item in the URL for the hash.
It looks like "Build Periodically" is using the checkUrl:http://<jenkins>/job/TestCron/descriptorByName/hudson.triggers.TimerTrigger/checkSpec?value=%40daily but "Poll SCM" is using http://<jenkins>/trigger/TimerTrigger/check?value=%40daily.
So Poll SCM is probably unable to find the item name in the URL so initialises the hash with null and generates the previous and next times for that. This matches up with the fact that changing the job name affects the periodic schedule but not the SCM schedule (which is 0 apart from the seconds).