I commit every time I complete an atomic unit of work. Write a 3-line test and a 3-line method that passes it? Commit.
Working on something that will take a week to be atomically complete and testable? (For instance, a major refactoring.) I'll write myself a checklist of steps and commit every time I complete a step.
As someone else said, once every 30 sec is too often, and once a day is too infrequent if you're coding 8 hours a day. When I'm in a rhythm I'll typically go anywhere from 10 min to 2 hours between non-trivial (e.g. typo-fix) commits.
I do not push every commit immediately. Once a day is a good minimum as a backup strategy and if you want to make sure you can work on the codebase from elsewhere or if you have a CI system to warn you of merge conflicts.
I'll also push whenever I complete a ticket (for long-running branches we typically have sub-tickets, or I'll push when I've completed work that someone I'm sharing the branch with can build on.) Git makes it easy to develop those units of work on separate branches, and when you merge them back to the feature branch is generally a good time to push.