This is useful for creating reproducible builds. Defining these via -D triggers warnings, and can cause bugs (presently, e.g. PR29119). It makes it also impossible to override DATE and TIME and forget TIMESTAMP.
TIMESTAMP has slightly different semantics in that it's the timestamp of the current TU, not the time of compilation, but either meaning is bad for reproducible builds.
This seems like a fairly random place for this code. It is far removed from any other handling of preprocessor-related options.