crontool
Paste a schedule, read it in English, see the next runs.

The % Sign Breaks Cron Commands

Cron treats an unescaped % specially: the first % ends the command and everything after it becomes standard input, and later % become newlines. That silently breaks date formats like date +%Y-%m-%d. Escape each percent as \% in the crontab.

Escape every percent

Put a backslash before each %:

* * * * * echo $(date +\%Y-\%m-\%d) >> /var/log/job.log

Without the backslashes cron cuts the command at the first % and the date format never runs.

Why this happens

In crontab, % is a metacharacter: the text before the first unescaped % is the command, and text after it is fed to the command on stdin, with additional % acting as newlines. This only applies inside crontab lines, not in scripts.

Cleaner fix: move it into a script

Put the logic in a shell script and call the script from cron. Inside the script % has no special meaning, so date +%Y-%m-%d works normally.

FAQ

Why does % break my cron command?

Cron treats % as a metacharacter: the first % ends the command and the rest becomes stdin, later % become newlines. So date +%Y silently fails.

How do I escape % in crontab?

Put a backslash before each percent: date +\%Y-\%m-\%d. Or move the command into a script where % is not special.

Does % need escaping inside a script called by cron?

No. The % rule only applies to the crontab line itself. Inside a shell script called from cron, use % normally.