DEV Community

Cover image for How ATS Parses Employment Dates and Gaps
Muhammad Ali Mughal
Muhammad Ali Mughal

Posted on

How ATS Parses Employment Dates and Gaps

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))
Enter fullscreen mode Exit fullscreen mode

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']
Enter fullscreen mode Exit fullscreen mode

"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.

A wall calendar with a few marked months beside a blank notebook and pen on a wooden desk, representing employment timelines and career gaps
AI-generated image.

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:

  1. Inflated gap from missing months. 2020 – 2021 next to 2022 – Present can look like a year off even if you left in December 2021 and started in January 2022.
  2. Hidden gap from overlapping mush. One line that says 2018–2024 various roles prevents the ATS from building a clean timeline and invites manual scrutiny.
  3. 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.
  4. 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

  1. Paste each Experience block into a plain-text editor. Fix columns, text boxes or icons at the source.
  2. Normalize every role to Month YYYY – Month YYYY or Present. Spell the month; use four-digit years.
  3. Replace "Current", "Now", "Ongoing" with Present unless a specific employer form demands another word.
  4. Split mashed contract blobs into separate dated blocks or one clearly labeled umbrella role.
  5. Check for unexplained overlaps and mark concurrent or part-time work explicitly.
  6. Measure gaps honestly. If a gap is real, add one plain clarifying phrase—do not stretch neighboring dates.
  7. Align resume dates with the application form before you click Submit.
  8. Search the PDF for each year and for Present to confirm nothing broke in export.
  9. Re-parse with an ATS-style checker such as my ATS parser online.
  10. Match LinkedIn employment dates to the resume story.

Pre-submit checklist

  • [ ] Every role shows Month YYYY – Month YYYY or Present in 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

Top comments (0)