DateTime.Parse returns wrong value when CultureInfo is used

This is my code:

DateTime Now = DateTime.Parse(DateTime.Now.ToString(), new System.Globalization.CultureInfo("fa-ir"));

The Geogorian date is: 16/06/2016

The Persian date is: 15/03/1395

while the value of Now is: 07/09/2025

The time is correct. What can be the problem?

Jon Skeet
people
quotationmark

If you're trying to obtain the year, month and day of "now" in the Persian Calendar, you should use the Calendar class:

using System;
using System.Globalization;

public class Test
{
    static void Main()
    {
        var now = DateTime.Now;
        var calendar = new PersianCalendar();
        Console.WriteLine($"Year: {calendar.GetYear(now)}");
        Console.WriteLine($"Month: {calendar.GetMonth(now)}");
        Console.WriteLine($"Day: {calendar.GetDayOfMonth(now)}");
    }
}

If you just want to format a value as a string, you can pass the CultureInfo into the ToString call:

using System;
using System.Globalization;

public class Test
{
    static void Main()
    {
        var culture = new CultureInfo("fa-ir");
        var now = DateTime.Now;
        Console.WriteLine(now.ToString(culture));
    }
}

Here, the CultureInfo has a default calendar associated with it (as well as date/time format strings) and that is used to format the value.

A DateTime itself is always effectively in the Gregorian calendar system - there's no way of creating a "DateTime in the Persian Calendar" for example, or "converting" a DateTime from one calendar to another.

Note that in my Noda Time library, that's not true - you can specify a calendar system for a ZonedDateTime, OffsetDateTime, LocalDate or LocalDateTime value, and convert from one to another. If you're doing a lot of calendar work, I'd recommend you at least give Noda Time a try - it's designed to make it a lot harder to make this sort of mistake.

people

See more on this question at Stackoverflow