Safeguard
Developer Tools•

What date and time formats do KEV, EPSS and OSV use?

KEV dateAdded is a bare date, while KEV release, EPSS score_date and OSV timestamps are UTC. Know the formats before you compute any age or window.

Safeguard Security Team
6 min read

KEV's dateAdded is a plain calendar date with no time or zone, while the KEV release time, the EPSS score date and OSV's modified field are UTC timestamps. Convert everything to UTC dates before you compute ages, windows or "per day" counts, or your results can be off by one day.

What each source gives you

Read from the files fetched on 19 October 2026:

SourceFieldExampleNotes
KEVdateAdded2026-10-16Date only, no time zone
KEVdueDate2026-10-19Date only
KEVdateReleased2026-10-16T17:15:48.8752ZTimestamp ending in Z, meaning UTC
EPSSscore_date2026-10-18T12:03:10ZIn the header comment line
OSVmodified, publishedRFC3339, UTCPer the schema, ending in Z
OSVmodified_id.csv2026-10-19T04:00:18.69ZISO date, newest first

The OSV schema defines modified as an RFC3339 timestamp in UTC ending in Z, and says that if two entries share an ID, the later modified time is authoritative.

Where mistakes happen

  1. Treating a bare date as midnight in your local zone. A date such as 2026-10-16 is a calendar day, so keep it as a date.
  2. Comparing a UTC timestamp to a local one. A release at 17:15 UTC is the next day in some zones.
  3. Parsing fractional seconds inconsistently. KEV shows four digits after the decimal and OSV can show more. Use a library that handles both.
  4. Calling a date range "inclusive" without saying so. Say whether the day you added an entry counts.
  5. Computing age as a difference of timestamps in one dataset and dates in another.

Steps for a clean analysis

  1. Parse timestamps as UTC and convert to a date only at the last step.
  2. Keep bare dates as dates, never as datetimes.
  3. When you subtract, say what unit you used: days between dates.
  4. State the weekday rule if you chart by weekday. See which weekdays CISA adds entries.
  5. Record the zone assumption in your methodology.
from datetime import date
added = date.fromisoformat("2026-10-16")
due = date.fromisoformat("2026-10-19")
print((due - added).days)  # 3

Why it matters for time to exploit or fix

Any claim about "days from CVE to KEV" mixes a CVE publication timestamp and a KEV date. If one is UTC time and the other a bare date, a one day error can change a median or a share of "same day" cases. State the rule: "we compared UTC calendar dates". For one such analysis, see how old CVEs are when CISA adds them.

A worked example with a one day error

Take the KEV entry added on 2026-10-16 with a due date of 2026-10-19. The gap is three days when you subtract the bare dates. Across the catalog, the author found that the most common gap in the 2026.10.16 file was 21 days (1,025 entries), followed by 14 days (277) and 181 days (238), with 3 days for 139 entries. Those counts only make sense when both ends are dates.

Now suppose you compare dateAdded to the CVE's publication timestamp from a record that ends with Z. If you treat the date as midnight in a zone west of UTC and the timestamp as UTC, a flaw published late on 15 October UTC could appear to be published after the KEV date, giving a negative age. The fix is to convert the publication timestamp to a UTC date and then subtract two dates.

Rules for subtraction

You haveYou wantDo this
Date and dateDays betweenSubtract directly
Timestamp and dateDays betweenConvert the timestamp to a UTC date first
Timestamp and timestampHours or daysSubtract in UTC, then state the unit
Local time from a logComparison with datasetsConvert to UTC before anything else

State the rule in the methodology: "ages are differences between UTC calendar dates".

Weekday and cadence charts

If you chart additions by weekday, a bare date has no time zone, so the weekday is the calendar weekday of that date. A timestamp has to be converted to a UTC date before you assign a weekday. If you convert to a local zone for some rows and not others, the chart will mix definitions. For a weekday analysis of KEV, see which weekdays CISA adds entries.

EPSS dates

The EPSS header gives a score date with a time. When you say "scores from 18 October", you mean that timestamp. If you want a series, take one file per day and note each one's time. Days are not necessarily evenly spaced in time, though the file is described as published daily. FIRST describes a probability and percentile published every day for every CVE.

OSV dates

OSV timestamps carry UTC and can include more digits after the decimal point than KEV. Use a parser that accepts both. The modified time of a record is the key to freshness, and if two entries share an ID, the later modified time is authoritative per the schema. When you count records changed in a window, define the window as UTC timestamps, for example from midnight to midnight UTC.

Try it yourself

Click through it at your own pace, or open it full screen. Watch how the timing of a new disclosure drives what you do first.

Quick check

Should I convert KEV dateAdded to my local time zone?

No. It has no time component. Treat it as a calendar date.

What does the trailing Z mean?

It marks a UTC timestamp, also called Zulu time.

What if my data has a local time and I do not know the zone?

Do not guess. Mark the field as ambiguous, report how many rows are affected and avoid computing sub day differences.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.