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
609

Related

Closing a SqlDataReader correctly prevents memory leaks, connection issues, and unclosed resources. Here’s the best way to do it.

Use 'using' to Auto-Close

Using using statements ensures SqlDataReader and SqlConnection are closed even if an exception occurs.

Example

using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM Users", conn))
    using (SqlDataReader reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            Console.WriteLine(reader["Username"]);
        }
    } // ✅ Auto-closes reader here
} // ✅ Auto-closes connection here

This approach auto-closes resources when done and it is cleaner and less error-prone than manual closing.

⚡ Alternative: Manually Close in finally Block

If you need explicit control, you can manually close it inside a finally block.

SqlDataReader? reader = null;
try
{
    using SqlConnection conn = new SqlConnection(connectionString);
    conn.Open();
    using SqlCommand cmd = new SqlCommand("SELECT * FROM Users", conn);
    reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        Console.WriteLine(reader["Username"]);
    }
}
finally
{
    reader?.Close();  // ✅ Closes reader if it was opened
}

This is slightly more error prone if you forget to add a finally block. But might make sense when you need to handle the reader separately from the command or connection.

1
183

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
150

XML (Extensible Markup Language) is a widely used format for storing and transporting data.

In C#, you can create XML files efficiently using the XmlWriter and XDocument classes. This guide covers both methods with practical examples.

Writing XML Using XmlWriter

XmlWriter provides a fast and memory-efficient way to generate XML files by writing elements sequentially.

Example:

using System;
using System.Xml;

class Program
{
    static void Main()
    {
        using (XmlWriter writer = XmlWriter.Create("person.xml"))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("Person");

            writer.WriteElementString("FirstName", "John");
            writer.WriteElementString("LastName", "Doe");
            writer.WriteElementString("Age", "30");

            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
        Console.WriteLine("XML file created successfully.");
    }
}

Output (person.xml):

<?xml version="1.0" encoding="utf-8"?>
<Person>
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
    <Age>30</Age>
</Person>

Writing XML Using XDocument

The XDocument class from LINQ to XML provides a more readable and flexible way to create XML files.

Example:

using System;
using System.Xml.Linq;

class Program
{
    static void Main()
    {
        XDocument doc = new XDocument(
            new XElement("Person",
                new XElement("FirstName", "John"),
                new XElement("LastName", "Doe"),
                new XElement("Age", "30")
            )
        );
        doc.Save("person.xml");
        Console.WriteLine("XML file created successfully.");
    }
}

This approach is ideal for working with complex XML structures and integrating LINQ queries.

When to Use Each Method

  • Use XmlWriter when performance is critical and you need to write XML sequentially.
  • Use XDocument when you need a more readable, maintainable, and flexible way to manipulate XML.

Conclusion

Writing XML files in C# is straightforward with XmlWriter and XDocument. Choose the method that best suits your needs for performance, readability, and maintainability.

2
303