年、月和日参数描述波斯语日历中不可表示的DateTime



为了表示今天的波斯语日期,我使用了以下代码…我工作的网站已经上线两个月前,它一直工作良好,但今天我收到以下错误:

Year、Month和Day参数描述了一个不可表示的DateTime。

我不知道为什么会这样…有办法解决这个问题吗?

protected void lbnChangeDate_Click(object sender, EventArgs e)
{
    PersianCalendar p = new PersianCalendar();
    DateTime date = DateTime.Now;
    int year = p.GetYear(date);
    int month = p.GetMonth(date);
    int day = p.GetDayOfMonth(date);
    DateTime d1 = new DateTime(year, month, day);
    MultiView6.SetActiveView(View12);
    txtDate.Text = DateTime.Parse(d1.ToString()).ToString("yyyy/MM/dd");
}

DateTime不记得它们是如何创建的。因此,例如d1不记得,在过去的某个时刻,你使用PersianCalendar实例获得了3个int s,然后在它的构造函数中使用它们。该构造函数(隐式地)假定您传递的是公历中的年、月和日。

然后,DateTime.Parse不知道很久以前你访问了PersianCalendar,并对它做了不适当的事情。

如果您想将波斯语日历日期显示为字符串,只需将其用作:

protected void lbnChangeDate_Click(object sender, EventArgs e)
{
    PersianCalendar p = new PersianCalendar();
    DateTime date = DateTime.Now;
    txtDate.Text = string.Format("{0:0000}/{1:00}/{2:00}",
                    p.GetYear(date),
                    p.GetMonth(date),
                    p.GetDayOfMonth(date));
}

答案很好…现在我想更改在txtDate中给出的波斯语日期。将文本返回到常规日期以将其保存在数据库中。例如,我想将1393/05/05更改为2014/05/26,然后将其保存到数据库…我使用了以下代码,但是我遇到了在第一篇文章中讨论的相同问题…

                    date = Convert.ToDateTime(txtDate.Text);
                    string change = date.ToString("yyyy/MM/dd");
                    int day1 = Convert.ToInt32(change.Substring(8, 2));
                    int mon1 = Convert.ToInt32(change.Substring(5, 2));
                    int year1 = Convert.ToInt32(change.Substring(0, 4));
                    PersianCalendar pc = new PersianCalendar();
                    change = (pc.ToDateTime(year1, mon1, day1, 0, 0, 0, 0).ToString("yyyy/MM/dd").Substring(0, 10));
                    date = Convert.ToDateTime(change); 

有办法解决这个问题吗?

异常错误发生在以下代码段:

System.DateTime.DateToTicks(Int32 year, Int32 month, Int32 day)

调用:

[__DynamicallyInvokable]
public DateTime(int year, int month, int day)
{
  this.dateData = (ulong) DateTime.DateToTicks(year, month, day);
}

这段代码是这样的:

private static long DateToTicks(int year, int month, int day)
{
  if (year >= 1 && year <= 9999 && (month >= 1 && month <= 12))
  {
    int[] numArray = DateTime.IsLeapYear(year) ? DateTime.DaysToMonth366 : DateTime.DaysToMonth365;
    if (day >= 1 && day <= numArray[month] - numArray[month - 1])
    {
      int num = year - 1;
      return (long) (num * 365 + num / 4 - num / 100 + num / 400 + numArray[month - 1] + day - 1) * 864000000000L;
    }
  }
  throw new ArgumentOutOfRangeException((string) null, Environment.GetResourceString("ArgumentOutOfRange_BadYearMonthDay"));
}

该方法抛出异常的唯一方式是年小于1或大于9999且月不在1到12之间。所以我建议你确保你传递的是有效的日期。

相关内容

  • 没有找到相关文章

最新更新