转换日期时间的字符串格式会导致错误
本文关键字:错误 格式 字符串 日期 时间 转换 | 更新日期: 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
在您的格式中指定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
调用中指定作为文化。然后你就不需要做任何其他事情了。
你也可以考虑使用我的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" };
对于这些格式,如果您的值与其中一种格式匹配,则解析将成功。