STYME is a lightweight, zero-dependency C# library for parsing simple natural-language date/time expressions and applying them to a base date/time.
using STYME;
// By default NaturalDateTime uses the current system time as the base
var parser = new NaturalDateTime();
var result = parser.Parse("add 2 days");
Console.WriteLine(result);Output (example):
2025-10-04T14:23:00
You can parse expressions relative to a specific DateTime using NaturalDateTime.From.
using STYME;
var baseTime = new DateTime(2020, 1, 1, 0, 0, 0);
var parser = NaturalDateTime.From(baseTime);
var result = parser.Parse("add 1 month");
Console.WriteLine(result);Output:
2020-02-01T00:00:00
You can add time using the add keyword.
using STYME;
var baseTime = new DateTime(2020, 3, 1, 12, 0, 0);
var parser = NaturalDateTime.From(baseTime);
var result = parser.Parse("add 1 year");
Console.WriteLine(result);Output:
2021-03-01T00:00:00
You can subtract time using the deduct (or subtract) keyword.
using STYME;
var baseTime = new DateTime(2020, 3, 1, 12, 0, 0);
var parser = NaturalDateTime.From(baseTime);
var result = parser.Parse("deduct 1 month");
Console.WriteLine(result);Output:
2020-02-01T12:00:00
You can chain multiple operations using and.
using STYME;
var baseTime = new DateTime(2020, 1, 1, 0, 0, 0);
var parser = NaturalDateTime.From(baseTime);
var result = parser.Parse("add 3 days and deduct 5 hours");
Console.WriteLine(result);Output:
2020-01-03T19:00:00
Use next to jump to the upcoming occurrence of a day of the week or a month. The time of day is preserved.
using STYME;
var baseTime = new DateTime(2025, 1, 1, 8, 0, 0);
var parser = NaturalDateTime.From(baseTime);
var result = parser.Parse("next monday");
Console.WriteLine(result);Output:
2025-01-06T08:00:00
This operator can also be chained with the and operator.
using STYME;
var baseTime = new DateTime(2025, 1, 1, 8, 0, 0);
var parser = NaturalDateTime.From(baseTime);
var result = parser.Parse("next friday and add 2 hours");
Console.WriteLine(result);Output:
2025-01-03T10:00:00
Use end to move to the end of the current week, month, or year. Fillers such as of and the are optional.
using STYME;
var baseTime = new DateTime(2025, 6, 15, 20, 45, 0);
var parser = NaturalDateTime.From(baseTime);
var result = parser.Parse("end of the month");
Console.WriteLine(result);Output:
2025-06-30T20:45:00
You can generate a lazy sequence of future dates using every. The sequence is infinite, so add your own break condition.
using STYME;
var baseTime = new DateTime(2025, 1, 1, 0, 0, 0);
var parser = NaturalDateTime.From(baseTime);
var schedule = parser.Enumerate("every 2 weeks");
foreach (var occurrence in schedule)
{
Console.WriteLine(occurrence);
// Break when you reach the point you care about.
if (occurrence >= new DateTime(2025, 2, 12))
{
break;
}
}Output:
2025-01-01T00:00:00
2025-01-15T00:00:00
2025-01-29T00:00:00
2025-02-12T00:00:00
The add and deduct expressions support the following units (singular and plural forms):
second,secondsminute,minuteshour,hoursday,daysweek,weeksmonth,monthsyear,yearsdecade,decadescentury,centuriesmillennium,millennia
Example:
using STYME;
var parser = NaturalDateTime.From(new DateTime(2000, 1, 1));
Console.WriteLine(parser.Parse("add 2 decades")); // 2020-01-01
Console.WriteLine(parser.Parse("deduct 1 century")); // 1900-01-01- Add month support (set DateTime to specific month)
- Add day support (i.e. "next friday")
- Add complex time support (i.e. "quarter past five")
- Add multiple complex operations (i.e. "add one year then next friday")
- .NET 8.0 and later
STYME is licensed under the MIT License.
