使用CultureInfo时,DateTime.Parse返回错误的值

时间:2016-06-04 13:35:41

标签: c# parsing datetime

这是我的代码:

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

Geogorian日期是:2016年6月16日

波斯日期是:13/03/1395

而现在的价值是:07/09/2025

时间是对的。 可能是什么问题?

2 个答案:

答案 0 :(得分:5)

您只将cultureinfo参数传递给Parse,但不传递给ToString。这意味着使用线程文化格式化字符串,然后使用fa-ir culture进行解析。

答案 1 :(得分:1)

如果您想在波斯日历中获取“现在”的年,月和日,则应使用Calendar类:

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)}");
    }
}

如果您只想将值格式化为字符串,可以将CultureInfo传递给ToString来电:

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));
    }
}

此处,CultureInfo有一个与之关联的默认日历(以及日期/时间格式字符串),用于格式化值。

DateTime本身总是有效地存在于公历系统中 - 例如,无法在波斯日历中创建“DateTime”或“转换”DateTime一个日历到另一个日历。

请注意,在我的Noda Time库中,这不是真的 - 您可以ZonedDateTimeOffsetDateTimeLocalDate指定日历系统或LocalDateTime值,并从一个转换为另一个。如果你正在进行大量的日历工作,我建议你至少尝试一下Noda Time - 它的目的是让你更难以犯这种错误。