Javascript 计算SLA剩余天数/时间
我需要帮助,试图找出如何根据一些规则显示SLA。 我的API返回几分钟的整数值,例如-1491和5836。我的逻辑是错误的。谁能帮帮我吗 规则如下:Javascript 计算SLA剩余天数/时间,javascript,reactjs,datetime,Javascript,Reactjs,Datetime,我需要帮助,试图找出如何根据一些规则显示SLA。 我的API返回几分钟的整数值,例如-1491和5836。我的逻辑是错误的。谁能帮帮我吗 规则如下: 如果SLA分钟数>=24小时,则显示天,例如“3天” 如果SLA分钟数少于24小时,则显示小时数和分钟数,例如“3小时4分钟” 如果SLA分钟数小于1小时,则显示分钟数“33分钟” 如果SLA会议记录为-1441,则应返回逾期1天的会议记录;如果会议记录为正数1441,则应返回1天 到目前为止,我得到的是: const items = [{slaM
const items = [{slaMinutesRemaining: 5836}, {slaMinutesRemaining : -1441}]
我循环浏览项目并将项目作为道具传递:
const SLA = ({item}) => {
const returnDays = (mins) => {
const calc = Math.floor(mins / 1440);
return calc > 1 ? `${calc} days` : `${calc} day`;
};
const returnHoursAndMinutes = (mins) => {
const hrs = Math.floor(mins / 60);
const minutes = mins % 60;
if (mins < 1440) return `${hrs}hrs ${minutes} mins`;
return mins;
};
const slaRemaining = (mins) => {
console.log('minssss', mins);
const hrs = Math.floor(mins / 60);
// if null
if (!mins) return 'N/A';
let m = mins;
const isNegative = m < 0;
if (isNegative) m = Math.abs(isNegative);
if (m >= 1440) return returnDays(m);
if (hrs < 1) return m;
return returnHoursAndMinutes(m);
};
return (
<>
{item.slaMinutesRemaining && item.slaMinutesRemaining < 0 ? (
<SlaAlert>
{slaRemaining(item.slaMinutesRemaining)}{' '}
<OverDueTag>Overdue</OverDueTag>
</SlaAlert>
) : (
<>{slaRemaining(item.slaMinutesRemaining)}</>
)}
</>
);
}
const SLA=({item})=>{
const returnDays=(分钟)=>{
常数计算=数学楼层(分钟/1440);
返回calc>1?`{calc}天`:`${calc}天`;
};
const returnHoursAndMinutes=(分钟)=>{
常数小时=数学楼层(分钟/60);
常数分钟=分钟%60;
如果(分钟<1440)返回`${hrs}hrs${minutes}mins`;
返回分钟;
};
剩余常数=(分钟)=>{
console.log('minsss',mins);
常数小时=数学楼层(分钟/60);
//如果为空
如果(!分钟)返回“不适用”;
设m=min;
常数为负=m<0;
如果(isNegative)m=Math.abs(isNegative);
如果(m>=1440)返回天数(m);
如果(小时数<1)返回m;
返回时数和分钟数(m);
};
返回(
{item.slamintesraining&&item.slamintesraining<0(
{slaLeving(item.slaMinutesLeving)}{'}
逾期的
) : (
{slamentremaining(item.slaminuteslaining)}
)}
);
}
首先,我将删除组件本身的所有计算,以便可以对其进行单元测试。这样,您就知道计算是否正确了
if (isNegative) m = Math.abs(isNegative);
应该是:
if (isNegative) m = Math.abs(m);
您还可以简化所有逻辑:
const slaRemaining = (mins) => {
if (!mins) {
// This check is wrong. What happens if the query happens at the exact moment that 0 minutes are left to SLA?
return 'N/A';
}
const due = (mins < 0);
const absMins = Math.abs(mins);
const days = Math.floor(absMins / 1400);
const hours = Math.floor(absMins / 60);
const minutes = absMins % 60;
const label = days
? `${days} day${days > 1 ? 's' : ''}`
: `${hours}hr${hours > 1 ? 's' : ''} ${minutes}min${minutes > 1 ? 's' : ''}`;
return { due, label };
};
const sla剩余=(分钟)=>{
如果(!分钟){
//此检查是错误的。如果查询恰好发生在SLA剩余0分钟的时刻,会发生什么情况?
返回“不适用”;
}
持续时间=(分钟<0);
常量absMins=数学abs(分钟);
施工天数=数学楼层(absMins/1400);
恒时=数学楼层(absMins/60);
常数分钟=绝对值%60;
常数标签=天
?`${days}day${days>1?'s':''}`
:`${hours}hr${hours>1's':''}${minutes}min${minutes>1's':''}`;
返回{到期,标签};
};
反应代码是否属于您的问题?不确定什么是item
,等等。item是一个道具,包含slamutesRemaining等属性。我正在尝试解决我发布的规则。这似乎是一个技巧,感谢您简化了它:)const isNegative=m<0
isNegative将是一个布尔值(解释您的答案),这要感谢添加了@ISAE的解释,但我认为这只是一个疏忽,而不是OP错误地使用了Math.abs()
。