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);
然而:
- 我怀疑您希望指定不变的区域性,因为您不希望此值受区域性影响
- 您目前将日期转换为波斯日历的方法根本不起作用
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" };