在Xamarin.Forms中,针对波斯语文化("fa-IR")的DateTime.ToString(String, IFormatProvider)方法无法正常工作。

3
以下代码在示例.Net Core控制台应用程序上正常工作:
var result = DateTime.Now.ToString("d", new CultureInfo("fa-IR"));

在这个CultureInfo中,结果应该是正确的27/5/1398。 但是在Xamarin.Forms中相同的代码会导致18/8/2019这显然是错误的!我还在Android的MainActivity上尝试了它,但得到了同样错误的结果。
我在两个不同的Xamarin.Forms项目上进行了测试,一个是Xamarin.Forms版本3.6.0.220655,另一个是4.1.0.555618
如何在Xamarin.Forms中获得正确的结果?
更新:
下面这行代码:
new CultureInfo("fa-IR").DateTimeFormat.Calendar

显示System.Globalization.GregorianCalendar!为什么???我期望这个文化环境下应该是System.Globalization.PersianCalendar

接下来的尝试:我非常想以以下方式将波斯文化的默认日历设置为波斯日历:

new CultureInfo("fa-IR").DateTimeFormat.Calendar = new PersianCalendar(); 

但是遇到了这个异常:System.ArgumentOutOfRangeException: 该文化中没有有效的日历。 然后在搜索其他类似的SO问题后,在官方的PersianCalendar文档中发现了以下说明:

您不能将PersianCalendar对象用作文化的默认日历。默认日历由CultureInfo.Calendar属性指定,必须是CultureInfo.OptionalCalendars属性返回的日历之一。目前,PersianCalendar类不是CultureInfo类支持的任何文化的可选日历,因此不能是默认日历。


@JonSkeet 它显示 System.Globalization.GregorianCalendar。在控制台应用程序中,它返回 System.Globalization.PersianCalendar - VahidShir
是的,我可以在Xamarin.Forms中访问PersianCalendar类。 我会尝试手动使用它。 我也会尝试你的库。 谢谢。 - VahidShir
@LeoZhu-MSFT 很遗憾,还没有! - VahidShir
@JonSkeet 这行使用NodaTime的代码:LocalDateTime.FromDateTime(DateTime.Now, CalendarSystem.PersianSimple).ToString("f", new CultureInfo("fa-IR")); 在 .Net Core控制台应用程序中显示出了 يكشنبه, 3 شهریور 1398 02:36 ب.ظ ,这是正确的,但在Xamarin.Forms中却显示出了 یکشنبه, 3 ژوئن 1398 02:32 ب.ظ。问题在于后者中“June”被直接翻译为“ژوئن”,但它应该像前者一样显示“شهریور”! - VahidShir
@VahidShir:这将是与文化相关的“DateTimeFormatInfo”的问题。如果您愿意,您可以创建具有正确名称的自己的“DateTimeFormatInfo”实例 - 恐怕Noda Time依赖于.NET数据进行此操作。 - Jon Skeet
显示剩余3条评论
2个回答

1
在.NET Core中支持波斯历转换,但在.NET Framework中不支持。您可以参考以下文档将其转换为波斯历格式:

波斯历类


我正在使用.Net Standard Xamarin.Forms。 - VahidShir
是的,Xamarin针对.NET标准进行开发。您可以从以下链接了解更多信息:https://learn.microsoft.com/tr-tr/dotnet/standard/net-standard - Tuğçe Arar

0

你可以像这样进行更改:

DateTime d = DateTime.Parse(DateTime.Now.ToString("d"));
PersianCalendar pc = new PersianCalendar();
var dataTime = new DateTime(pc.GetYear(d), pc.GetMonth(d), pc.GetDayOfMonth(d));
var result = dataTime.ToString("dd/M/yyyy", new CultureInfo("fa-IR"));

为什么我必须使用这种奇怪的方法?我为什么不能像var result = DateTime.Now.ToString("d", new CultureInfo("fa-IR"));这样使用简单的方法呢? - sorosh_sabz
@Leo 谢谢你的解决方案。我已经在使用一个针对波斯文化的库,它运行得非常好。但问题是,我想要一个适用于所有语言的通用解决方案,而不是为其他类似有问题的语言寻找可能类似的解决方案。 - VahidShir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接