我在一个奇异且非理性的行业工作,我们需要能够将时间表示为06:00:00到30:00:00而不是0:00:00到24:00:00。有没有办法使用DateTime类型?如果我尝试构造一个小于24的小时值的日期时间,则抛出异常。
答案 0 :(得分:10)
我认为这只是一个演示问题。
允许您的用户以这种奇怪的格式输入数据,并立即将其转换为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);
}
}
答案 1 :(得分:2)
如何使用TimeSpan呢?
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
属性
答案 2 :(得分:2)
我怀疑你能做到你正在寻找的东西,但我希望你可以创建自己的DateTime类,只需在该值上加上+6小时。即在内部存储00 - 24,但get / set方法使其看起来像06 - 30.
答案 3 :(得分:0)
让你的业务逻辑存储/返回DateTime.Hours.Add(6)。您必须在显示逻辑中注意这一点。
答案 4 :(得分:0)
如何使用普通的DateTime存储实际时间,并编写一个存储(或派生自)DateTime的新类,并使用ToString()调整输出。
答案 5 :(得分:0)
TimeSpan的格式选项是
a:[天]。[小时]:[分钟]:[秒]。[小秒]
b:[天]。[小时]:[分钟]:[秒]
c:[天]。[小时]:[分钟]
d:[天]。[小时]
e:[天]
f:[小时]:[分钟]:[秒]。[小秒]
g:[小时]:[分钟]:[秒]
h:[小时]:[分钟]
答案 6 :(得分:0)
我用于计算雇佣工作时间的函数:
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;
}