简体   繁体   English

区分8 am-9am和8 pm-9pm等之间的时间跨度

[英]Differentiate time spans between 8am-9am and 8pm-9pm, etc

I'm looking for a way to differentiate time spans, for example, between 8am-9am and 8pm-9pm, 10am-12pm and 10pm-12am, etc. in .NET. 我正在寻找一种区分时间跨度的方法,例如,.NET中的8 am-9am和8 pm-9pm、10am-12pm和10 pm-12am等。

Since time is relative, I'm looking for a creative way on how to achieve this. 由于时间是相对的,因此我正在寻找一种创新的方式来实现这一目标。

Here's what I've tried so far: 到目前为止,这是我尝试过的方法:

// 3:41pm - 4:41pm

DateStart: 5/7/2015 3:41:41 PM
DateExpire: 5/7/2015 4:41:41 PM

DateExpire.Subtract(DateStart): 01:00:00
ToUnixEpocTime(DateStart): 1431013301
ToUnixEpocTime(DateExpire): 1431016901
int timespan = ToUnixEpocTime(DateExpire) - ToUnixEpocTime(DateStart);
timespan: 3600


// 4:41pm - 5:41pm
DateStart: 5/7/2015 4:41:41 PM
DateExpire: 5/7/2015 5:41:41 PM
DateExpire.Subtract(DateStart): 01:00:00
ToUnixEpocTime(DateStart): 1431016901
ToUnixEpocTime(DateExpire): 1431020501
int timespan = ToUnixEpocTime(DateExpire) - ToUnixEpocTime(DateStart);
timespan: 3600

... which I'm not sure why these results surprised me as they make sense - as it's just basic subtraction. ...我不确定这些结果为什么会令我感到惊讶-因为这只是基本的减法。

As already stated, TimeSpan is time interval . 如前所述,TimeSpan是时间间隔 Time intervals 8am-9am and 8pm-9pm are exactly same - its 1 hour. 时间间隔8 am-9am和8 pm-9pm完全相同-1小时。 If you want to differentiate them, then create your own class which will hold start and end time of each interval and use these values to compare objects: 如果要区分它们,则创建自己的类,该类将保存每个间隔的开始和结束时间,并使用这些值比较对象:

public class DateRange
{
    public DateRange(DateTime start, DateTime end)
    {
        if (end < start)
           throw new ArgumentException("end");

        Start = start;
        End = end;
    }

    public DateTime Start { get; private set; }
    public DateTime End { get; private set; }
    public TimeSpan Duration { get { return End - Start; }}

    public override bool Equals(object obj)
    {
        DateRange other = obj as DateRange;
        if (other == null)
           return false;

        return Start == other.Start && End == other.End;
    }
    // override GetHashCode
}

Now if you have two date ranges 现在,如果您有两个日期范围

var morningRange = new DateRange(8amTime, 9amTime);
var eveningRange = new DateRange(8pmTime, 9pmTime);

they will not be same, but duration will be same 它们将不相同,但持续时间将相同

morningRange.Duration == eveningRange.Duration // true
morningRange.Equals(eveningRange) // false

You can also define == and != operators 您还可以定义==!=运算符

public static bool operator== (DateRange x, DateRange y)
{
    if (Object.ReferenceEquals(x, y))
        return true;

    if (((object)x == null) || ((object)y == null))
        return false;

    return x.Equals(y);
}

public static bool operator !=(DateRange x, DateRange y)
{
    return !(x == y);
}

Now comparison is even more easy 现在比较更加容易

morningRange == eveningRange // false
morningRange != eveningRange // true

My solution: 我的解决方案:

public class TimeRange
{
    private double _begin;              // total ms from 00:00
    private double _end;                // total ms from 00:00

    /// <param name="begin"> begin time (for example 8:30:15am) </param>
    /// <param name="end"> begin time (for example 12pm) </param>
    public TimeRange(DateTime begin, DateTime end)
    {
        _begin = begin.TimeOfDay.TotalMilliseconds;
        _end = end.TimeOfDay.TotalMilliseconds;
    }

    /// <summary>
    /// check time in range
    /// </summary>
    /// <param name="time"> time </param>
    /// <returns></returns>
    public bool IsDateInRange(DateTime time)
    {
        double value = time.TimeOfDay.TotalMilliseconds;
        return _end > _begin ? (value >= _begin && value <= _end) : (value >= _end && value <= _begin);
    }

    public override string ToString()
    {
        DateTime today = DateTime.Today;
        return string.Format(_end > _begin ? "{0}-{1}" : "{1}-{0}",
            (today + TimeSpan.FromMilliseconds(_begin)).ToString("HH:mm"),
            (today + TimeSpan.FromMilliseconds(_end)).ToString("HH:mm"));
    }
}

Usage: 用法:

TimeRange range = new TimeRange(DateTime.Today, DateTime.Now);
Console.WriteLine("Range is {0}", range.ToString());
for (int i = 0; i < 24; i++)
{
    Console.WriteLine("Time {0:00}:00 is in range? {1}", i, range.IsDateInRange(DateTime.Today.AddHours(i)));
}

Output: 输出:

Range is 00:00-17:45
Time 00:00 is in range? True
Time 01:00 is in range? True
Time 02:00 is in range? True
Time 03:00 is in range? True
Time 04:00 is in range? True
Time 05:00 is in range? True
Time 06:00 is in range? True
Time 07:00 is in range? True
Time 08:00 is in range? True
Time 09:00 is in range? True
Time 10:00 is in range? True
Time 11:00 is in range? True
Time 12:00 is in range? True
Time 13:00 is in range? True
Time 14:00 is in range? True
Time 15:00 is in range? True
Time 16:00 is in range? True
Time 17:00 is in range? True
Time 18:00 is in range? False
Time 19:00 is in range? False
Time 20:00 is in range? False
Time 21:00 is in range? False
Time 22:00 is in range? False
Time 23:00 is in range? False

JUST Giving an idea 提出一个想法

if both are AM or PM then 如果两者都是上午或下午,则
add 12 with time difference 加上12时差
else 其他
just minus 只是减

for example 例如
// 3:41pm - 4:41pm //下午3:41-下午4:41
DateStart: 5/7/2015 3:41:41 PM DateStart:2015年5月7日下午3:41:41
DateExpire: 5/7/2015 4:41:41 PM 日期到期:5/7/2015 4:41:41 PM

if(DateStart = PM and DateExpire = PM) if(DateStart = PM和DateExpire = PM)
timeSpan = (DateStart - DateExpire) + 12 timeSpan =(DateStart-DateExpire)+ 12
else 其他
timeSpan = (DateStart - DateExpire) timeSpan =(DateStart-DateExpire)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM