Zero's are irrelevant for detecting zero-crossings. (They do however hold positions in the list).
Zeros can be removed from the original list, provided that we keep track of the positions of the remaining numbers. Then we only need to detect when the sign changes from one number to the next.
zeroCrossings[l_] := (c=Complement[Range[Length[l]], Flatten@Position[l, 0]])[[{#, #+ 1}]] & /@ Complement[Range[Length[d = Differences[Sign@l[[c]]]]], Flatten@Position[d, 0]] Using whuber's example and format for presenting zero-crossings:
zeroCrossings[{0, -1, 1, -2, 0, 0, -1, 0, 0, 0, 1, 0, 1, 0, 2, -1, -3, 0, 0}] {{2, 3}, {3, 4}, {7, 11}, {15, 16}}