C# 日期时间格式和比较
C# DateTime Format and Comparison
我正在为我的大学编写课程安排程序,我在使用 C# 进行比较时遇到了一些麻烦。对于每门课程,给定的日期时间采用如下字符串格式:
string Start_Time = "10:00";
string End_Time = "10:50";
我需要将它们转换为 DateTime 格式(最好限制为 HH:mm),然后进行比较以确保课程之间没有重叠。我当前要检查的代码如下所示。
static bool checkTimes(Courses courseOne, Courses courseTwo)
{
bool overlapChecker = false;
// Get comparison values for course times
DateTime s1 = Convert.ToDateTime(courseOne.Start_Time);
DateTime s2 = Convert.ToDateTime(courseTwo.Start_Time);
DateTime e1 = Convert.ToDateTime(courseOne.End_Time);
DateTime e2 = Convert.ToDateTime(courseTwo.End_Time);
// Check for overlapping days of the week
foreach (char c1_days in courseOne.Days)
{
foreach (char c2_days in courseTwo.Days)
{
if (c1_days == c2_days)
{
overlapChecker = true;
}
}
}
// If there are any overlapping days, compare DateTimes of courses for overlap
if (overlapChecker == true)
{
// Compare all possibilities of time overlap
if ((s2 >= s1 && s2 <= e1) || (e1 >= s1 && e1 <= e2))
{
return true;
}
}
return false;
}
目前,这不起作用。我不太确定哪里出了问题,但我们将不胜感激任何帮助。谢谢!
你可以2步。
首先 => 在模型 "Courses" 中创建将字符串转换为日期时间的方法,例如:
public DateTime StartTime()
{
return new DateTime(2018,6,18,this.Start_Time.split(':')[0],this.Start_Time.split[1]);
}
第二个 => 重写课程的 equals 方法:
public override bool equals(object entity)
{
var temp = entity as Courses;
if (temp == null) return false;
//Logics for a Course is equal to another Course
If (this.StartTime == temp.StartTime)
return true;
return false;
}
而且你不能有方法 "CheckTimes",只需调用:
bool result = CourseOne.equals ( CouseTwo );
我在这里做了一个几乎没有假设的 rextester - http://rextester.com/UDI9335
假设:
你的Course
class如下
public class Course {
public string cName { get; set; }
public string Start_Time { get; set; }
public string End_Time { get; set; }
public List<string> Days { get; set; }
}
- classes 在所有给定的日子里同时发生。 (根据您的代码)
Days
是 strings
的 List
,我暂时想到了像 M, T, W, T, F
这样的字符列表或数组,但这会给出不正确的结果,因为 [=17] =] 正在重复。周二和周四
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Globalization;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
Course c1 = new Course{
cName = "Course 1",
Start_Time = "10:00",
End_Time = "10:50",
Days = new List<string>{ "Mon", "Tue", "Wed"}
};
Course c2 = new Course{
cName = "Course 2",
Start_Time = "10:40",
End_Time = "11:20",
Days = new List<string>{ "Wed", "Thu", "Fri"}
};
Course c3 = new Course{
cName = "Course 3",
Start_Time = "11:30",
End_Time = "12:20",
Days = new List<string>{ "Mon", "Tue", "Fri"}
};
bool areC1C2Clashing = areCoursesClashing(c1, c2);
Console.WriteLine("Are c1 & c2 clashing - " + areC1C2Clashing);
Console.WriteLine();
bool areC2C3Clashing = areCoursesClashing(c2, c3);
Console.WriteLine("Are c2 & c3 clashing - " + areC2C3Clashing);
Console.WriteLine();
bool areC1C3Clashing = areCoursesClashing(c1, c3);
Console.WriteLine("Are c1 & c3 clashing - " + areC1C3Clashing);
Console.WriteLine();
}
public static bool areCoursesClashing(Course cA, Course cB){
bool clashDetected = false;
foreach(var coruseDay in cA.Days){
if(cB.Days.Contains(coruseDay)){
DateTime cAStartTime = DateTime.ParseExact(cA.Start_Time, "HH:mm", CultureInfo.InvariantCulture);
DateTime cAEndTime = DateTime.ParseExact(cA.End_Time, "HH:mm", CultureInfo.InvariantCulture);
DateTime cBStartTime = DateTime.ParseExact(cB.Start_Time, "HH:mm", CultureInfo.InvariantCulture);
DateTime cBEndTime = DateTime.ParseExact(cB.End_Time, "HH:mm", CultureInfo.InvariantCulture);
if( cAStartTime < cBEndTime && cBStartTime < cAEndTime){
Console.WriteLine("WARNING!!! Classes clash for --> " + cA.cName + " & " + cB.cName);
clashDetected = true;
}
}
}
return clashDetected;
}
}
public class Course {
public string cName { get; set; }
public string Start_Time { get; set; }
public string End_Time { get; set; }
public List<string> Days { get; set; }
}
}
输出:
WARNING!!! Classes clash for --> Course 1 & Course 2
Are c1 & c2 clashing - True
Are c2 & c3 clashing - False
Are c1 & c3 clashing - False
我正在为我的大学编写课程安排程序,我在使用 C# 进行比较时遇到了一些麻烦。对于每门课程,给定的日期时间采用如下字符串格式:
string Start_Time = "10:00";
string End_Time = "10:50";
我需要将它们转换为 DateTime 格式(最好限制为 HH:mm),然后进行比较以确保课程之间没有重叠。我当前要检查的代码如下所示。
static bool checkTimes(Courses courseOne, Courses courseTwo)
{
bool overlapChecker = false;
// Get comparison values for course times
DateTime s1 = Convert.ToDateTime(courseOne.Start_Time);
DateTime s2 = Convert.ToDateTime(courseTwo.Start_Time);
DateTime e1 = Convert.ToDateTime(courseOne.End_Time);
DateTime e2 = Convert.ToDateTime(courseTwo.End_Time);
// Check for overlapping days of the week
foreach (char c1_days in courseOne.Days)
{
foreach (char c2_days in courseTwo.Days)
{
if (c1_days == c2_days)
{
overlapChecker = true;
}
}
}
// If there are any overlapping days, compare DateTimes of courses for overlap
if (overlapChecker == true)
{
// Compare all possibilities of time overlap
if ((s2 >= s1 && s2 <= e1) || (e1 >= s1 && e1 <= e2))
{
return true;
}
}
return false;
}
目前,这不起作用。我不太确定哪里出了问题,但我们将不胜感激任何帮助。谢谢!
你可以2步。 首先 => 在模型 "Courses" 中创建将字符串转换为日期时间的方法,例如:
public DateTime StartTime()
{
return new DateTime(2018,6,18,this.Start_Time.split(':')[0],this.Start_Time.split[1]);
}
第二个 => 重写课程的 equals 方法:
public override bool equals(object entity)
{
var temp = entity as Courses;
if (temp == null) return false;
//Logics for a Course is equal to another Course
If (this.StartTime == temp.StartTime)
return true;
return false;
}
而且你不能有方法 "CheckTimes",只需调用:
bool result = CourseOne.equals ( CouseTwo );
我在这里做了一个几乎没有假设的 rextester - http://rextester.com/UDI9335
假设:
你的
Course
class如下public class Course { public string cName { get; set; } public string Start_Time { get; set; } public string End_Time { get; set; } public List<string> Days { get; set; } }
- classes 在所有给定的日子里同时发生。 (根据您的代码)
Days
是strings
的List
,我暂时想到了像M, T, W, T, F
这样的字符列表或数组,但这会给出不正确的结果,因为 [=17] =] 正在重复。周二和周四
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Globalization;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
Course c1 = new Course{
cName = "Course 1",
Start_Time = "10:00",
End_Time = "10:50",
Days = new List<string>{ "Mon", "Tue", "Wed"}
};
Course c2 = new Course{
cName = "Course 2",
Start_Time = "10:40",
End_Time = "11:20",
Days = new List<string>{ "Wed", "Thu", "Fri"}
};
Course c3 = new Course{
cName = "Course 3",
Start_Time = "11:30",
End_Time = "12:20",
Days = new List<string>{ "Mon", "Tue", "Fri"}
};
bool areC1C2Clashing = areCoursesClashing(c1, c2);
Console.WriteLine("Are c1 & c2 clashing - " + areC1C2Clashing);
Console.WriteLine();
bool areC2C3Clashing = areCoursesClashing(c2, c3);
Console.WriteLine("Are c2 & c3 clashing - " + areC2C3Clashing);
Console.WriteLine();
bool areC1C3Clashing = areCoursesClashing(c1, c3);
Console.WriteLine("Are c1 & c3 clashing - " + areC1C3Clashing);
Console.WriteLine();
}
public static bool areCoursesClashing(Course cA, Course cB){
bool clashDetected = false;
foreach(var coruseDay in cA.Days){
if(cB.Days.Contains(coruseDay)){
DateTime cAStartTime = DateTime.ParseExact(cA.Start_Time, "HH:mm", CultureInfo.InvariantCulture);
DateTime cAEndTime = DateTime.ParseExact(cA.End_Time, "HH:mm", CultureInfo.InvariantCulture);
DateTime cBStartTime = DateTime.ParseExact(cB.Start_Time, "HH:mm", CultureInfo.InvariantCulture);
DateTime cBEndTime = DateTime.ParseExact(cB.End_Time, "HH:mm", CultureInfo.InvariantCulture);
if( cAStartTime < cBEndTime && cBStartTime < cAEndTime){
Console.WriteLine("WARNING!!! Classes clash for --> " + cA.cName + " & " + cB.cName);
clashDetected = true;
}
}
}
return clashDetected;
}
}
public class Course {
public string cName { get; set; }
public string Start_Time { get; set; }
public string End_Time { get; set; }
public List<string> Days { get; set; }
}
}
输出:
WARNING!!! Classes clash for --> Course 1 & Course 2
Are c1 & c2 clashing - True
Are c2 & c3 clashing - False
Are c1 & c3 clashing - False