Date Range Generator

Give it a start, an end and a step, and get every date between them as a column. Steps go from hourly to yearly and include business days, which skip weekends. Formats cover ISO, US, EU, Unix seconds and any custom pattern you type. Add a weekday column, name the column, take up to a million rows.

A year of daily dates is generated the moment the page loads. Change any field and it regenerates.

A date spine is the most useful boring thing in analytics

The reason this exists is the gap problem. Group your orders by day and you get rows only for days that had an order. Chart that and the quiet Tuesday simply does not appear, the line joins Monday to Wednesday, and the dip you were looking for is invisible.

The fix is a date spine: a complete list of every date in the period, left-joined to your data, so the empty days are present with a zero rather than absent. Every BI tool documents the pattern and none of them generates the spine for you.

The same column is the answer to several other jobs: filling a dimension table, generating a billing schedule, producing a list of business days for a capacity plan, or making the date column of a test fixture look like real time rather than like the same day repeated.

Month arithmetic done properly

Stepping by a month from the 31st is where most implementations break. The naive version adds one to the month number and hands the result to a date constructor, which rolls the overflow forward:

FromNaive resultCorrect result
2026-01-312026-03-03, having rolled through February2026-02-28
2024-01-312024-03-022024-02-29, a leap year
2026-01-31stepping a quarter: 2026-05-012026-04-30

Here the day is clamped to the last day of the target month, which is what every accounting system means by "the same date next month". Quarter and year steps use the same arithmetic. The whole thing runs in UTC, so no timezone shifts a date across midnight.

Business days, and where they start

The business-day step advances Monday to Friday and skips Saturday and Sunday. From the 1st of January 2026, a Thursday:

date,weekday
2026-01-01,Thursday
2026-01-02,Friday
2026-01-05,Monday
2026-01-06,Tuesday
2026-01-07,Wednesday

The 3rd and 4th are a Saturday and a Sunday and are not there. If the start date itself falls on a weekend, the first row is the next business day and a note says so, rather than the range quietly beginning a day or two later than you asked.

Public holidays are not skipped, because they differ by country, by region and by year, and a tool that guessed would be wrong for most users. The weekday column plus a filter in the workbench handles a holiday list in one step.

Formats, including one you write yourself

Format3 September 2026 looks like
ISO2026-09-03
US09/03/2026
EU03.09.2026
ISO date and time2026-09-03T00:00:00Z
Unix seconds1788480000
Customwhatever your pattern says

The custom pattern uses the tokens most people already know: YYYY and YY for the year, MM and M for the month number, MMM and MMMM for its name, DD and D for the day, ddd and dddd for the weekday name, and HH, mm, ss for the time.

DD MMM YYYY              03 Sep 2026
dddd, D MMMM YYYY        Thursday, 3 September 2026
YYYY-MM                  2026-09
YY/MM/DD HH:mm           26/09/03 00:00

Longer tokens are matched first, so MMMM produces "September" rather than "0909". Anything not a token, including spaces, slashes and commas, is copied through as written.

Ranges that count down, and ranges that are too long

Put the end before the start and the range counts down, with a note saying so. That is a useful default rather than an error: a descending date column is exactly what you want for a "most recent first" fixture.

A range that would produce more than a million rows stops at a million and tells you, naming the number. Hourly steps across several years get there quickly: three years of hourly dates is 26,304 rows, but three centuries is not something to attempt in a browser tab.

Frequently Asked Questions

Are the start and end dates included?

Both, when the step lands on them. A daily range from the 1st to the 10th gives you ten rows including both ends. A range from the 1st to the 10th stepping by three gives the 1st, 4th, 7th and 10th; change the end to the 11th and the last row is still the 10th, because the 13th is past the end.

What date formats can I type into the start and end boxes?

ISO (2026-01-31), US slashes (01/31/2026) and EU dots (31.01.2026) are all read. ISO also accepts a time after the date, which matters for hourly ranges. Anything unreadable produces a message naming the three shapes rather than a silent wrong answer.

Does it skip public holidays?

No. Holidays differ by country, by region and by year, and building in one country's calendar would be wrong for most people. Turn on the weekday column, generate the business days, and remove the holidays from the resulting file.

What is the row limit?

A million. Not a marketing number: it is the same ceiling the full test data generator uses, and the page really will produce a million rows in your browser. Most tools of this kind stop between five thousand and a hundred thousand. Above a hundred thousand the page warns you that saving the file takes a moment, because it does.

Why does stepping by a month from the 31st give me the 28th?

Because that is what a month later means when the target month has no 31st. The day is clamped to the last day of the month rather than rolling forward into March, which is what a naive implementation does and what every accounting system would call wrong.

Can I generate times as well as dates?

Yes. Set the step to Hour, and put a time on the start date in ISO form such as 2026-01-01T09:00. Then pick the ISO date and time format, or write a custom pattern with HH:mm in it.

Does anything I paste leave my computer?

No. There is no upload endpoint on this page and no network request in the code that does the work. JavaScript in your own tab reads the text, processes it and hands back the result. Nothing is stored between visits either, so reloading gives you an empty box again. You can confirm it by opening your browser's network panel and watching it stay quiet while you work.

Every date, none missing

Free, no account, nothing transmitted. Business days, month-end clamping and any format you like.

Back to the generator