I am not a teacher or by any means a seasoned pro, but happy to share how I done it (I am sure someone here can improve on it, but it works) -
I have 2 php pages, one for the form display and then a second to process the input.
I appreciate that it is better practice to have the form and the form processing in the same page, and would mean I don’t need to use a session var. But to be honest my code got so complex I decided to split the actions. I will later look to combine within one script, when my brain stops hurting 
Start the first page with
session_start(); $_SESSION["form_started"] = microtime(true);
This opens a session and then sets a session variable to store the time the form page is opened. I use the ‘true’ parameter to return the time in seconds rather than microseconds. Being a session variable it will be available to the second, or process page.
When the form is submitted it opens the second page, and the first thing I do is to open the session again so the variables will be available.
session_start();
Then i set another normal variable to store the time this page opened, because this is also the time the form was submitted.
$form_completed = microtime(true);
Finally I set my time limit as anothe var
$time_limit = 10; // Less than this time and it is probably spam.
Then it is simple maths to calculate the form completion time by subtracting the start time from the finish time.
$form_duration = $form_completed - $_SESSION["form_started"];
I then compare this to my preset value and if it is less, treat as spam
if ($form_duration < $time_limit) { .... } // Action to take if form completed too quickly, indicating probable spam
finally I format the number for reporting and easier debugging so I have seconds to 2 dec places using
number_format((float)$form_duration, 2, '.', '')
Remember, form is probable spam if time to complete it is LESS THAN the time limit and if it’s completed in less than 1 second, it has to be spam. I suggest reporting on times taken to complete and which messages are spam and you can soon come up with a time above which you are confident it is legit, and below which you are confident it is spam.
Regards your second question, simple ‘captcha’ questions like that are quite easy for robots to detect and bypass, but mainly, I hate anything that affects the user experience. I want spam protection but I don’t want to delegate it to all my visitors. It can be the difference between a click and no click.
Don’t forget to change your code so fields are hidden using css rather than html, it is harder for robots to detect. Also I agree with others - don’t notify that spam has been detected or form is rejected, don’t warn spammers that they need to improve their bots!
Note - for my development, emails detected as spam were sent to a separate spam account and all emails had the time to complete added to the message body. In this way I could compare mail content to time taken and settle on an ideal value.
Good luck !