Calculate how much of a N hour segment is outside business hours 8AM -> 9PM
up vote
0
down vote
favorite
I need a function that given two dates A and B which are always N hours apart (3 or 4, but anything under 10), gives me the total number of hours that fall outside of a window 8AM->5PM (or, 800 -> 1700). You can assume that the window is always small enough so that it can only start before 8AM OR end after 5PM. However, I would love to see something powerful enough to consider both cases.
I am developing an overtime calculator for an invoice, and was given this requirement.
I started playing with getHours()
to see what the hour is on date A, and if it's less than 5, calculate the number of hours difference by creating a new date object with A5 = new Date(date.getTime())
and then A5.setHours(5)
and then Math.abs(A - A5)
.
If A is more than 5, then I do the same thing but considering 8 the cutoff time.
I would need to use getHours()
to check if the segment A -> B is TOTALLY outside of the 8AM->5PM window (in which case, return 0).
But... what if the window is 10 hours, 11:00PM to 9:00AM? The first IF would not happen as 11 > 5; the second IF wouldn't either, because 9 < 17.
Surely there are established, elegant ways of doing this?
Simple attempt:
function c () {
// var D = 1542695151752 // 14:31
// var D = 1542684151000 // 11:22
// var D = 1542645151000 // 00:32
var D = 1542667151000 // 6:39
var S = 8
var E = 17
var A = new Date(D)
var B = new Date(D + 1000 * 60 * 60 * 4)
var Ah = A.getHours()
var Bh = B.getHours()
var NE
var NS
if (Ah >= S && Ah <= E && Bh >= S && Bh <= E) return (Math.abs(B - A)) / 1000 / 60 / 60
if ((Ah < S || Ah > E) && (Bh < S || Bh > E)) return (0)
if (Ah >= S && Ah <= E) {
NS = A
NE = new Date(B.getTime())
NE.setHours(E)
NE.setMinutes(0)
NE.setSeconds(0)
}
if (Bh >= S && Bh <= E) {
NE = B
NS = new Date(A.getTime())
NS.setHours(S)
NS.setMinutes(0)
NS.setSeconds(0)
}
return (Math.abs(NS - NE) / 1000 / 60)
}
console.log(c())
javascript
add a comment |
up vote
0
down vote
favorite
I need a function that given two dates A and B which are always N hours apart (3 or 4, but anything under 10), gives me the total number of hours that fall outside of a window 8AM->5PM (or, 800 -> 1700). You can assume that the window is always small enough so that it can only start before 8AM OR end after 5PM. However, I would love to see something powerful enough to consider both cases.
I am developing an overtime calculator for an invoice, and was given this requirement.
I started playing with getHours()
to see what the hour is on date A, and if it's less than 5, calculate the number of hours difference by creating a new date object with A5 = new Date(date.getTime())
and then A5.setHours(5)
and then Math.abs(A - A5)
.
If A is more than 5, then I do the same thing but considering 8 the cutoff time.
I would need to use getHours()
to check if the segment A -> B is TOTALLY outside of the 8AM->5PM window (in which case, return 0).
But... what if the window is 10 hours, 11:00PM to 9:00AM? The first IF would not happen as 11 > 5; the second IF wouldn't either, because 9 < 17.
Surely there are established, elegant ways of doing this?
Simple attempt:
function c () {
// var D = 1542695151752 // 14:31
// var D = 1542684151000 // 11:22
// var D = 1542645151000 // 00:32
var D = 1542667151000 // 6:39
var S = 8
var E = 17
var A = new Date(D)
var B = new Date(D + 1000 * 60 * 60 * 4)
var Ah = A.getHours()
var Bh = B.getHours()
var NE
var NS
if (Ah >= S && Ah <= E && Bh >= S && Bh <= E) return (Math.abs(B - A)) / 1000 / 60 / 60
if ((Ah < S || Ah > E) && (Bh < S || Bh > E)) return (0)
if (Ah >= S && Ah <= E) {
NS = A
NE = new Date(B.getTime())
NE.setHours(E)
NE.setMinutes(0)
NE.setSeconds(0)
}
if (Bh >= S && Bh <= E) {
NE = B
NS = new Date(A.getTime())
NS.setHours(S)
NS.setMinutes(0)
NS.setSeconds(0)
}
return (Math.abs(NS - NE) / 1000 / 60)
}
console.log(c())
javascript
This is such a basic question and yet I am going insane with it... grrrrrrr. I know there is a super-easy solution. I know it.
– Merc
Nov 20 at 6:22
1
looks like a good time to use moment.js
– charlietfl
Nov 20 at 6:43
Yeah, do not reinvent the wheel here. Use moment.js. Relevant xkcd, even if zones aren't your concern right now.
– well-i-better-get-rolling
Nov 20 at 6:58
Happy to use moment! But... does it do what I need?
– Merc
Nov 20 at 7:07
It's all fun games saying "Don't reinvent the wheel! Use moment!" And provide zero information about how to actually do so.
– Merc
Nov 21 at 0:08
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I need a function that given two dates A and B which are always N hours apart (3 or 4, but anything under 10), gives me the total number of hours that fall outside of a window 8AM->5PM (or, 800 -> 1700). You can assume that the window is always small enough so that it can only start before 8AM OR end after 5PM. However, I would love to see something powerful enough to consider both cases.
I am developing an overtime calculator for an invoice, and was given this requirement.
I started playing with getHours()
to see what the hour is on date A, and if it's less than 5, calculate the number of hours difference by creating a new date object with A5 = new Date(date.getTime())
and then A5.setHours(5)
and then Math.abs(A - A5)
.
If A is more than 5, then I do the same thing but considering 8 the cutoff time.
I would need to use getHours()
to check if the segment A -> B is TOTALLY outside of the 8AM->5PM window (in which case, return 0).
But... what if the window is 10 hours, 11:00PM to 9:00AM? The first IF would not happen as 11 > 5; the second IF wouldn't either, because 9 < 17.
Surely there are established, elegant ways of doing this?
Simple attempt:
function c () {
// var D = 1542695151752 // 14:31
// var D = 1542684151000 // 11:22
// var D = 1542645151000 // 00:32
var D = 1542667151000 // 6:39
var S = 8
var E = 17
var A = new Date(D)
var B = new Date(D + 1000 * 60 * 60 * 4)
var Ah = A.getHours()
var Bh = B.getHours()
var NE
var NS
if (Ah >= S && Ah <= E && Bh >= S && Bh <= E) return (Math.abs(B - A)) / 1000 / 60 / 60
if ((Ah < S || Ah > E) && (Bh < S || Bh > E)) return (0)
if (Ah >= S && Ah <= E) {
NS = A
NE = new Date(B.getTime())
NE.setHours(E)
NE.setMinutes(0)
NE.setSeconds(0)
}
if (Bh >= S && Bh <= E) {
NE = B
NS = new Date(A.getTime())
NS.setHours(S)
NS.setMinutes(0)
NS.setSeconds(0)
}
return (Math.abs(NS - NE) / 1000 / 60)
}
console.log(c())
javascript
I need a function that given two dates A and B which are always N hours apart (3 or 4, but anything under 10), gives me the total number of hours that fall outside of a window 8AM->5PM (or, 800 -> 1700). You can assume that the window is always small enough so that it can only start before 8AM OR end after 5PM. However, I would love to see something powerful enough to consider both cases.
I am developing an overtime calculator for an invoice, and was given this requirement.
I started playing with getHours()
to see what the hour is on date A, and if it's less than 5, calculate the number of hours difference by creating a new date object with A5 = new Date(date.getTime())
and then A5.setHours(5)
and then Math.abs(A - A5)
.
If A is more than 5, then I do the same thing but considering 8 the cutoff time.
I would need to use getHours()
to check if the segment A -> B is TOTALLY outside of the 8AM->5PM window (in which case, return 0).
But... what if the window is 10 hours, 11:00PM to 9:00AM? The first IF would not happen as 11 > 5; the second IF wouldn't either, because 9 < 17.
Surely there are established, elegant ways of doing this?
Simple attempt:
function c () {
// var D = 1542695151752 // 14:31
// var D = 1542684151000 // 11:22
// var D = 1542645151000 // 00:32
var D = 1542667151000 // 6:39
var S = 8
var E = 17
var A = new Date(D)
var B = new Date(D + 1000 * 60 * 60 * 4)
var Ah = A.getHours()
var Bh = B.getHours()
var NE
var NS
if (Ah >= S && Ah <= E && Bh >= S && Bh <= E) return (Math.abs(B - A)) / 1000 / 60 / 60
if ((Ah < S || Ah > E) && (Bh < S || Bh > E)) return (0)
if (Ah >= S && Ah <= E) {
NS = A
NE = new Date(B.getTime())
NE.setHours(E)
NE.setMinutes(0)
NE.setSeconds(0)
}
if (Bh >= S && Bh <= E) {
NE = B
NS = new Date(A.getTime())
NS.setHours(S)
NS.setMinutes(0)
NS.setSeconds(0)
}
return (Math.abs(NS - NE) / 1000 / 60)
}
console.log(c())
javascript
javascript
edited Nov 20 at 7:08
asked Nov 20 at 6:10
Merc
6,71894785
6,71894785
This is such a basic question and yet I am going insane with it... grrrrrrr. I know there is a super-easy solution. I know it.
– Merc
Nov 20 at 6:22
1
looks like a good time to use moment.js
– charlietfl
Nov 20 at 6:43
Yeah, do not reinvent the wheel here. Use moment.js. Relevant xkcd, even if zones aren't your concern right now.
– well-i-better-get-rolling
Nov 20 at 6:58
Happy to use moment! But... does it do what I need?
– Merc
Nov 20 at 7:07
It's all fun games saying "Don't reinvent the wheel! Use moment!" And provide zero information about how to actually do so.
– Merc
Nov 21 at 0:08
add a comment |
This is such a basic question and yet I am going insane with it... grrrrrrr. I know there is a super-easy solution. I know it.
– Merc
Nov 20 at 6:22
1
looks like a good time to use moment.js
– charlietfl
Nov 20 at 6:43
Yeah, do not reinvent the wheel here. Use moment.js. Relevant xkcd, even if zones aren't your concern right now.
– well-i-better-get-rolling
Nov 20 at 6:58
Happy to use moment! But... does it do what I need?
– Merc
Nov 20 at 7:07
It's all fun games saying "Don't reinvent the wheel! Use moment!" And provide zero information about how to actually do so.
– Merc
Nov 21 at 0:08
This is such a basic question and yet I am going insane with it... grrrrrrr. I know there is a super-easy solution. I know it.
– Merc
Nov 20 at 6:22
This is such a basic question and yet I am going insane with it... grrrrrrr. I know there is a super-easy solution. I know it.
– Merc
Nov 20 at 6:22
1
1
looks like a good time to use moment.js
– charlietfl
Nov 20 at 6:43
looks like a good time to use moment.js
– charlietfl
Nov 20 at 6:43
Yeah, do not reinvent the wheel here. Use moment.js. Relevant xkcd, even if zones aren't your concern right now.
– well-i-better-get-rolling
Nov 20 at 6:58
Yeah, do not reinvent the wheel here. Use moment.js. Relevant xkcd, even if zones aren't your concern right now.
– well-i-better-get-rolling
Nov 20 at 6:58
Happy to use moment! But... does it do what I need?
– Merc
Nov 20 at 7:07
Happy to use moment! But... does it do what I need?
– Merc
Nov 20 at 7:07
It's all fun games saying "Don't reinvent the wheel! Use moment!" And provide zero information about how to actually do so.
– Merc
Nov 21 at 0:08
It's all fun games saying "Don't reinvent the wheel! Use moment!" And provide zero information about how to actually do so.
– Merc
Nov 21 at 0:08
add a comment |
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53387198%2fcalculate-how-much-of-a-n-hour-segment-is-outside-business-hours-8am-9pm%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53387198%2fcalculate-how-much-of-a-n-hour-segment-is-outside-business-hours-8am-9pm%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
This is such a basic question and yet I am going insane with it... grrrrrrr. I know there is a super-easy solution. I know it.
– Merc
Nov 20 at 6:22
1
looks like a good time to use moment.js
– charlietfl
Nov 20 at 6:43
Yeah, do not reinvent the wheel here. Use moment.js. Relevant xkcd, even if zones aren't your concern right now.
– well-i-better-get-rolling
Nov 20 at 6:58
Happy to use moment! But... does it do what I need?
– Merc
Nov 20 at 7:07
It's all fun games saying "Don't reinvent the wheel! Use moment!" And provide zero information about how to actually do so.
– Merc
Nov 21 at 0:08