2016-01-19 7 views
3

Я пытаюсь преобразовать конкретную персидскую дату в григорианскую без успеха. Я попытался использовать код ниже, но я получаю сообщение об ошибке компилятора:Преобразование персидской даты в григорианскую дату

DateTime не содержит конструктор, который принимает 4 аргумента.

using System.Globalization; 

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

Я также попытался ниже пути, но я получаю ту же персидскую дату (объект в поле ниже кода), что я перешел в ConvertToGregorian функции, а не григорианский дата:

public static DateTime ConvertToGregorian(this DateTime obj) 
    { 
     GregorianCalendar gregorian = new GregorianCalendar(); 
     int y = gregorian.GetYear(obj); 
     int m = gregorian.GetMonth(obj); 
     int d = gregorian.GetDayOfMonth(obj); 
     DateTime gregorianDate = new DateTime(y, m, d); 
     var result = gregorianDate.ToString(CultureInfo.InvariantCulture); 
     DateTime dt = Convert.ToDateTime(result); 
     return dt; 
    } 

Пожалуйста, обратите внимание, что мой CultureInfo.InvariantCulture - английский язык США.

+2

'CultureInfo.InvariantCulture - английский язык США --- Что? –

+0

@NikhilAgrawal, это не совсем неправильно: «Инвариантная культура нечувствительна к культуре; это связано с английским языком, но не с какой-либо страной/регионом ». (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.invariantculture.aspx) – Albireo

+1

Что ваш код работает для меня : 'new DateTime (год, месяц, день, новый PersianCalendar())'. И [MSDN] (https://msdn.microsoft.com/library/sk65c9c1) говорит, что данный конструктор здесь с .NET 1.1. – PetSerAl

ответ

0

Как отмечает Clockwork-Muse, DateTime не поддерживает ссылку на календарь, в котором он был преобразован или должен отображаться как, поэтому эту информацию необходимо поддерживать вне объекта DateTime. Вот пример решения:

using System; 
using System.Globalization; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Prepare to write the date and time data. 
      string FileName = string.Format(@"C:\users\public\documents\{0}.txt", Guid.NewGuid()); 
      StreamWriter sw = new StreamWriter(FileName); 

      //Create a Persian calendar class 
      PersianCalendar pc = new PersianCalendar(); 

      // Create a date using the Persian calendar. 
      DateTime wantedDate = pc.ToDateTime(1395, 4, 22, 12, 30, 0, 0); 
      sw.WriteLine("Gregorian Calendar: {0:O} ", wantedDate); 
      sw.WriteLine("Persian Calendar: {0}, {1}/{2}/{3} {4}:{5}:{6}\n", 
          pc.GetDayOfWeek(wantedDate), 
          pc.GetMonth(wantedDate), 
          pc.GetDayOfMonth(wantedDate), 
          pc.GetYear(wantedDate), 
          pc.GetHour(wantedDate), 
          pc.GetMinute(wantedDate), 
          pc.GetSecond(wantedDate)); 

      sw.Close(); 
     } 
    } 
} 

Результат:

Григорианский календарь: 2016-07-12T12: 30: 00,0000000

персидский Календарь: Вторник, 4/22/1395 12:30 : 0

При чтении спецификации формата «O» в григорианском результате отсутствует указание часового пояса, что означает, что «Тип» DateTime «Unspecified». Корректировки должны быть сделаны, если оригинальный плакат знает и заботится о том, с каким часовым поясом связана дата.