C# 转换日期时间的字符串格式导致错误

C# 转换日期时间的字符串格式导致错误,c#,datetime,converter,string-formatting,C#,Datetime,Converter,String Formatting,我尝试将persiandate转换为standard date。因此,我的波斯语日期具有以下格式(这意味着用户可以输入以下格式: 1392/1/1 1392/01/01 1392/01/1 1392/1/01 因此,我编写了一个函数,将我的波斯日期转换为标准日期,如下所示: public DateTime ConvertPeersianToEnglish(string persianDate) { string[] formats = { "yyyy/

我尝试将
persiandate
转换为
standard date
。因此,我的波斯语日期具有以下格式(这意味着用户可以输入以下格式:

1392/1/1
1392/01/01
1392/01/1
1392/1/01
因此,我编写了一个函数,将我的波斯日期转换为标准日期,如下所示:

 public DateTime ConvertPeersianToEnglish(string persianDate)
        {
            string[] formats = { "yyyy/MM/dd" };
            DateTime d1 = DateTime.ParseExact(persianDate, formats,
                                              CultureInfo.CurrentCulture, DateTimeStyles.None);
            PersianCalendar persian_date = new PersianCalendar();
            DateTime dt = persian_date.ToDateTime(d1.Year, d1.Month, d1.Day, 0, 0, 0, 0, 0);
            return dt;
        }
但这些函数只能处理此格式
1392/01/01
,并且在用户输入其他格式时,我得到了以下错误:

String was not recognized as a valid DateTime

非常感谢您在格式中指定了
MM
dd
,它们需要两位数字。只需指定
“yyyy/M/d”
作为格式,即可处理1位和2位的日/月值。(您可以指定多个格式来代替,但在这种情况下,您不需要这样做。您可能想考虑清楚这一点,但是<代码> M< /代码>和<代码> d>代码>都将处理两个数字值,前值为零,没有问题。

请注意,如果只指定一种格式,则不需要将其放入数组中。您可以使用:

string format = "yyyy/M/d";
DateTime d1 = DateTime.ParseExact(persianDate, format,
                                  CultureInfo.CurrentCulture,
                                  DateTimeStyles.None);
然而:

  • 我怀疑您希望指定不变的区域性,因为您不希望此值受区域性影响
  • 您目前将日期转换为波斯日历的方法根本不起作用
当前,您正在隐式验证给定的日期是否在公历中,但随后您将其视为波斯日期。例如,1392/02/30是有效的波斯日期,但不是有效的公历日期

相反,您应该使用一个已经使用波斯日历的区域性,然后在
DateTime.ParseExact
调用中指定该区域性。之后您不需要再做任何其他事情

你可以选择考虑使用我的库-版本1.3,其中包括波斯日历应该在第二天或第二天发布。 使用Noda Time的示例代码:

var persian = CalendarSystem.GetPersianCalendar();
// The pattern takes the calendar system from the default value
var sampleDate = new LocalDate(1392, 1, 1, persian);
var pattern = LocalDatePattern.CreateWithInvariantCulture("yyyy/M/d")
                              .WithTemplateValue(sampleDate);
var date = pattern.Parse("1392/02/30").Value;
Console.WriteLine(LocalDatePattern.IsoPattern.Format(date));
但这些函数只能处理1392/01/01格式

因为您的
yyyy/MM/dd
格式仅支持此值

如果您的输入可以

1392/1/1
1392/01/01
1392/01/1
1392/1/01
值,则应在方法中的
格式
数组中提供支持这些值的所有格式


使用这些格式时,如果您的值与其中一种格式匹配,则解析将成功。

string[]formats
中指定所有格式:

string[] formats = { "yyyy/MM/dd", "yyyy/M/d", "yyyy/MM/d", "yyyy/M/dd" };

但有时我的输入格式是1392/01/01,可以这样(yyyy/M/d)处理这种格式吗?@EA:是的,可以。但是请阅读我的扩展答案-你现在有更大的问题。@user3613916:没有必要,因为一种格式将解析所有的值。我想你的意思是把
yyyy/M/d
作为第一种格式-实际上可以解析所有这些值。这种格式有更大的问题代码虽然-看到我的答案。
string[] formats = { "yyyy/MM/dd", "yyyy/M/d", "yyyy/MM/d", "yyyy/M/dd" };