La Gazzetta dello Sport says the 50-year-old has signed a two-year contract with Zenit worth nearly £8million a season.
The 50-year-old has been out of job since late August and has been linked with Milan, Zenit, Atletico and Real Madrid.
Spalletti will join Zenit in time for the start of the next Russian championship.