Menu

How to Add or Subtract Days, Months, or Years from a Date in C#

Manipulating dates is a common task in C# applications, whether for scheduling, logging, or calculations.

The DateTime and DateOnly structures provide built-in methods to add or subtract days, months, years, hours, and minutes efficiently.

Adding and Subtracting Days

Use the AddDays method to modify a DateTime instance:

using System;

class Program
{
    static void Main()
    {
        DateTime today = DateTime.Now;
        DateTime nextWeek = today.AddDays(7);
        DateTime lastWeek = today.AddDays(-7);

        Console.WriteLine($"Today: {today:yyyy-MM-dd HH:mm}");
        Console.WriteLine($"Next Week: {nextWeek:yyyy-MM-dd HH:mm}");
        Console.WriteLine($"Last Week: {lastWeek:yyyy-MM-dd HH:mm}");
    }
}

Adding and Subtracting Months

Use the AddMonths method to adjust the month while automatically handling month-end variations:

DateTime currentDate = new DateTime(2025, 3, 31);
DateTime nextMonth = currentDate.AddMonths(1);
DateTime previousMonth = currentDate.AddMonths(-1);

Console.WriteLine($"Current Date: {currentDate:yyyy-MM-dd HH:mm}");
Console.WriteLine($"Next Month: {nextMonth:yyyy-MM-dd HH:mm}");
Console.WriteLine($"Previous Month: {previousMonth:yyyy-MM-dd HH:mm}");

Adding and Subtracting Years

Use the AddYears method to adjust the year, handling leap years automatically:

DateTime date = new DateTime(2024, 2, 29);
DateTime nextYear = date.AddYears(1);
DateTime previousYear = date.AddYears(-1);

Console.WriteLine($"Original Date: {date:yyyy-MM-dd HH:mm}");
Console.WriteLine($"Next Year: {nextYear:yyyy-MM-dd HH:mm}");
Console.WriteLine($"Previous Year: {previousYear:yyyy-MM-dd HH:mm}");

Adding and Subtracting Hours

Use the AddHours method to modify the hour component:

DateTime now = DateTime.Now;
DateTime inFiveHours = now.AddHours(5);
DateTime fiveHoursAgo = now.AddHours(-5);

Console.WriteLine($"Current Time: {now:yyyy-MM-dd HH:mm}");
Console.WriteLine($"In 5 Hours: {inFiveHours:yyyy-MM-dd HH:mm}");
Console.WriteLine($"5 Hours Ago: {fiveHoursAgo:yyyy-MM-dd HH:mm}");

Adding and Subtracting Minutes

Use the AddMinutes method to modify the minute component:

DateTime currentTime = DateTime.Now;
DateTime inThirtyMinutes = currentTime.AddMinutes(30);
DateTime thirtyMinutesAgo = currentTime.AddMinutes(-30);

Console.WriteLine($"Current Time: {currentTime:yyyy-MM-dd HH:mm}");
Console.WriteLine($"In 30 Minutes: {inThirtyMinutes:yyyy-MM-dd HH:mm}");
Console.WriteLine($"30 Minutes Ago: {thirtyMinutesAgo:yyyy-MM-dd HH:mm}");

Using DateOnly for Simpler Date Manipulation

For applications that don't require time components, DateOnly (introduced in .NET 6) provides a cleaner approach:

DateOnly today = DateOnly.FromDateTime(DateTime.Now);
DateOnly futureDate = today.AddDays(30);

Console.WriteLine($"Today: {today}");
Console.WriteLine($"30 Days Later: {futureDate}");

Conclusion

C# provides built-in methods for adjusting dates effortlessly. Whether working with DateTime or DateOnly, these functions ensure accurate date calculations, even when dealing with leap years, month-end scenarios, hours, and minutes.

1
688

Related

Reading a file line by line is useful when handling large files without loading everything into memory at once.

✅ Best Practice: Use File.ReadLines() which is more memory efficient.

Example

foreach (string line in File.ReadLines("file.txt"))
{
    Console.WriteLine(line);
}

Why use ReadLines()?

Reads one line at a time, reducing overall memory usage. Ideal for large files (e.g., logs, CSVs).

Alternative: Use StreamReader (More Control)

For scenarios where you need custom processing while reading the contents of the file:

using (StreamReader reader = new StreamReader("file.txt"))
{
    string? line;
    while ((line = reader.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

Why use StreamReader?

Lets you handle exceptions, encoding, and buffering. Supports custom processing (e.g., search for a keyword while reading).

When to Use ReadAllLines()? If you need all lines at once, use:

string[] lines = File.ReadAllLines("file.txt");

Caution: Loads the entire file into memory—avoid for large files!

4
324

When working with URLs in C#, encoding is essential to ensure that special characters (like spaces, ?, &, and =) don’t break the URL structure. The recommended way to encode a string for a URL is by using Uri.EscapeDataString(), which converts unsafe characters into their percent-encoded equivalents.

string rawText = "hello world!";
string encodedText = Uri.EscapeDataString(rawText);

Console.WriteLine(encodedText); // Output: hello%20world%21

This method encodes spaces as %20, making it ideal for query parameters.

For ASP.NET applications, you can also use HttpUtility.UrlEncode() (from System.Web), which encodes spaces as +:

using System.Web;

string encodedText = HttpUtility.UrlEncode("hello world!");
Console.WriteLine(encodedText); // Output: hello+world%21

For .NET Core and later, Uri.EscapeDataString() is the preferred choice.

28
1430

String interpolation, introduced in C# 6.0, provides a more readable and concise way to format strings compared to traditional concatenation (+) or string.Format(). Instead of manually inserting variables or placeholders, you can use the $ symbol before a string to directly embed expressions inside brackets.

string name = "Walt";
string job = 'Software Engineer';

string message = $"Hello, my name is {name} and I am a {job}";
Console.WriteLine(message);

This would produce the final output of:

Hello, my name is Walt and I am a Software Engineer

String interpolation can also be chained together into a multiline string (@) for even cleaner more concise results:

string name = "Walt";
string html = $@"
    <div>
        <h1>Welcome, {name}!</h1>
    </div>";
37
152