所以,我有一个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中正确呈现此日期?
答案 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。有人和你或多或少有同样的问题,这似乎解决了错误。希望这会有所帮助。
答案 2 :(得分:0)
a.KRI_RK=b.KRI_TEMPLATE_RK and
b.KRI_ID=c.KRI_TEMPLATE_ID