World No.1 Djokovic was hoping to reach the final of the season-ending tournament for the eighth time but came up against Zverev in exceptional form, the No.3 seed winning 7-6 (7-4) 4-6 6-3.
Neither player managed to get a break point until the 10th game, such was the quality of serving, and it was Zverev who was put under pressure. He responded well, though, with an exceptional serve before saving himself and denying Djokovic a one-set lead.
Zverev then wasted two break points of his own in the next game, the set ultimately going to a tie-break, and the match's first double fault from Djokovic handed the advantage to his opponent, who came out on top in a lengthy rally and then saw a blistering serve give him the set.
Djokovic initially looked rattled and frustrated at the start of the second set, yet a bad miss from Zverev let him off the hook as the five-time champion avoided suffering an early break.
Zverev took just 58 seconds to win the fifth game and go 3-2 up and his next service game was also won to love, but Djokovic finally got the elusive first break to make it 5-4 before converting his fifth set point.
Djokovic could not take that momentum into the decider and, although it went with serve for the first three games, a sloppy showing in game four allowed Zverev to pounce for his first break of the match.
He survived a brief wobble and a break point before eventually closing out a wonderful victory, serving to love again as he set up a final clash with the defending champion Daniil Medvedev.