2015-04-30 266 views
6

爲一個字符串波斯日期轉換爲公曆DateTime, 我使用日期時間選擇器,並將其發送我像"۱۳۹۴/۰۲/۲۰"將字符串轉換波斯日期公曆日期時間

PersianCalendar p = new PersianCalendar();    
string[] d = start.Split('/');   
DateTime dt = new DateTime(int.Parse(d[0]), 
          int.Parse(d[1]), 
          int.Parse(d[2]), 
          new HijriCalendar()); 

和我的函數轉換字符串被

public static DateTime ToGregorianDate(this DateTime dt) 
{ 
    PersianCalendar pc = new PersianCalendar(); 
    return pc.ToDateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, 0, 0);  
} 

它給DateTime我怎麼能發送正確DateTime 當它要顯示轉換此錯誤:

Input string was not in a correct format.

+0

'DateTime'構造函數以整數作爲參數,它們在.NET Framework中表示爲[阿拉伯數字](http://en.wikipedia.org/wiki/Arabic_numerals)。 –

回答

5

你有兩個不同的問題:

  • 阿拉伯數字不受DateTime解析

  • PersianCalendar支持不屬於任何CultureInfo的一部分,所以你不能直接使用它同時解析stringDateTime(並且無法將其設置爲預先存在的CultureInfo)。

可能的解決方案:

string date = "۱۳۹۴/۰۲/۲۰"; 
string date2 = Regex.Replace(date, "[۰-۹]", x => ((char)(x.Value[0] - '۰' + '0')).ToString()); 

從阿拉伯語更換數字轉換爲十進制

DateTime dt = DateTime.ParseExact(date2, "yyyy/MM/dd", CultureInfo.InvariantCulture); 

然後解析日期忽略日曆

PersianCalendar pc = new PersianCalendar(); 
DateTime dt2 = pc.ToDateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond); 

然後將日期轉換正確的日曆。

3

您必須手動將波斯語數字轉換爲int *,例如,

private static int ParsePersianNumber(String value) { 
     int result = 0; 

     // Persian digits are Unicode characters 0x06F0-0x06F9 
     foreach (var ch in value) 
     result = result * 10 + ch - 0x06F0; 

     return result; 
    } 

    ... 

    String start = "۱۳۹۴/۰۲/۲۰"; 

    PersianCalendar p = new PersianCalendar(); 
    string[] d = start.Split('/'); 

    // int.Parse -> ParsePersianNumber 
    // dt == 14 Mar 1974 
    DateTime dt = new DateTime(
     ParsePersianNumber(d[0]), 
     ParsePersianNumber(d[1]), 
     ParsePersianNumber(d[2]), 
     new HijriCalendar()); 
2

地圖阿拉伯數字第一:

var mapToArabic = 
    new Dictionary<char, char>{ 
    {'۰', '0'}, {'۱', '1'}, {'۲', '2'}, 
    {'۳', '3'}, {'۴', '4'}, {'۵', '5'}, 
    {'۶', '6'}, {'۷', '7'}, {'۸', '8'}, {'۹', '9'}}; 

var p = new System.Globalization.PersianCalendar(); 
var start = "۱۳۹۴/۰۲/۲۰"; 
string[] persian = start.Split('/');  

從原始代碼的主要變化:來自波斯的數字陣列映射(年,月,日),含等效陣列阿拉伯數字的值:

var arabic = persian 
       .Select(persianWord => 
        new string(persianWord 
           .Select(persianChar => mapToArabic[persianChar]) 
           .ToArray())) 
       .ToList(); 

現在你可以使用,當你使用之前另一種:

DateTime dt = new DateTime(int.Parse(arabic[0]), 
          int.Parse(arabic[1]), 
          int.Parse(arabic[2]), 
          new System.Globalization.HijriCalendar()); 

var pc = new System.Globalization.PersianCalendar(); 
var result = pc.ToDateTime(dt.Year, dt.Month, dt.Day, 
          dt.Hour, dt.Minute, 0, 0); 
5

正如我評論; Eastern Arabic numerals不支持DateTime解析方法,它只接受Arabic numerals

但是,char類型有一個GetNumericValue method可將任何數字Unicode字符轉換爲double

讓我們使用char.GetNumericValue,string.JoinInt32.Parse方法的組合;

string d = "۱۳۹۴/۰۲/۲۰"; 
int year = Int32.Parse(string.Join("", 
    d.Split('/')[0].Select(c => char.GetNumericValue(c)))); // 1394 
int month = Int32.Parse(string.Join("", 
    d.Split('/')[1].Select(c => char.GetNumericValue(c)))); // 2 
int day = Int32.Parse(string.Join("", 
    d.Split('/')[2].Select(c => char.GetNumericValue(c)))); // 20 

然後你就可以在此基礎上的值來創建DateTime;

DateTime dt = new DateTime(year, month, day); 

然後你可以使用;

PersianCalendar pc = new PersianCalendar(); 
var dt1 = pc.ToDateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond); 
// {10.05.2015 00:00:00} 
相關問題