C# 在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);

我在一个奇怪而非理性的行业工作,我们需要能够将一天中的时间表示为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);
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()来调整输出

  • 您应该使用TimeSpan,而不是DateTime
  • TimeSpan的格式选项为

    答:[天].[小时]:[分钟]:[秒].[分秒]

    【天】【小时】:【分钟】:【秒】

    c:[天].[小时]:[分钟]

    d:[天].[小时]

    e:[天]

    f:[小时]:[分钟]:[秒].[分数秒]

    g:[小时]:[分钟]:[秒]

    h:[小时]:[分钟]


  • 我认为这应该只是一个演示问题

    允许用户以这种奇怪的格式输入数据,并立即将其转换为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属性。