So what do you do as a freelancer working on projects that last weeks or months? Tell your clients to go screw themselves, that you'll be ready when you're ready?
You tell them to define a minimal feature set, and impose that it is actually minimal. This feature set you estimate and give a hard deadline on. Then you tell them that you will iterate based on feedback and add features as directed until such a time as they choose to stop paying you. There is no such thing as "done" in software development.