2011-02-15 3 views
6

OS 문화가 무엇인지에 관계없이 원하는대로 응용 프로그램 문화권을 설정하고 싶습니다. 이것을 얻으려면 문화권으로 "fa-IR"이있는 CultureInfo 클래스를 사용했지만 .NET PersianCalendar 클래스가 아닌 기본 달력으로 "GregorianCalendar"를 사용했습니다. 그래서 난 내 고객 문화를 구현하는 CultureInfo를에서 새 클래스를 파생하려고 :.NET CultureInfo 클래스에서 사용자 지정 culture를 파생시키는 방법은 무엇입니까?

/// <summary> 
/// Represents culture specific information, Persian calendar and number format info for Iran. 
/// </summary> 
public class PersianCultureInfo : CultureInfo 
{ 
    private Calendar _calendar = new PersianCalendar(); 

    public PersianCultureInfo() 
     : base("fa-IR", true) 
    { 
    } 

    /// <summary> 
    /// Persian calendar with solar system algorithm for Iran. 
    /// </summary> 
    public override Calendar Calendar 
    { 
     get 
     { 
      return this._calendar; 
     } 
    } 

    public static PersianCultureInfo Create() 
    { 
     PersianCultureInfo culture = new PersianCultureInfo(); 
     culture.PerpareDateTimeFormatInfo(); 
     return culture; 
    } 

    private void PerpareDateTimeFormatInfo() 
    { 
     this.DateTimeFormat.Calendar = this.Calendar; 
     this.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Saturday; 
    } 
} 

문제는 DateTimeFormat 속성은 다음과 같은 예외가 발생한다는 것입니다 :

Not a valid calendar for the given culture. 
Parameter name: value 

그래서 나는 OptionalCalendars 속성을 재정의하는 시도를

public override Calendar[] OptionalCalendars 
    { 
     get 
     { 
      return base.OptionalCalendars.Concat<Calendar>(new Calendar[1] { new PersianCalendar() }).ToArray<Calendar>(); 
     } 
    } 

그러나 해결 didnt한다 :별로 목록 만 해 GregorianCalendar와 HijriCalendar 포함 기본 있기 때문에, 그들에게 PersianCalendar를 추가 문제. 뭐가 잘못 되었 니? 어떻게하면 CultureInfo 및 DateTimeFormat의 기본 달력으로 PersianCalendar를 올바른 방식으로 설정할 수 있습니까?

+1

어쩌면이 링크 도움이 당신에게 더 많은 동포 :) http://www.codeproject.com/Articles/17495/ Persian-DateTime – Arash

답변

1

5 년이 지난 후 상황이 변경되었습니다. Microsoft는 open sourced.NET을 가지고 있으며 이제는 PersianCalendar을 지원합니다.

나는 .NET 코어 1.0 다음 ​​코드를 시도하고 그것을 잘 작동합니다 :

using System; 
using System.Globalization; 

namespace ConsoleApplication 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      System.Globalization.CultureInfo.CurrentCulture = 
       new CultureInfo("fa-IR"); 
      Console.WriteLine(System.DateTime.Now); 
      // Prints: 1395/4/19 A.D. 13:31:55 
     } 
    } 
} 
5

CultureAndRegionInfoBuilder을 사용해보세요. MSDN에 따르면 이것은 선호되는 방법 인 creating custom cultures입니다.

편집 : 이것이 실패하면 나는 a dirty workaround using reflection이 그러한 사용자 지정 문화권을 만드는 유일한 방법이라고 생각합니다.

+0

감사합니다. 최대한 빨리 두 가지 방법을 시도해 보겠습니다. 하지만 실제로는 더러운 해결 방법이기 때문에 여기서 반사를 사용하지 않는 것이 좋습니다. –

+0

빌더를 사용해 보았지만 .NET Framework에서 PersianCalendar를 사용하기위한 몇 가지 제한 사항이 있지만이 두 가지 솔루션이 내 문제에 잘 작동하는 것 같습니다. 반사 방식도 작동하지만 이상한 행동이 발생합니다. 반사 트릭을 적용하고 새 문화권을 설정 한 후 DateTime 인스턴스의 ToString을 호출하면 페르시아 날짜가 표시되지만 연도, 월 및 일 속성을 별도로 가져올 경우 그레고리력 날짜가 모두 표시됩니다. –

관련 문제