年,月和日参数描述波斯日历中无法表示的DateTime

时间:2014-05-19 07:50:47

标签: c# asp.net datetime

我使用以下代码来呈现今天的波斯日期...我工作过的网站自两个月前开始上线,但它工作正常,但今天我收到了以下错误:

年,月和日参数描述了无法表示的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");

}

3 个答案:

答案 0 :(得分:7)

DateTime不记得它们是如何创建的。所以,例如d1并不记得,在过去的某个时刻,您使用PersianCalendar实例获取3 int s,然后在其构造函数中使用它们。那constructor(隐含地)假设你从格里高利历中经过了几年,几个月和几天。

然后,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));

}

答案 1 :(得分:1)

答案很有效...现在我想将txtDate.Text中给出的波斯日期更改回常规日期以将其保存在数据库中。例如我想将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); 

有没有办法解决这个问题?

答案 2 :(得分:1)

此代码段发生异常错误:

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之间。所以我建议您确保传递有效日期。