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

本文关键字:错误 格式 字符串 日期 时间 转换 | 更新日期: 2023-09-27 18:10:23

我尝试将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

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

在您的格式中指定MMdd,其中需要两位数字。只需指定"yyyy/M/d"作为格式-它应该处理1位数和2位数的日/月值。(可以指定多种格式,但在本例中不需要。您可能想要考虑这样做只是为了清楚,但是Md都将处理以零为前导的两位数字值,没有问题。

注意,如果你只是指定一种格式,你不需要把它放在一个数组中。你可以使用:

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

  • 我怀疑你想要指定不变区域性,因为你不希望这个值受到区域性
  • 的影响。
  • 当前将日期转换为波斯日历的方法根本不起作用。

当前,您隐式地验证给定的日期是否在公历中,但随后您处理为波斯语日期。例如,1392/02/30是有效的波斯语日期,但不是是有效的公历日期。

相反,您应该使用已经使用波斯语日历的文化,然后在DateTime.ParseExact调用中指定作为文化。然后你就不需要做任何其他事情了。

你也可以考虑使用我的Noda Time库——包含波斯语日历的1.3版本应该在一两天内发布。

使用节点时间的示例代码:

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

指定string[] formats:

中的所有格式
string[] formats = { "yyyy/MM/dd", "yyyy/M/d", "yyyy/MM/d", "yyyy/M/dd" };

但是这些函数只能处理这些格式1392/01/01

因为你的yyyy/MM/dd格式只支持这个值。

如果你的输入可以是

1392/1/1
1392/01/01
1392/01/1
1392/1/01

值,你应该在你的DateTime.ParseExact方法的formats数组中提供所有支持这些值的格式。

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

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