2015-04-30 13 views
6

Để chuyển đổi một chuỗi ngày Persian để Gregorian DateTime, tôi sử dụng thời gian chọn ngày và nó sẽ gửi cho tôi một chuỗi như "۱۳۹۴/۰۲/۲۰"Chuyển đổi chuỗi ngày Persian để DateTime Gregorian

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()); 

và chức năng của tôi có thể chuyển đổi được

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);  
} 

Nó cung cấp DateTime làm cách nào tôi có thể gửi chính xác DateTime khi muốn chuyển đổi hiển thị lỗi này:

Input string was not in a correct format.

+0

'Hàm tạo DateTime' lấy số nguyên làm tham số và được biểu diễn bằng [Số Ả Rập] (http://en.wikipedia.org/wiki/Arabic_numerals) trong .NET Framework. –

Trả lời

5

Bạn có hai vấn đề khác nhau:

  • chữ số Ả Rập không được hỗ trợ bởi DateTime phân tích

  • PersianCalendar không phải là một phần của bất kỳ CultureInfo, vì vậy bạn không thể sử dụng nó trực tiếp trong khi phân tích cú pháp string thành DateTime (và bạn không thể đặt nó thành một từ trước CultureInfo).

giải pháp có thể:

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

Thay các chữ số từ tiếng Ả Rập để thập phân

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

Sau đó phân tích ngày phớt lờ lịch

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

Sau đó, chuyển đổi ngày tới đúng lịch .

3

Bạn phải chuyển đổi chữ số Ba Tư thành int * theo cách thủ công, ví dụ:

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

Map để chữ số Ả Rập đầu tiên:

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('/');  

Sự thay đổi chính từ mã ban đầu của bạn: Lập bản đồ từ một mảng các số tiếng Ba Tư (năm, tháng, ngày), để một mảng tương đương chứa các giá trị bằng số Ả rập:

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

Bây giờ bạn có thể sử dụng khi bạn sử dụng một trong những khác trước:

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

Như tôi đã nhận xét; Eastern Arabic numerals không được hỗ trợ bởi DateTime phương pháp phân tích cú pháp, nó chỉ chấp nhận Arabic numerals.

Tuy nhiên, char loại có GetNumericValue method chuyển đổi bất kỳ ký tự Unicode số thành double.

Hãy sử dụng kết hợp các phương thức 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 

Và sau đó bạn có thể tạo DateTime dựa trên giá trị này;

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

Sau đó, bạn có thể sử dụng;

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} 
Các vấn đề liên quan