2015-04-30 253 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} 
相关问题