C# 在DateTime中存储超过24小时
我在一个奇怪而非理性的行业工作,我们需要能够将一天中的时间表示为06:00:00到30:00:00,而不是0:00:00到24:00:00。使用DateTime类型有什么方法可以做到这一点吗?如果我试图构造一个小时值大于24的日期时间,它会抛出一个异常。不如改用一个C# 在DateTime中存储超过24小时,c#,datetime,C#,Datetime,我在一个奇怪而非理性的行业工作,我们需要能够将一天中的时间表示为06:00:00到30:00:00,而不是0:00:00到24:00:00。使用DateTime类型有什么方法可以做到这一点吗?如果我试图构造一个小时值大于24的日期时间,它会抛出一个异常。不如改用一个 DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0); DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0);
DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0);
DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0);
TimeSpan travelTime = arrival - departure;
Console.WriteLine("{0} - {1} = {2}", arrival, departure, travelTime);
然后使用TimeSpan obj的
TotalHours
属性我怀疑您是否能够完全完成所需的操作,但我希望您可以创建自己的DateTime类,只需将值增加+6小时。i、 e.在内部存储00-24,但get/set方法使其看起来像06-30。只需将业务逻辑存储/返回日期时间.Hours.Add(6)。您必须在显示逻辑中意识到这一点。使用普通DateTime来存储实际时间,编写一个新类来存储(或派生)DateTime,并使用ToString()来调整输出
我认为这应该只是一个演示问题 允许用户以这种奇怪的格式输入数据,并立即将其转换为UTC。按照UTC时间进行所有计算。然后创建一个ToString方法,将结果转换回您的奇怪格式。您可能还需要一些其他实用程序方法和属性,例如
WeirdDateTime.Day
的实现
您可以围绕DateTime编写一个包装器类,并在该类上拥有所需的所有转换和实用程序方法。我尝试过从一个奇怪格式的字符串开始解析。无论如何,这都不是生产代码,但也许它可以让您了解如何实现这一点:
class WeirdDateTime
{
public DateTime DateTime { get; set; }
public WeirdDateTime(int year, int month, int day, int hour, int minute, int second, DateTimeKind kind)
{
if (hour < 6 || hour >= 30)
throw new ArgumentException("Not a valid WeirdDateTime", "hour");
bool addDay;
if (hour >= 24)
{
addDay = true;
hour -= 24;
}
else
{
addDay = false;
}
DateTime dateTime = new DateTime(year, month, day, hour, minute, second, kind);
if (addDay)
dateTime = dateTime.AddDays(1);
DateTime = dateTime;
}
public static WeirdDateTime Parse(string s)
{
Regex regex = new Regex(@"(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})");
Match match = regex.Match(s);
if (!match.Success)
throw new FormatException("Not a valid WeirdDateTime");
int[] parts = match.Groups.Cast<Group>()
.Skip(1)
.Select(x => int.Parse(x.Value))
.ToArray();
int year = parts[0];
int month = parts[1];
int day = parts[2];
int hour = parts[3];
int minute = parts[4];
int second = parts[5];
return new WeirdDateTime(year, month, day, hour, minute, second, DateTimeKind.Unspecified);
}
public override string ToString()
{
throw new NotImplementedException("Write this!");
}
}
class Program
{
public static void Main()
{
WeirdDateTime weirdDateTime = WeirdDateTime.Parse("2010-01-19 27:00:00");
DateTime dateTimeUtc = weirdDateTime.DateTime.ToUniversalTime();
Console.WriteLine(dateTimeUtc);
}
}
类古怪的日期时间
{
公共日期时间日期时间{get;set;}
公共古怪日期时间(整数年、整数月、整数天、整数小时、整数分钟、整数秒、日期时间种类)
{
如果(小时<6小时>=30)
抛出新ArgumentException(“不是有效的WeirdDateTime”、“hour”);
布尔·阿德迪;
如果(小时>=24)
{
addDay=true;
小时-=24;
}
其他的
{
addDay=false;
}
DateTime DateTime=新的日期时间(年、月、日、小时、分钟、秒、种类);
如果(添加日期)
dateTime=dateTime.AddDays(1);
DateTime=DateTime;
}
公共静态WeirdDateTime解析(字符串s)
{
正则表达式Regex=newregex(@“(\d{4})-(\d{2})-(\d{2})(\d{2}):(\d{2}):(\d{2});
匹配=正则表达式匹配;
如果(!match.Success)
抛出新FormatException(“不是有效的WeirdDateTime”);
int[]parts=match.Groups.Cast()
.Skip(1)
.Select(x=>int.Parse(x.Value))
.ToArray();
整数年=零件[0];
整月=零件[1];
整数天=部分[2];
整小时=部分[3];
int分钟=零件[4];
int second=零件[5];
返回新的古怪日期时间(年、月、日、小时、分钟、秒、日期时间种类。未指定);
}
公共重写字符串ToString()
{
抛出新的NotImplementedException(“写这个!”);
}
}
班级计划
{
公共静态void Main()
{
WeirdDateTime WeirdDateTime=WeirdDateTime.Parse(“2010-01-19 27:00:00”);
DateTime dateTimeUtc=weirdDateTime.DateTime.ToUniversalTime();
Console.WriteLine(日期时间UTC);
}
}
I要计算雇佣工时,请使用此功能:
public string SumHours(string TimeIn, string TimeOut)
{
var parts = TimeIn.Split(':');
var hours = Int32.Parse(parts[0]);
var minutes = Int32.Parse(parts[1]);
var result = new TimeSpan(hours, minutes, 0);
TimeIn = result.ToString();
TimeSpan Hour1 = TimeSpan.Parse(TimeIn);
TimeSpan Hour2 = TimeSpan.Parse(TimeOut);
Hour1 = Hour1.Add(Hour2);
string HourtoStr = string.Format("{0:D2}:{1:D2}:{2:D2}", (Hour1.Days * 24 + Hour1.Hours), Hour1.Minutes, Hour1.Seconds);
return HourtoStr;
}
我很好奇。这是什么行业?@JohnFx-现在是四月一日之后all@JohnFx-我猜:?假设你有一个叫做古怪DateTime的约会时间。DateTime 2010-01-20 01:00:00对应的时间是否会在您的WeirdDateTime类中显示为2010-01-19 25:00:00?是的,您可以从现有的date-time类继承,并重写涉及hour@Chris辛普森,您不能从现有的DateTime结构继承。需要使用TimeSpan来执行类似的操作。@šljaker啊,我不知道。它必须是一个包装类,然后我尝试使用TimeSpan,但是任何超过24小时的时间都会被滚动到一天中。例如,36:00:00作为一个时间跨度最终将是1:12:00:00。这是一个什么问题?只需使用TimeSpan.TotalHours。@Rob然后使用TimeSpan对象的TotalHours属性。