2

我想将'th-TH'文化的默认日历从ThaiBuddhist更改为Gregorian,并将其注册为自定义文化。更改CultureAndRegionInfoBuilder的默认日历

CultureAndRegionInfoBuilder cultureAndRegionInfoBuilder = new CultureAndRegionInfoBuilder("th-TH", CultureAndRegionModifiers.Replacement); 
cultureAndRegionInfoBuilder.AvailableCalendars = new Calendar[] { new GregorianCalendar()}; 
cultureAndRegionInfoBuilder.Register(); 

段以上不会更改默认日历。

CultureInfo cultureInfo = new CultureInfo("th-TH"); 
cultureInfo.DateTimeFormat.Calendar = new GregorianCalendar(); 

CultureAndRegionInfoBuilder cultureAndRegionInfoBuilder = new CultureAndRegionInfoBuilder("th-TH", CultureAndRegionModifiers.Replacement); 
cultureAndRegionInfoBuilder.LoadDataFromCultureInfo(cultureInfo); 

cultureAndRegionInfoBuilder.Register(); 

这也行不通。

请帮忙。感谢名单

+0

对不起,如果您发现这个问题令人反感,但您能否阐明为什么要这么做? – 2010-12-15 18:04:45

+0

@PawełDyda我们使用SSRS服务器端报告,我们的客户需要格里历日历格式的日期,而'Bhat'中的货币。 'th-TH'的默认日历是泰国佛教徒。 – Eranga 2010-12-16 00:10:53

回答

0

你不能没有先删除它改变现有文化:

CultureAndRegionInfoBuilder.UnRegister("th-TH"); 
+0

已经有一个catch块来捕获“InvalidOperationException”并注销文化并重新注册。没有工作。 – Eranga 2010-12-16 05:27:57

1

我不认为你可以这样做的。实际上,会有更简单的方法来覆盖默认日历:

 CultureInfo thaiCulture = CultureInfo.CreateSpecificCulture("th-TH"); 
     Console.Out.WriteLine(DateTime.Now.ToString(thaiCulture)); 
     DateTimeFormatInfo thaiDateTimeFormat = thaiCulture.DateTimeFormat; 
     thaiDateTimeFormat.Calendar = new GregorianCalendar(); 
     Console.Out.WriteLine(DateTime.Now.ToString(thaiCulture)); 

这适用于我的控制台应用程序。唯一的问题,它可能不适合你。为什么?我认为你提到的“SSRS服务器端报告”是作为一个不同的过程运行的,我可能是错的,但我确信你只能为当前进程覆盖CultureInfo设置。我不认为它可以(也应该)在全球范围内完成。

此外,我不知道你正在使用的报告解决方案的具体情况,所以它可能没有帮助,但你不能只通过已格式化的日期时间字符串作为参数?这将是在Crystal Reports中解决这个问题的方法。最糟糕的情况是将格式化的字符串写入数据库。

+0

实际上使用cultureAndRegionInfoBuilder.Register()方法,您可以更改机器/服务器中该区域性的设置。我能够使用上述方法更改'货币符号',该方法影响在该服务器上运行的SSRS。但更改日历不起作用。正如你所说,如果这不起作用,我们必须手动格式化日期。感谢您的帮助。 – Eranga 2010-12-16 11:18:40

0

既然你正在修改现有文化(更换)不能删除日历,但你可以重新排序:

var carib = new CultureAndRegionInfoBuilder("th-TH", 
              CultureAndRegionModifiers.Replacement); 
carib.AvailableCalendars = new Calendar[] { new GregorianCalendar(), 
              new ThaiBuddhistCalendar() }; 
carib.Register(); 

由于它是一个替代的文化,你不会看到效果,直到你开始新的过程。