A recruiter opens your profile in Greenhouse and sorts by "last five years of relevant experience." Your Experience section says Jan 2019 – Current on one role and 2017-2019 on another. Depending on how Greenhouse, Workday, Lever, iCIMS or Taleo tokenize those strings, your tenure either lands in structured start/end fields—or the gap between jobs looks twice as long as it really was. Employment dates are not decorative. They are the inputs that power experience filters, job-hopping flags and "years of experience" calculations.
I build Smart Resume Analyzer, an ATS resume checker, and I have spent nine years as a Principal Software Engineer writing search and matching code in PHP, Laravel and Node. I wrote this with help from AI tools and checked every command and claim myself. This piece covers how common ATS products parse start and end dates, what "Present" and overlapping roles become, how career gaps show up in filters, and how to rewrite date lines so the parser and the recruiter see the same timeline.
How does ATS parse employment dates and career gaps?
Direct answer: Most ATS parsers pull start and end month/year from each Experience entry into structured fields, then compute tenure and gaps. Write Month YYYY – Month YYYY (or Present) in plain text next to the title, keep one role per block, and avoid graphics, tables or mashed freelance date lines that leave end dates empty or overlapping.
What the Experience block actually becomes
After upload, your resume is not one blob of text. The parser tries to fill a candidate employment history. Dates usually land in four places:
| Destination | Typical source on the resume | What breaks it |
|---|---|---|
| Start date field | First date-looking token in the role block | "Early 2019", seasons, or missing month |
| End date field | Second date, or "Present" / "Current" | "Ongoing", "to date", or no end date at all |
| Tenure / years of experience | Computed from start and end | Overlapping roles counted twice; gaps inflated |
| Recruiter keyword / boolean search | Raw resume text still indexed | Fancy en-dashes, icons, two-column date columns |
The structured fields power filters ("show me people with 5+ years"). The raw text still powers keyword search. You need both to be correct—the same rule as how ATS parses your resume contact header: plain text, one idea per line, no icons.
How Greenhouse, Workday, Lever, iCIMS and Taleo treat dates
Vendors differ, and each employer's configuration differs more. Treat this as a safe operating assumption, not a claim about one customer's setup.
| ATS | How dates usually land | Gaps / overlapping roles | Safe assumption for your resume |
|---|---|---|---|
| Greenhouse | Parsed into employment start/end; recruiters filter and boolean-search | Gaps are visible on the timeline view |
MMM YYYY – MMM YYYY or Present; one role per block |
| Lever | Profile employment dates plus resume text search | Tags and notes are common for contractors | Same; keep agency and client dates explicit |
| Workday | Strong structured profile fields; often asks dates again on the form | Application questions can override resume parsing | Mirror form answers on the resume exactly |
| iCIMS | Profile fields and resume keyword search | Gaps often reviewed manually after parse | Do not hide gaps with vague year-only ranges |
| Taleo | Parsed fields vary heavily by Oracle/Taleo config | Screening questions may ask for years of experience | Answer questions and keep resume dates consistent |
These products extract tokens and fill fields; they do not "understand" clever timelines. Graphic date columns on the right side of a two-column layout drop extraction quality—the same failure mode as hidden characters that break ATS keyword matching.
Tokenization: what "Jan 2019 – Present" becomes
A simplified tokenizer lowercases text and keeps month names, digits and a few connectors:
import re
def date_tokens(s):
return re.findall(r"[a-z0-9]+", s.lower())
samples = [
"Jan 2019 – Present",
"01/2019 - Current",
"2019–2022",
"Early 2019 to Now",
"March 2019 – Present (contract)",
]
for s in samples:
print(s, "->", date_tokens(s))
Typical output:
Jan 2019 – Present -> ['jan', '2019', 'present']
01/2019 - Current -> ['01', '2019', 'current']
2019–2022 -> ['2019', '2022']
Early 2019 to Now -> ['early', '2019', 'to', 'now']
March 2019 – Present (contract) -> ['march', '2019', 'present', 'contract']
"Present" and "Current" are the words most parsers map to an open end date. "Now", "Ongoing" and "to date" are weaker. Year-only ranges (2019–2022) often become January–December defaults—or leave the month null so tenure math is wrong. "Early 2019" is not a parseable month.
Weak vs ATS-optimized date lines
| Weak | ATS-optimized | Why |
|---|---|---|
2019 – Present |
January 2019 – Present |
Month fills the start field; year-only is ambiguous |
Jan '19 – Current |
January 2019 – Present |
Two-digit years and apostrophes confuse some parsers |
01/19 - 03/22 |
January 2019 – March 2022 |
Numeric short dates collide with day/month locales |
2018-2020 (various contracts) |
Separate blocks per engagement with clear dates | One mashed line hides gaps and overlaps |
| Date only in a right-hand column or sidebar | Date on the same line as title/company in the main flow | Side columns are often skipped or read out of order |
Freelance 2017–2024 as one blob |
Group short gigs under one umbrella with a date span, then list clients | Same pattern as contractor and fractional resumes |
Summer 2020 internship |
June 2020 – August 2020 |
Seasons are not months |
| Overlapping full-time roles with no note | Keep both date ranges; add "(concurrent)" or clarify part-time/contract | Unexplained overlap looks like a parse error or a lie |
A few extra words; not stuffing—just field-friendly.
Career gaps: what parsers see vs what recruiters decide
Parsers do not "reject" a gap. They leave empty time between an end date and the next start date. Recruiters and hiring managers then interpret that empty stretch. Common failure modes:
-
Inflated gap from missing months.
2020 – 2021next to2022 – Presentcan look like a year off even if you left in December 2021 and started in January 2022. -
Hidden gap from overlapping mush. One line that says
2018–2024 various rolesprevents the ATS from building a clean timeline and invites manual scrutiny. - Education or parental leave not labeled. If you were in a degree program or on leave, a short clarifying line in the Experience or a separate Education/Leave note beats silence—without oversharing.
- Form vs resume mismatch. Workday and Taleo often re-ask dates. A three-month difference between the PDF and the form is a trust problem.
Honest framing beats clever formatting. If you freelanced, studied, or cared for family, say so in plain language near the dates. Do not invent continuous employment with fuzzy ranges.
Keep dates next to the role, under a standard heading
Use a heading parsers already recognize—Experience, Work Experience, or Professional Experience—as covered in resume section headings ATS parsers recognize. Put company, title and Month YYYY – Month YYYY in the first two lines of each block. Do not invent a "Timeline" section or put dates only in a graphic.
Diagnostic checklist: employment dates in 10 minutes
- Paste each Experience block into a plain-text editor. Fix columns, text boxes or icons at the source.
-
Normalize every role to
Month YYYY – Month YYYYorPresent. Spell the month; use four-digit years. -
Replace "Current", "Now", "Ongoing" with
Presentunless a specific employer form demands another word. - Split mashed contract blobs into separate dated blocks or one clearly labeled umbrella role.
- Check for unexplained overlaps and mark concurrent or part-time work explicitly.
- Measure gaps honestly. If a gap is real, add one plain clarifying phrase—do not stretch neighboring dates.
- Align resume dates with the application form before you click Submit.
-
Search the PDF for each year and for
Presentto confirm nothing broke in export. - Re-parse with an ATS-style checker such as my ATS parser online.
- Match LinkedIn employment dates to the resume story.
Pre-submit checklist
- [ ] Every role shows
Month YYYY – Month YYYYorPresentin plain text - [ ] No year-only ranges on roles you care about for tenure filters
- [ ] No two-digit years, seasons or "Early/Late YYYY"
- [ ] No dates trapped in side columns, tables or graphics
- [ ] Overlaps labeled (concurrent, part-time, contract)
- [ ] Real gaps left honest with a short clarifying note if needed
- [ ] Application form dates match the resume
- [ ] LinkedIn dates match the resume
Frequently asked questions
Should I use MM/YYYY or full month names?
Full month names (January 2019) are the safest default across Greenhouse, Lever, Workday, iCIMS and Taleo. Numeric 01/2019 often works, but day/month locale confusion and leading-zero stripping show up enough that spelled months are worth the extra characters.
Is "Present" better than "Current"?
Use Present. It is the token most parsers and recruiter guides expect for an open-ended role. "Current" usually works; "Now", "Ongoing" and "to date" are less reliable.
Will a career gap automatically reject my application?
No. Parsers record the gap; humans decide. Unexplained multi-year gaps invite questions. A one-line note (study, caregiving, freelance, layoff and job search) is better than stretching dates to hide it.
How should contractors show many short roles?
Prefer one umbrella employer or "Independent Contractor" block with a clear date span, then bullet the client work underneath—or separate dated blocks if each engagement was long. Avoid a single undated laundry list.
Do overlapping jobs look like a lie to ATS?
Overlaps are common for part-time, contract and teaching roles. Parsers will store both ranges. Label concurrency so a recruiter does not assume a data error. Unexplained double full-time ranges are what trigger scrutiny.
Should LinkedIn dates match my resume exactly?
Yes. Recruiters compare them. A three-month drift or a missing role on one side creates avoidable follow-up questions and can look like sloppiness even when the work is real.
Follow & Connect
- YouTube: Resume Boost AI (@resume-boost-ai)
- TikTok: Resume Boost AI (@resumeboostai)
- X: Muhammad Ali Mughal (@AliMughal887)
- GitHub: Muhammad Ali Mughal (@ali111887)
- LinkedIn: Muhammad Ali Mughal

Top comments (0)