The six-time individual time trial British champion attacked from a small group of breakaway riders some 17km from the finish and maintained his advantage to beat Italian Salvatore Puccio and Briton Matthew Holmes.
Portugal's Joao Almeida retained the overall leader's Maglia Rosa after a quiet day in the main bunch.
The overall contenders are set to be the main focus on Monday when the ninth stage takes the peloton over 208km from San Salvo to Roccaraso in the Abruzzo mountains.
Briton Simon Yates of Mitchelton-Scott was withdrawn from the race on Saturday after testing positive for the novel coronavirus.