我正在尝试将persianDate
转换为standarddate
。
public DateTime ConvertPersianToEnglish(string persianDate)
{
string[] formats = { "yyyy/MM/dd", "yyyy/M/d", "yyyy/MM/d", "yyyy/M/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;
}
Persiandate
的格式如下:1392/10/12(Year/month/day)
在我的应用程序中,我试图将Year/month/31
转换为标准时间,但我得到了这个错误:
{System.FormatException: String was not recognized as a valid DateTime.
at System.DateTimeParse.ParseExactMultiple(String s, String[] formats, DateTimeFormatInfo dtfi, DateTimeStyles style)
我得到错误的确切值是1393/04/31
Sergey明确使用使用波斯日历的文化的解决方案应该可以工作,但另一个选择是使用我的Noda时间库:
using System;
using System.Globalization;
using NodaTime;
using NodaTime.Text;
public class Test
{
public static void Main()
{
// Providing the sample date to the pattern tells it which
// calendar to use.
// Noda Time 2.0 uses a property instead of a method.
// var calendar = CalendarSystem.Persian; // 2.0+
var calendar = CalendarSystem.GetPersianCalendar(); // 1.x
LocalDate sampleDate = new LocalDate(1392, 10, 12, calendar);
var pattern = LocalDatePattern.Create(
"yyyy/M/d", CultureInfo.InvariantCulture, sampleDate);
string text = "1393/04/31";
ParseResult<LocalDate> parseResult = pattern.Parse(text);
if (parseResult.Success)
{
LocalDate date = parseResult.Value;
// Use the date
}
}
}
与DateTime
不同,这里的LocalDate
结果知道它只是一个日期(所以不会提供时间方面),也知道它在哪个日历系统中(所以你不需要一直调用calendar.GetYear(date)
这样的方法来获得特定的部分)。
请注意,yyyy/M/d
的解析模式将能够解析带有前导零的值,因此您不需要多个模式。但是,如果您知道格式总是将有两个数字表示月份和日期,那么我会显式地使用yyyy/MM/dd
。
说明
这里有几个问题:
-
DateTime d1 = DateTime.ParseExact(persianDate, formats, CultureInfo.CurrentCulture, DateTimeStyles.None);
CultureInfo。CurrentCulture依赖于机器。但是函数名称是
ConvertPersianToEnglish
,这意味着ParseExact
的provider
参数应该设置为波斯语日期格式提供者。 -
由于某种原因,Iranian CultureInfo实例将GregorianCalendar作为默认日历。此外,
OptionalCalendars
中没有PersianCalendar
。这很奇怪,因为System.Globalization
命名空间包含PersianCalendar
类。
这里有几个选项可以使用。
解决方案1
在本文中,Babak Mahmoudi提供了一个帮助器类,可以修复CultureInfo
实例以接受PersianCalendar
。这个类中的方法不是很温和(就实现而言)。但它包含FixPersianDateTimeFormat
方法,这是相当无辜的。使用它,您的代码看起来像这样:
public static DateTime ConvertPersianToEnglish(string persianDate)
{
string[] formats = { "yyyy/MM/dd", "yyyy/M/d", "yyyy/MM/d", "yyyy/M/dd" };
DateTimeFormatInfo persianDateTimeFormatInfo = new CultureInfo("fa-Ir").DateTimeFormat;
PersianCultureHelper.FixPersianDateTimeFormat(persianDateTimeFormatInfo, true);
return DateTime.ParseExact(persianDate, formats, persianDateTimeFormatInfo, DateTimeStyles.None);
}
解决方案2
您可以自己解析字符串,然后使用PersianCalendar.ToDateTime
。查看comecme的答案:如何将波斯日历日期字符串转换为日期时间?
下面是将波斯语日期转换为DateTime的简单方法:
public DateTime GetGregorianDate(string persianDate)
{
PersianCalendar persian_date = new PersianCalendar();
var dateParts = GetDateParts(persianDate);
DateTime dt = persian_date.ToDateTime(dateParts[0], dateParts[1], dateParts[2], 0, 0, 0, 0, 0);
return dt;
}
public int[] GetDateParts(string persianDate)
{
return persianDate.Split('/').Select(datePart => int.Parse(datePart)).ToArray();
}