17

これらのコードを使用して現在の日時を変換し、ユーザーがテキストボックスに入力した日時を差し引いています。しかし、変換中にエラーが発生します。

PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime date = new DateTime();
date = DateTime.Parse(DateTime.Now.ToShortDateString());
int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
string str = string.Format("{0}/{1}/{2}", year, month, day);
DateTime d1 = DateTime.Parse(str);
DateTime d2 = DateTime.Parse(textBox9.Text);
string s = (d2 - d1).ToString().Replace(".00:00:00", "");
textBox10.Text = (d2 - d1).ToString().Replace(".00:00:00","");

この行は、日時を文字列から日時に変換するときにエラーになります。DateTime d1 = DateTime.Parse(str);

この問題を解決するのを手伝ってください。

前もって感謝します

4

14 に答える 14

15

ここで日付を解析する必要はありません。

編集:

もともと、この回答でOP処理のエラーを指摘したかっただけです。しかし、私は完全な答えがより良いと思います(遅れにもかかわらず:))そして、はい、中間の日付表現がペルシャ日付のように見えないことを知っています. しかし、それは必要なものではありません。このコードは、現在の日付とユーザーが入力した日付の適切な違いを示します。

string userInput = "1394/02/31";
System.DateTime date = System.DateTime.Today;
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();

int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
System.DateTime currentDate = new System.DateTime(year, month, 1);
currentDate = currentDate.AddDays(day - 1);

// validation omitted
System.String[] userDateParts = userInput.Split(new[] { "/" }, System.StringSplitOptions.None);
int userYear = int.Parse(userDateParts[0]);
int userMonth = int.Parse(userDateParts[1]);
int userDay = int.Parse(userDateParts[2]);
System.DateTime userDate = new System.DateTime(userYear, userMonth, 1);
userDate = userDate.AddDays(userDay - 1);

System.TimeSpan difference = currentDate.Subtract(userDate);
于 2012-05-18T15:16:30.213 に答える
14

実際の問題は、ユーザーがペルシャ暦形式で入力した日付の解析にあるようです。したがって、ユーザーが入力した場合は、それ1391/2/31を解析できるようにする必要があります。今日(2012 年 5 月 19 日)1391/2/30なので、最終的に次のようなものを表示する必要があります1 day remaining

この質問は以前に尋ねられました。ただし、そこで受け入れられた回答は、使用しようとするだけです

string persianDate = "1390/02/07";
CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime persianDateTime = DateTime.ParseExact(persianDate, 
    "yyyy/MM/dd", persianCulture);

のような日付では機能しません1391/2/31。したがって、解析を自分で実装する必要があると思います。

エラーチェックを実装せずに、ユーザーが常に使用できる形式yyyy/mm/ddを使用すると仮定します。

// Convert Persian Calendar date to regular DateTime
var persianDateMatch = System.Text.RegularExpressions.Regex.Match(
    persianTargetTextBox.Text, @"^(\d+)/(\d+)/(\d+)$");
var year = int.Parse(persianDateMatch.Groups[1].Value);
var month = int.Parse(persianDateMatch.Groups[2].Value);
var day = int.Parse(persianDateMatch.Groups[3].Value);
var pc = new System.Globalization.PersianCalendar();
var target = pc.ToDateTime(year, month, day, 0, 0, 0, 0);

var difference = target - DateTime.Today;
differenceLabel.Text = difference.TotalDays.ToString("0");

正規表現が実際に一致を見つけたかどうかを確認する必要があります。pc.ToDateTimeエラーがスローされないかどうかも確認する必要があります。DateTime.TryParse残念ながら、ペルシャ暦のようなものはないようです。

とにかく、今日を解析してペルシャ暦にする必要はありません。ユーザー入力を解析するだけで済みます。

この記事は非常に古いものですが (2007 年) 、 Farsi Library - Working with Dates, Calendars, and DatePickersにも興味があるかもしれません。

于 2012-05-19T09:34:53.313 に答える
12

クラスでToDateTimeメソッドを使用するだけです:PersianCalendar

PersianCalendar p = new PersianCalendar();
DateTime now = DateTime.Now;
DateTime dateT = p.ToDateTime(now.Year, now.Month, now.Day, 0, 0, 0, 0);

次に、その形式で文字列を取得するには、次のようにします。

string str = dateT.ToShortDateString();
于 2012-05-18T15:17:39.963 に答える
8

私はその問題を解決しました。一部の月の例外が原因だったので、2 つの日付時刻を互いに減算したい場合は、両方をグレゴリオ暦に変換する必要があります。その後、それらを減算して結果を確認できます。

コードは次のとおりです。

PersianCalendar p = new PersianCalendar();
        string PersianDate1 = textBox1.Text;
        string[] parts = PersianDate1.Split('/', '-');
        DateTime dta1 = p.ToDateTime(Convert.ToInt32(parts[0]), Convert.ToInt32(parts[1]), Convert.ToInt32(parts[2]), 0, 0, 0, 0);
        string PersianDate2 = textBox2.Text;
        string[] parts2 = PersianDate2.Split('/', '-');
        DateTime dta2 = p.ToDateTime(Convert.ToInt32(parts2[0]), Convert.ToInt32(parts2[1]), Convert.ToInt32(parts2[2]), 0, 0, 0, 0);
        string s = (dta2 - dta1).ToString().Replace(".00:00:00", "");
        textBox3.Text = s; // Show the result into the textbox 
于 2012-08-10T20:10:25.293 に答える
5

ドキュメントがあなたの友達であるところはここにあります:

PersianCalendarクラス

DateTimeコンストラクター(Int32、Int32、Int32、Calendar)

これはあなたが必要とする正確なコードです:

PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime today = DateTime.Today;
DateTime pDate = new DateTime(p.GetYear(today), p.GetMonth(today), p.GetDayOfMonth(today), p);
DateTime d2 = DateTime.Parse(textBox9.Text);
// THIS NEEDS TO BE EXPLAINED
textBox10.Text = (d2 - pDate).ToString().Replace(".00:00:00","");

最終的に、あなたは何をしようとしていますか?あなたが期待している結果は何textBox10ですか?2つの日付の間の日数が必要な場合は、そうするだけ(d2 - pDate).ToString("d")で、日数の差が得られます。たぶん、あなたが何をしようとしているのかではなく、あなたが何をしようとしているのかをもう少し詳しく説明した場合、私たちはおそらくあなたをさらに助けることができます。

編集:comecmeが言っていることに気づきました。問題を引き起こす可能性のある行は次のとおりです。

DateTime d2 = DateTime.Parse(textBox9.Text);

代わりに、カルチャ情報も使用するように変更する必要があります。

CultureInfo persianCulture = new CultureInfo("fa-IR");
DateTime d2 = DateTime.Parse(textBox9.Text, persianCulture)

編集:あなたは正しいです、それはペルシア語形式の日付を解析することだけを許可しますが、特定のカレンダーに従って検証しません。これを正しく機能させるには、日付を手動で解析し、提供されたPersianCalendarを使用して新しいDateTimeをインスタンス化する必要があります。

DateTime d2;
if(Regex.IsMatch(textBox9.Text, "^dddd/dd/dd$"))
{
    d2 = new DateTime(
        int.Parse(textBox9.Substring(0,4)), 
        int.Parse(textBox9.Substring(5, 2)), 
        int.Parse(textBox9.Substring(8, 2)),
        p);
}

入力が指定した形式と完全に一致することを確認する必要があります。一致しない場合、DateTimeを一貫して正確に解析する方法がありません。

于 2012-05-18T15:29:19.477 に答える
1

次のコードを使用できます。

  DateTime today = DateTime.Today; // excludes h/m/s

  DateTime userdate = DateTime.Parse(textBox9.Text);

一方を他方から差し引くと、TimeSpanが得られます。

  TimeSpan diff = today - userDate;

この期間のプロパティを使用して、好きなように表示できます。

ペルシャ暦への変換フォームを管理するには、ここに優れたソリューションがあります。

.NETペルシア語(ジャラーリー暦)の日付文字列をDateTimeオブジェクトに解析する方法は?

参照:

DateTime.Today

期間

于 2012-05-18T15:30:00.300 に答える
1

これが私が使用しているコードです:

  public DateTime ConvertPersianToEnglish(string persianDate)
        {
            string[] formats = { "yyyy/MM/dd", "yyyy/M/d", "yyyy/MM/d", "yyyy/M/dd" };
            DateTime d1 = DateTime.ParseExact(persianDate, formats,
                                              CultureInfo.CurrentCulture, DateTimeStyles.None);
            PersianCalendar persian_date = new PersianCalendar();
            DateTime dt = persian_date.ToDateTime(d1.Year, d1.Month, d1.Day, 0, 0, 0, 0, 0);
            return dt;
        }
于 2014-07-02T18:30:30.393 に答える
1

これは、 Noda Timeを使用すると、はるかに簡単に実行できます。

using System.Globalization;
using NodaTime;
using NodaTime.Text;

...

CultureInfo culture = CultureInfo.CreateSpecificCulture("fa-IR");
CalendarSystem calendar = CalendarSystem.GetPersianCalendar();
LocalDate template = new LocalDate(1, 1, 1, calendar);
LocalDatePattern pattern = LocalDatePattern.Create("yyyy/M/d", culture, template);
LocalDate result = pattern.Parse("1391/2/30").Value;

// if you need a DateTime, then:
DateTime dt = result.AtMidnight().ToDateTimeUnspecified();
于 2015-09-20T19:47:50.693 に答える
0

この単純なコードを使用して、ペルシャ暦の値を C# の Datetime オブジェクトに変換し、計算を行うことができます。

DateTime dateTime 
      = new DateTime(persianYear, persianMonth, persianDay, new PersianCalendar());
于 2020-05-19T07:49:39.560 に答える
0

このコードを試してください: このコードは「grzegorz W」によって投稿された編集済みのコードですが、彼のコードは、たとえば、ユーザー入力の日付が「1394/06/31」で、エラーが「年、月、および日のパラメーターが un-表現可能な日時」

以下のコードは問題ありません:

string userInput = "1394/02/31";
System.DateTime date = System.DateTime.Today;
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();

int year = p.GetYear(date);
int month = p.GetMonth(date);
int day = p.GetDayOfMonth(date);
System.DateTime currentDate = new System.DateTime(year, month, day,p);


System.String[] userDateParts = userInput.Split(new[] { "/" },      System.StringSplitOptions.None);
int userYear = int.Parse(userDateParts[0]);
int userMonth = int.Parse(userDateParts[1]);
int userDay = int.Parse(userDateParts[2]);
System.DateTime userDate = new System.DateTime(userYear, userMonth, userDay,p);


System.TimeSpan difference = currentDate.Subtract(userDate);
于 2016-09-21T09:23:49.393 に答える
0
private void timer1_Tick(object sender, EventArgs e)
{
    labelDataAD.Text = DateTime.Now.ToString("dd/MM/yyyy");
    PersianCalendar persianCalendar = new PersianCalendar();
    string Full = persianCalendar.GetYear(DateTime.Now) + "/" + 
    persianCalendar.GetMonth(DateTime.Now)+"/"+ 
    persianCalendar.GetDayOfMonth(DateTime.Now);
    labelDataSolar.Text = string.Format("{0:yyyy\\:MM\\:dd}", Full);
}

private void FormCalendar_Load(object sender, EventArgs e)
{           
    timer1.Start();
}

出力は次のとおりです。

日付出力

于 2021-08-06T07:36:43.627 に答える