I would say that it depends on what you are doing, how much control you have over the input, and are you storing it somewhere?
For storage, I would use what was suggested by Mike Dunlavey:
YYYYMMDDHHMMSS where the hour is in
UTC is the way I go whenever I have a
choice, for the reasons you give. When
I don't have a choice, I let the user
choose.
He did not leave this as an answer, so I will.
One more thing: check out the following screen shot of how to enter CC expiration date:
http://www.ubercart.org/files/credit_card_checkout.jpg
The great thing about this example is that it does not make you think. It uses both numbers and names for the month. I would consider using something similar for the input. For the month, include both the number and the localized name. For year and day use numeric Up/Down or combo boxes. Then, the calendar control also seems nifty.
As I said, it depends. For storage: if using a database, check if it already provides a good unambiguous data format. If using some other method, see if "YYYYMMDDHHMMSS where the hour is in UTC" helps. For presenting it to the user - take in consideration what countries / locales can be possibly involved, then pick the most straight-forward, "Don't make me think" kind of representation. Also consider providing an option.
Finally, check out some cool products which already do something similar, and try to find out how they do it.