Turn plain English into a due date and a repeat rule

Type a task the way you would say it. The parser finds the date ("tomorrow", "next friday", "sep 14", "in 3 days"), a start date ("start monday"), a repeat ("every weekday", "every other tuesday", "the 1st of every month") and a time of day, then gives you an ISO date, an RRULE and the task title with those words removed. It is the same parser the GetItDone task box runs as you type, and it never invents a date the text does not state.

Repeats: Every 3 weeks on Fri after completion.

Task title
Deep clean
Due date
None
Start date
None
Today in UTC
2026-10-30

Repeat rule

RRULE
FREQ=WEEKLY;INTERVAL=3;BYDAY=FR
In plain English
Every 3 weeks on Fri after completion
First day it may fall on
Friday, October 30, 2026 (UTC)
Notes
  • This rule repeats after completion: each next date is counted from the day you finish, so there is no fixed list of dates. RFC 5545 cannot express that, so the RRULE above is the calendar version of the same cadence.
Show the JSON the API returns for this text
{
  "input": "Deep clean every 3 weeks after I finish it",
  "tz": "UTC",
  "today": "2026-10-30",
  "strippedTitle": "Deep clean",
  "dueDate": null,
  "startDate": null,
  "rrule": "FREQ=WEEKLY;INTERVAL=3;BYDAY=FR",
  "recurrence": {
    "rrule": "FREQ=WEEKLY;INTERVAL=3;BYDAY=FR",
    "description": "Every 3 weeks on Fri after completion",
    "startDate": "2026-10-30",
    "timezone": "UTC",
    "nextDates": [],
    "notes": [
      "This rule repeats after completion: each next date is counted from the day you finish, so there is no fixed list of dates. RFC 5545 cannot express that, so the RRULE above is the calendar version of the same cadence."
    ]
  },
  "timeOfDay": null,
  "priority": null,
  "projects": [],
  "tokens": [
    {
      "kind": "recurrence",
      "text": "every 3 weeks after I finish it",
      "label": "Every 3 weeks after I finish it"
    }
  ],
  "explanation": "Repeats: Every 3 weeks on Fri after completion."
}

How the parser reads a sentence

  1. Markers that cannot mean anything else go first: #projects and priorities such as p1 or !high.
  2. A time of day ("at 3pm", "15:00") is taken next, so it is never mistaken for a date.
  3. Repeats are read before dates, so "every monday" becomes a schedule rather than a due date, and a trailing "until sep 4" ends the schedule.
  4. Dates with a prefix ("start monday", "due friday") win over a bare one; a bare date is only looked for once nothing else has claimed the words.
  5. What is left, with the spaces tidied, is the task title.

Run it from code, no key needed

The same result as JSON, or as Markdown when you send Accept: text/markdown. Free and rate limited per IP address. Full reference in the free tools API docs.

curl 'https://nowgetitdone.com/api/tools/parse-date?text=review%20the%20report%20every%20friday&tz=America/Toronto'

Questions

What phrases does the date parser understand?
Relative days (today, tomorrow, yesterday, a weekday name, "next friday", "in 3 days", "in two weeks on monday", "next month"), calendar dates ("sep 14", "14 sep", "2026-09-15", "3/15"), explicit due and start dates ("due friday", "start monday"), repeats ("every weekday", "every other tuesday", "every 3 days", "the 1st of every month", "every 3 weeks after I finish it", "until sep 4", "6 times"), a time of day ("at 3pm", "15:00"), priorities ("p1", "!high") and projects ("#ops").
Which timezone are "today" and "tomorrow" counted in?
The one you choose. The page starts with your browser’s timezone; the API uses the tz parameter (an IANA name such as America/Toronto) and falls back to UTC when you leave it out. The response always says which zone and which "today" it used.
Why is the time of day read but not saved?
GetItDone schedules whole days, so the result is a calendar date, not a timestamp. The parser still recognises "at 3pm" so it does not end up in the task title, and reports it separately as "time not saved", exactly as the task box does.
Is there an API for the natural language date parser?
Yes. GET /api/tools/parse-date?text=…&tz=… needs no key and returns JSON (or Markdown with Accept: text/markdown). It is rate limited per IP address, and errors follow RFC 9457 problem+json.
Does it guess when the text has no date?
No. When nothing in the text names a day, the due date stays empty and the whole text is the task title. An impossible date such as 2026-02-31 is left as text rather than rolled over to March.

The same parser runs in the GetItDone task box, where your team and its AI agents share one board of tasks. Try GetItDone free

More free tools

  • Eisenhower matrix — Sort your tasks into Do first, Schedule, Delegate and Drop. Drag them between quadrants, then copy, download or print the list. Free, no sign-up.
  • Pomodoro timer — A free pomodoro timer: 25-minute focus sessions, 5-minute breaks and a longer break every fourth session. Adjustable, with no ads and no sign-up.
  • Printable daily planner — Make a printable daily planner: pick the date and your hours, add your top 3, and print it or save it as a PDF. Free, no sign-up, no watermark.
  • Weekly review template — A weekly review template in four steps: look back, clear, look ahead and choose next week’s top 3. Fill it in here, then copy, download or print it.
  • RRULE builder and explainer — Build an RFC 5545 RRULE from a form, or paste one to read it in plain English. See the next 10 dates either way. Free, no sign-up, with a JSON API.
  • Screenshot to tasks — Paste a screenshot or a photo of a list and GetItDone proposes one task per action, dated as written. You approve each one. Try it free as a guest.

Read this page as Markdown — plain text for AI agents and answer engines. The whole site is indexed at /llms.txt.

We use analytics cookies to understand how GetItDone is used. Nothing is collected unless you accept. What we collect