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

问题描述 投票:0回答:3

所以,我有一个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中,当我使用相同的方法时,我看到 -

2017年6月6日16:49

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

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

c# datetime localization arabic
3个回答
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-Jun-2017

在ar-SA我得到 -

2017年6月-06

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

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


0
投票
var dt = DateTime.Parse("31/1/2016 12:00 AM", CultureInfo.GetCultureInfo("ar-SA"));
// Throws FormatException

并且您无法使用ar-SA文化解析此字符串,因为此文化使用ص作为AMD签名者,因为它使用UmAlQuraCalendar而不是GregorianCalendar。

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

string s = "31/1/2016 12:00 AM";
DateTime dt = DateTime.ParseExact(s, "dd/M/yyyy hh:mm tt",CultureInfo.InvariantCulture);

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

要渲染它去看看herehere。他们似乎有一个类似的渲染问题,可以解决您的问题。


0
投票
CultureInfo CurrentCulture = CultureInfo.GetCultureInfo("ar-AE");
string text = DateTime.Now.ToString("yyyy MMMM dd", CurrentCulture);
© www.soinside.com 2019 - 2024. All rights reserved.