clone() is only implemented meaningfully in some classes, because there are a lot of decisions involved in cloning that the JVM or the compiler doesn't make for you (e.g., shallow vs. deep copying). Some would also argue that the whole concept in Java is broken and therefore rarely used.
The end result, however, is that many classes cannot be cloned. In these cases, a user clones them by generating and initializing one object based on the other.
However, the Date class implements cloneable, so there isn't really a benefit in this specific case compared to just using the "copy constructor".
One situation where cloning is preferable is when you are working with class hierarchies. Imagine you are representing a mathematical expression as a tree of Expression subtypes, where you reference the "outermost" expression. Let's say that in this case it is a Plus. You would call clone on your reference to an Expression, but what you would really get is a new instance of Plus. With constructors you can't really do that because your Expression could be an interface or an abstract class.