【问题标题】:DateTime.ToString(String, IFormatProvider) doesn't work for Farsi CultureInfo "fa-IR" in Xamarin.FormsDateTime.ToString(String, IFormatProvider) 不适用于 Xamarin.Forms 中的波斯文 CultureInfo“fa-IR”
【发布时间】:2019-08-18 16:37:06
【问题描述】:

以下代码在示例 .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。

下一次尝试: 我非常想以这种方式将波斯文化的默认日历设置为 PersianCalendar:

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

但遇到了这个异常:System.ArgumentOutOfRangeException: Not a valid calendar for the given culture. 然后在搜索了其他类似的 SO 问题后,在官方 PersianCalendar 文档中找到了这个注释:

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

【问题讨论】:

  • new CultureInfo("fa-IR").DateTimeFormat.Calendar 显示什么?我的猜测是 Xamarin 不支持相关的日历系统,或者它与该文化数据无关。
  • @JonSkeet 它显示System.Globalization.GregorianCalendar。在控制台应用程序中,它返回 System.Globalization.PersianCalendar。
  • 那么在这两种情况下我们能做些什么呢?
  • 好吧,Xamarin 有 PersianCalendar 吗?可以手动使用吗?您可以改用我的 Noda Time 库——它支持波斯日历。
  • 是的,我可以访问 Xamarin.Forms 中的 PersianCalendar 类。我会尝试手动使用它。我也会试试你的图书馆。谢谢。

标签: c# xamarin xamarin.forms localization cultureinfo


【解决方案1】:

在 .NET Core 中受支持,但在 .NET Framework 中不支持。您可以按照此文档转换为波斯日历格式:

PersianCalendar Class

【讨论】:

【解决方案2】:

你可以这样改变:

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")); 这样的简单方法?
  • @Leo 感谢您的解决方案。我已经在为波斯文化使用图书馆,而且效果很好。但问题是我想要一个适用于所有语言的通用解决方案,而不是为其他类似的有问题的语言提供类似的解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-03-03
  • 2013-03-29
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 2021-07-01
相关资源
最近更新 更多