Halladay ended Jorge Cantu's major league-record streak of 10 games with at least one hit and one RBI, and Dan Uggla hit a solo shot for Florida.
Pitching in a steady rain, Halladay (3-0) shrugged off the conditions and allowed two runs and eight hits. He threw 100 pitches, struck out four and didn't walk a batter.
"I think you go out and do the same things," Halladay said. "There's not a lot you can do to change anything. My approach is the same."
Florida took advantage of three infield hits to score four runs off David Herndon in the ninth before Ryan Madson got the last two outs for his third save in three tries. Madson retired Cantu on a fielder's choice grounder with two runners on to end it.
Acquired from Toronto in a blockbuster deal last December, Halladay tossed a seven-hit shutout against Houston last Sunday. The former AL Cy Young winner has a 1.13 ERA in three starts.
"He pitches ahead, throws strikes with command and is in control of his emotions," Marlins manager Fredi Gonzalez said. "He's really good."
Utley has connected in four straight games and has six homers this season. Placido Polanco also went deep for Philadelphia.
Marlins starter Anibal Sanchez (0-1) struggled through six innings, allowing one run and eight hits.
A crowd of 45,245 - the 46th consecutive sellout at Citizens Bank Park - turned out on a dreary night, mostly to watch Halladay pitch his first game in red pinstripes. Many were forced to stand on the concourse because of the driving rain.
Though the game was never stopped, there were a couple long delays between innings while the grounds crew worked on the field.
If it weren't for the rain, Phillies manager Charlie Manuel said he would've sent Halladay out for the ninth.
"He does a tremendous job and he has a knack for closing out innings with a short amount of pitches," Manuel said.
Halladay, who has 50 career complete games, didn't protest much when Manuel pulled him.
"I go out until they tell me I'm done," he said. "You can't finish them all."