C# 比较两个日期,不允许与第一个议程事件重叠
我有日历,你可以在日程上安排一些约会,但第一次约会不允许有第二次约会。因此,不允许它们相互交叉。我试着这样做:C# 比较两个日期,不允许与第一个议程事件重叠,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我有日历,你可以在日程上安排一些约会,但第一次约会不允许有第二次约会。因此,不允许它们相互交叉。我试着这样做: public bool IsOverlapping(AgendaEventViewModel viewModel, AgendaEventViewModel newItem) { bool isOverlapping = false; DateTime? begin = DateTime.Parse(viewModel.s
public bool IsOverlapping(AgendaEventViewModel viewModel, AgendaEventViewModel newItem)
{
bool isOverlapping = false;
DateTime? begin = DateTime.Parse(viewModel.start);
DateTime? end = DateTime.Parse(viewModel.end);
newItem = new AgendaEventViewModel();
DateTime begin2 = DateTime.Parse(newItem.start);
DateTime end2 = DateTime.Parse(newItem.end);
// TODO: Check if Event is Overlapping with other events :) Dynamic RoomRules Check should implemented here
if (begin > end || begin2 > end2)
isOverlapping = false;
if (begin == end || begin2 == end2)
isOverlapping = false; // No actual date range
if (begin > end || begin2 > end2)
{
isOverlapping = false;
}
if (begin == begin2 && end == end2 )
{
isOverlapping = true;
this.ShowMessage(Message.Type.Info, Resources.AgendaEvent.IsOverlapping);
}
if (begin < begin2)
{
if (end > begin2 && end < end2)
isOverlapping = true; // possible1
if (end > end2)
isOverlapping = true; // possible 3
}
else
{
if (end2 > begin && end2 < end)
isOverlapping = true; // possible 2
if (end2 > end)
isOverlapping = true; // possible 4
}
return isOverlapping;
}
public bool IsOverlapping(AgendaEventViewModel viewModel, AgendaEventViewModel newItem)
{
bool isOverlapping = false;
// ReservationModel r = new ReservationModel(int.Parse(viewModel.id));
DateTime? begin = DateTime.Parse(viewModel.start);
DateTime? end = DateTime.Parse(viewModel.end);
newItem = new AgendaEventViewModel();
newItem.start = "2014-08-11 10:00:00.000";
newItem.end = "2014-08-11 11:00:00.000";
DateTime? begin2 = DateTime.Parse(newItem.start);
DateTime? end2 = DateTime.Parse(newItem.end);
// TODO: Check if Event is Overlapping with other events :) Dynamic RoomRules Check should implemented here
if (begin > end || begin2 > end2)
isOverlapping = false;
if (begin == end || begin2 == end2)
isOverlapping = false; // No actual date range
if (begin > end || begin2 > end2)
{
isOverlapping = false;
}
//if ((begin <= end2) && (begin2 <= end))
//{
// this.ShowMessage(Message.Type.Info, Resources.AgendaEvent.IsOverlapping);
// isOverlapping = true;
//}
if (begin == begin2 && end == end2)
{
this.ShowMessage(Message.Type.Info, Resources.AgendaEvent.IsOverlapping);
isOverlapping = true;
}
if (begin < begin2)
{
if (end > begin2 && end < end2)
isOverlapping = true; // possible1
if (end > end2)
isOverlapping = true; // possible 3
}
else
{
if (end2 > begin && end2 < end)
isOverlapping = true; // possible 2
if (end2 > end)
isOverlapping = true; // possible 4
}
return isOverlapping;
}
这是AgendaEventViewModel:
public class AgendaEventViewModel
{
public string ReturnUrl { get; set; }
public string id { get; set; }
public int? funeralId { get; set; }
public int? reservationId { get; set; }
public int? roomId { get; set; }
[Display(Name = "Title", ResourceType = typeof(Resources.AgendaEvent))]
public string title { get; set; }
[Display(Name = "Start", ResourceType = typeof(Resources.AgendaEvent))]
public string start { get; set; }
[Display(Name = "End", ResourceType = typeof(Resources.AgendaEvent))]
public string end { get; set; }
public string top { get; set; }
public string left { get; set; }
public List<RoomItemModel> RoomItems { get; set; }
public List<CateringItemModel> CateringItems { get; set; }
[Display(Name = "SeatingCapacity", ResourceType = typeof(Resources.AgendaEvent))]
public int? SeatingCapacity { get; set; } //Max Room SeatingCapacity
[Display(Name = "ExpectedSeatingCapacity", ResourceType = typeof(Resources.AgendaEvent))]
public int? ExpectedSeatingCapacity { get; set; } // User Chosen
}
但我在这一行中发现了这个错误:
DateTime begin2=DateTime.ParsenewItem.start;出现此错误时:
mscorlib.dll中发生“System.ArgumentNullException”类型的异常,但未在用户代码中处理
其他信息:字符串引用未设置为字符串的实例
多谢各位
好的,我现在有了,像这样:
public bool IsOverlapping(AgendaEventViewModel viewModel, AgendaEventViewModel newItem)
{
bool isOverlapping = false;
DateTime? begin = DateTime.Parse(viewModel.start);
DateTime? end = DateTime.Parse(viewModel.end);
newItem = new AgendaEventViewModel();
DateTime begin2 = DateTime.Parse(newItem.start);
DateTime end2 = DateTime.Parse(newItem.end);
// TODO: Check if Event is Overlapping with other events :) Dynamic RoomRules Check should implemented here
if (begin > end || begin2 > end2)
isOverlapping = false;
if (begin == end || begin2 == end2)
isOverlapping = false; // No actual date range
if (begin > end || begin2 > end2)
{
isOverlapping = false;
}
if (begin == begin2 && end == end2 )
{
isOverlapping = true;
this.ShowMessage(Message.Type.Info, Resources.AgendaEvent.IsOverlapping);
}
if (begin < begin2)
{
if (end > begin2 && end < end2)
isOverlapping = true; // possible1
if (end > end2)
isOverlapping = true; // possible 3
}
else
{
if (end2 > begin && end2 < end)
isOverlapping = true; // possible 2
if (end2 > end)
isOverlapping = true; // possible 4
}
return isOverlapping;
}
public bool IsOverlapping(AgendaEventViewModel viewModel, AgendaEventViewModel newItem)
{
bool isOverlapping = false;
// ReservationModel r = new ReservationModel(int.Parse(viewModel.id));
DateTime? begin = DateTime.Parse(viewModel.start);
DateTime? end = DateTime.Parse(viewModel.end);
newItem = new AgendaEventViewModel();
newItem.start = "2014-08-11 10:00:00.000";
newItem.end = "2014-08-11 11:00:00.000";
DateTime? begin2 = DateTime.Parse(newItem.start);
DateTime? end2 = DateTime.Parse(newItem.end);
// TODO: Check if Event is Overlapping with other events :) Dynamic RoomRules Check should implemented here
if (begin > end || begin2 > end2)
isOverlapping = false;
if (begin == end || begin2 == end2)
isOverlapping = false; // No actual date range
if (begin > end || begin2 > end2)
{
isOverlapping = false;
}
//if ((begin <= end2) && (begin2 <= end))
//{
// this.ShowMessage(Message.Type.Info, Resources.AgendaEvent.IsOverlapping);
// isOverlapping = true;
//}
if (begin == begin2 && end == end2)
{
this.ShowMessage(Message.Type.Info, Resources.AgendaEvent.IsOverlapping);
isOverlapping = true;
}
if (begin < begin2)
{
if (end > begin2 && end < end2)
isOverlapping = true; // possible1
if (end > end2)
isOverlapping = true; // possible 3
}
else
{
if (end2 > begin && end2 < end)
isOverlapping = true; // possible 2
if (end2 > end)
isOverlapping = true; // possible 4
}
return isOverlapping;
}
但是,如果我在日历上放置第二个议程项目,则begin en end将通过end2和begin2覆盖。您的newItem.start为null,因此当您尝试解析它时,它会抛出System.ArgumentNullException。在尝试解析新项目之前,请确保设置了该项目的日期。问题的答案是使用TryParse方法。Thet将告诉您是否无法将字符串解析为DateTime
DateTime begin2;
if (!DateTime.TryParse(newItem.start, out begin2))
{
// handle error.
}
但你还有其他问题需要解决
您正在设置isOverlapping,然后继续进行测试,以便通过稍后的逻辑重置它。实际返回值将是上次测试的值
为什么begin和end可以为空日期时间,而begin2和end2是常规日期时间
其中一些逻辑正在测试重叠,但其他逻辑正在验证开始值和结束值是否为合法值。也许验证逻辑应该分为一个单独的过程,以便您知道存在错误。您正在进行验证,但将其报告为非重叠结果。您在只接受一个参数的函数上得到ArgumentNullException。我认为这很好地表明newItem.start为null。查看您的代码-您正在清除newItem=new AgendaEventViewModel;传递的newItem;。谢谢,但是怎么做呢?