如何正确呈现ar-SA日期和时间字符串

时间:2017-06-06 15:53:59

标签: c# datetime localization arabic

所以,我有一个DateTime值,我需要使用ar-SA文化(使用公历)来渲染它。

我想使用的格式是dd-MMM-yyyy HH:mm。

我目前正在使用它来格式化它 -

dateTimeValue.ToString("dd-MMM-yyyy HH:mm", culture)

在en-GB中,我会看到 -

  

06-Jun-2017 16:49

在ar-SA中,当我使用相同的方法时,我看到 -

  

06-يونيو-2017 16:49

现在,从我能解决的问题来看,我认为这是导致问题的RTL字符串,因为它总是在右侧。

如何在RTL中正确呈现此日期?

3 个答案:

答案 0 :(得分:1)

是的,经过一番挖掘,我已经设法找到了一个有效的解决方案。

尽管我的问题最初是关于ar-SA的,但它确实适用于任何从右到左的文化。

我最终使用unicode字符来明确说明字符串的哪些部分是从左到右和从右到左。

所以,使用常量 -

private const char LeftToRightCharacter = (char)0x200E;
private const char RightToLeftCharacter = (char)0x200F;

然后我可以按如下方式建立一个日期字符串 -

if (culture.TextInfo.IsRightToLeft)
{
    return
        LeftToRightCharacter +
        date.ToString("yyyy-", culture) +
        RightToLeftCharacter +
        date.ToString("MMM", culture) +
        LeftToRightCharacter +
        date.ToString("-dd", culture);
}
return date.ToString("dd-MMM-yyyy", culture);

...其中culture是CultureInfo(DateTimeFormat.Calendar设置为新的GregorianCalendar()),date是DateTime。

因此,对于2017年6月6日的日期,在EN-GB中我得到 -

  

06 - 2017

在ar-SA我得到 -

  

2017-يونيو-06

现在我已经将它作为一个字符串,我可以在两侧添加时间(如果文化是RTL,则在左侧,如果文化是LTR,则在右侧)。

了解Unicode如何处理这些字符以及我可以使用的其他字符非常有用 - http://www.unicode.org/reports/tr9/

答案 1 :(得分:0)

for(var option in options){
      var datasetValue = [];

并且您无法使用ar-SA文化解析此字符串,因为此文化使用var dt = DateTime.Parse("31/1/2016 12:00 AM", CultureInfo.GetCultureInfo("ar-SA")); // Throws FormatException 作为AMD签名者,因为它使用UmAlQuraCalendar而不是GregorianCalendar。

您可以使用InvariantCulture(使用AM作为AMD签名者并使用GregorianCalendar)而不是DateTime.ParseExact方法,并准确指定其格式。

ص

参考here。有人和你或多或少有同样的问题,这似乎解决了错误。希望这会有所帮助。

要进行渲染,请查看herehere。他们似乎有一个类似的渲染问题,可以解决您的问题。

答案 2 :(得分:0)

a.KRI_RK=b.KRI_TEMPLATE_RK and 
b.KRI_ID=c.KRI_TEMPLATE_ID