Zenit said a fee was agreed on with City, Garcia passed a medical, and ''will join up with the team in the near future.''
Garcia, 27, left after two years with City, where he won the English Premier League and League Cup last season. City's signing of Brazilian midfielder Fernando in June meant extra competition for Garcia's holding midfield role.
Garcia said Zenit manager Andre Villas-Boas, formerly of Tottenham and Chelsea, persuaded him to switch to Russia.
''He's one of the main reasons I've come to Petersburg,'' Garcia said. ''Andre told me a lot about the club's project, and that we can achieve a lot together.''