Преобразование персидской даты в григорианскую дату

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

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

using System.Globalization;

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

Я также пробовал ниже, но получаю ту же персидскую дату (obj в коде ниже), которую я передал в функцию 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 - английский США.


person azad    schedule 19.01.2016    source источник
comment
CultureInfo.InvariantCulture is English US --- Что?   -  person Nikhil Agrawal    schedule 19.01.2016
comment
@NikhilAgrawal это не совсем неправильно: «Инвариантная культура нечувствительна к культуре; он связан с английским языком, но не с какой-либо страной/регионом. (msdn.microsoft.com/en-us/library /)   -  person Albireo    schedule 19.01.2016
comment
Что ваш код работает для меня: new DateTime(year, month, day, new PersianCalendar()). И MSDN говорит, что данный конструктор здесь начиная с .NET 1.1.   -  person user4003407    schedule 19.01.2016
comment
@ PetSerAl: не могли бы вы сообщить мне, какую версию VS вы используете?   -  person azad    schedule 19.01.2016
comment
Это потому, что DateTime простой (и сломанный, но по другим причинам) и не поддерживает ссылку на календарь. Есть DateTime? Это григорианская дата, и точка.   -  person Clockwork-Muse    schedule 19.01.2016
comment
@azad Только что я использовал csi.exe, включенный в Visual Studio Community 2015 Update 1.   -  person user4003407    schedule 19.01.2016
comment
@azad - Телефон, UWP или обычный .NET?   -  person Henk Holterman    schedule 19.01.2016
comment
Я работаю над приложением UWP, но у меня возникла эта проблема.   -  person azad    schedule 19.01.2016
comment
@azad Вместо этого вам, возможно, придется использовать этот метод: new PersianCalendar().ToDateTime(year, month, day, 0, 0, 0, 0)   -  person user4003407    schedule 19.01.2016
comment
@PetSerAl - новый PersonCalendar().ToDateTime(год, месяц, день, 0, 0, 0, 0) тоже не работает   -  person azad    schedule 19.01.2016
comment
@PetSerAl: проблема решена с помощью: obj = persian.ToDateTime (год, месяц, день, 0, 0, 0, 0); Спасибо за подсказку!   -  person azad    schedule 20.01.2016


Ответы (1)


Как говорит 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

Персидский календарь: вторник, 22 апреля 1395 г., 12:30:0

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

person Gerard Ashton    schedule 24.01.2016