所以,我有一个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中正确呈现此日期?
是的,经过一番挖掘,我已经设法得到一个有效的解决方案。
虽然我的问题最初是关于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/,这很有用
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。有人和你或多或少有同样的问题,这似乎解决了错误。希望这可以帮助。
CultureInfo CurrentCulture = CultureInfo.GetCultureInfo("ar-AE");
string text = DateTime.Now.ToString("yyyy MMMM dd", CurrentCulture);