|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
namespace BBWY.Client.Helpers
|
|
|
|
{
|
|
|
|
public class PackTaskTimerHelper
|
|
|
|
{
|
|
|
|
/// <summary>
|
|
|
|
/// 是否停止倒计时
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="dateTime"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public static bool IsStopTimer(DateTime dateTime)
|
|
|
|
{
|
|
|
|
var hour = dateTime.Hour;
|
|
|
|
|
|
|
|
if (hour < 9 || hour >= 18 || (hour == 12))
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 计算有效超时时间
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="startTime"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public static DateTime AccountEffectiveOverTime(DateTime overTime)
|
|
|
|
{
|
|
|
|
var userStartTime = overTime;//有效开始时间
|
|
|
|
|
|
|
|
if (overTime.Hour < 9)
|
|
|
|
{
|
|
|
|
userStartTime = overTime.Date.AddHours(9);//未到9店 按9点计时
|
|
|
|
}
|
|
|
|
if (overTime.Hour >= 18)//从隔天9点开始计时
|
|
|
|
{
|
|
|
|
userStartTime = overTime.Date.AddHours(18);//超过18点 按次日9点计时
|
|
|
|
}
|
|
|
|
if (overTime.Hour == 12)
|
|
|
|
{
|
|
|
|
userStartTime = overTime.Date.AddHours(13);//中午未到13点 按13点计时
|
|
|
|
}
|
|
|
|
|
|
|
|
if (userStartTime.DayOfWeek == DayOfWeek.Sunday)
|
|
|
|
{
|
|
|
|
userStartTime = userStartTime.Date.AddDays(1).AddHours(9);//周日算周1 9点开始
|
|
|
|
}
|
|
|
|
|
|
|
|
return userStartTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 计算有效当前时间
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="endTime">完成时间</param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public static DateTime AccountEffectiveNowTime(DateTime nowTime)
|
|
|
|
{
|
|
|
|
var userEndTime = nowTime;//有效开始时间
|
|
|
|
|
|
|
|
if (nowTime.Hour < 9)
|
|
|
|
{
|
|
|
|
userEndTime = nowTime.Date.AddDays(-1).AddHours(18);//未到9店 按前一天 18点完成
|
|
|
|
}
|
|
|
|
if (nowTime.Hour >= 18)
|
|
|
|
{
|
|
|
|
userEndTime = nowTime.Date.AddHours(18);//超过18点 按18点完成
|
|
|
|
}
|
|
|
|
if (nowTime.Hour == 12)
|
|
|
|
{
|
|
|
|
userEndTime = nowTime.Date.AddHours(12);//中午未到13点 按12点计时
|
|
|
|
}
|
|
|
|
|
|
|
|
if (userEndTime.DayOfWeek == DayOfWeek.Sunday)
|
|
|
|
{
|
|
|
|
userEndTime = userEndTime.Date.AddDays(-1).AddHours(18);//周日算周六 18点完成
|
|
|
|
}
|
|
|
|
return userEndTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 计算有效剩余时长
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="startTime">开始时间</param>
|
|
|
|
/// <param name="completedTime">完成时间</param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public static TimeSpan AccountEffectiveRemainDuration(DateTime nowTime, DateTime overTime)
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var effectiveNowTime = AccountEffectiveNowTime(nowTime);
|
|
|
|
|
|
|
|
var effectiveOverTime = AccountEffectiveOverTime(overTime);
|
|
|
|
|
|
|
|
|
|
|
|
if (effectiveNowTime < effectiveOverTime)
|
|
|
|
{
|
|
|
|
return AccountEffectiveDuration(effectiveNowTime , effectiveOverTime);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return -AccountEffectiveDuration( effectiveOverTime, effectiveNowTime);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 计算有效时长(任务耗时)
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="startTime">开始时间</param>
|
|
|
|
/// <param name="completedTime">完成时间</param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public static TimeSpan AccountEffectiveDuration(DateTime effectiveStartTime, DateTime effectiveCompletedTime)
|
|
|
|
{
|
|
|
|
|
|
|
|
var timespan = effectiveCompletedTime - effectiveStartTime;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var hoursTimeSpan = timespan.Add(TimeSpan.FromDays(-CountSundays(effectiveStartTime, effectiveCompletedTime)));//计算小时差
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//1. 开始时间 12点 结束时间 10点
|
|
|
|
if (effectiveStartTime.TimeOfDay > effectiveCompletedTime.TimeOfDay)
|
|
|
|
{
|
|
|
|
if (effectiveStartTime.Hour <= 12)//-16小时
|
|
|
|
return hoursTimeSpan.Add(TimeSpan.FromHours(-16));
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (effectiveCompletedTime.Hour <= 12)
|
|
|
|
return hoursTimeSpan.Add(TimeSpan.FromHours(-15));
|
|
|
|
else
|
|
|
|
return hoursTimeSpan.Add(TimeSpan.FromHours(-16));
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else//2. 开始时间 10点 结束时间 11点/ 14点
|
|
|
|
{
|
|
|
|
if (effectiveCompletedTime.Hour > 12)
|
|
|
|
if (effectiveStartTime.Hour <= 12)
|
|
|
|
return hoursTimeSpan.Add(TimeSpan.FromHours(-1));
|
|
|
|
|
|
|
|
return hoursTimeSpan;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 判断两个日期之间有多少个星期日
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="startDate"></param>
|
|
|
|
/// <param name="endDate"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
private static int CountSundays(DateTime startDate, DateTime endDate)
|
|
|
|
{
|
|
|
|
int sundays = 0;
|
|
|
|
|
|
|
|
while (startDate <= endDate)
|
|
|
|
{
|
|
|
|
if (startDate.DayOfWeek == DayOfWeek.Sunday)
|
|
|
|
{
|
|
|
|
sundays++;
|
|
|
|
}
|
|
|
|
startDate = startDate.AddDays(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
return sundays;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|