How to get minutes in between two different dates? - javascript

Hi i am using Javascript and i want to get each and every minute between two dates for example:
firstDate: 2019-04-02 02:03:00
secondDate: 2019-04-03 03:04:00
So my final output result should return like this:
2019-04-02 02:03:00
2019-04-02 02:04:00
2019-04-02 02:05:00
.
.
.
2019-04-03 03:04:00
Here is the code which i tried
var boxingDay = new Date("2019-04-02 02:03:00");
var nextWeek = new Date("2019-04-03 03:04:00");
function getDatesRange(startDate, stopDate){
const ONE_DAY = 60*1000;
var days= [];
var currentDate = new Date(startDate);
while (currentDate <= stopDate) {
days.push(new Date (currentDate));
currentDate = currentDate - 1 + 1 + ONE_DAY;
}
return days.join("\n");
}
console.log(getDatesRange(boxingDay,nextWeek))
/* var map = getDates(boxingDay, nextWeek).map((times) => {
console.log(Date.parse(times))
}) */
/* console.log((getDates( boxingDay, nextWeek ))); */
The problem is I am getting correct output but I need in the form of an array, like below and reuse the function if I am reusing, it returns me an empty array.
[[2019-04-02 02:03:00],[2019-04-02 02:04:00].....]
Any solution TIA.

Using your code as a basis, you can do this as follows (note that I'm using .toISOString(), you can change this according to your needs):
const boxingDay = new Date("2019-04-02 02:03:00");
const nextWeek = new Date("2019-04-03 03:04:00");
function getDatesRange(startDate, stopDate){
const ONE_MINUTE = 60*1000;
const days= [];
let currentDate = new Date(startDate);
while (currentDate <= stopDate) {
days.push([currentDate.toISOString()]);
currentDate.setTime(currentDate.getTime() + ONE_MINUTE);
}
return days;
}
console.log(getDatesRange(boxingDay,nextWeek));

There is a way, that you could use while loop with format function, each iteration increate the minute
const firstDate = new Date('2019-04-02 02:03:00')
const secondDate = new Date('2019-04-03 03:04:00')
const formatDate = dateObj => {
const year = String(dateObj.getFullYear()).padStart(4, '0')
const month = String(dateObj.getMonth() + 1).padStart(2, '0')
const date = String(dateObj.getDate()).padStart(2, '0')
const hour = String(dateObj.getHours()).padStart(2, '0')
const minute = String(dateObj.getMinutes()).padStart(2, '0')
const second = String(dateObj.getSeconds()).padStart(2, '0')
return `${year}-${month}-${date} ${hour}:${minute}:${second}`
}
const res = []
const iteratedDate = new Date(firstDate.getTime())
while (iteratedDate <= secondDate) {
res.push(formatDate(iteratedDate))
iteratedDate.setMinutes(iteratedDate.getMinutes() + 1)
}
// res array is large so I sliced the first 10 amd the last 10
console.log(res.slice(0, 10))
console.log(res.slice(res.length - 10))

A slightly different approach using a for loop; it also avoids creating a new Date instance for each minute iterated.
const p = new Date("2019-04-02T23:57:00");
const q = new Date("2019-04-03T00:03:00");
const r = [];
for(const d = new Date(p); d <= q; d.setTime(d.getTime() + 60000))
{
r.push(d.toISOString().substring(0, 19).replace(/T/, " "));
}
const s = r.join("\n");
console.log(s);

Related

How to add one day to the Date object in React or even Vanilla JS [duplicate]

This question already has answers here:
How to add days to Date?
(56 answers)
Closed 6 months ago.
I'm building a weekly picker. For the most part it works as intended, I actually get the right week when I click on it, but the selected days within the calendar portion of the picker are displaying a day behind. For example, in the screenshot below, the week picked is 2020-06-08 to 2020-06-14 yyyy-mm-dd format by the way. But as you can see in the picker, it displays the week shifted - 1
I'll post the relevant code but hard as I tried, I couldn't make a codesandbox for you. Way too many dependencies
Here is the convertDate function for the formatting. This is not related to the problem but in case you're wondering what was in it from the main function
const convertDate = (date) => {
let dt = new Date(date);
var yyyy = dt.getFullYear();
var mm = dt.getMonth() + 1; // getMonth() is zero-based
var dd = dt.getDate();
return `${yyyy}-${(mm > 9 ? '' : '0') + mm}-${(dd > 9 ? '' : '0') + dd}`;
};
And this the actual function that renders the days in the picker
EDIT (with help from Sergei
const handleClick = (e) => {
setDate(new Date(date.setDate(e.target.id)));
// added this to calculate the offset to my local timezone
let localDate = new Date(date.setDate(e.target.id));
var localoffset = new Date().getTimezoneOffset();
var timeZoneFromDB = -4.00;
var tzDifference = timeZoneFromDB * localoffset + localDate.getTimezoneOffset();
var offsetTime = new Date(localDate.getTime() + tzDifference * localoffset * 1000);
const firstDay = new Date(
offsetTime.setDate(offsetTime.getDate() - offsetTime.getDay() + 1)
);
const lastDay = new Date(
offsetTime.setDate(offsetTime.getDate() - offsetTime.getDay() + 7)
);
setWeek({ firstDay, lastDay });
const value = e.target.value;
setState({
...state,
[e.target.name]: value,
startdate: convertDate(firstDay),
enddate: convertDate(lastDay)
})
};
const renderDays = () => {
let month = date.getMonth() + 1;
let ar = [];
for (let i = 1; i <= days[month]; i++) {
let currentDate = new Date(date).setDate(i);
let cName = "single-number ";
if (
new Date(state.startdate).getTime() <= new Date(currentDate).getTime() &&
new Date(currentDate).getTime() <= new Date(state.enddate).getTime()
) {
cName = cName + "selected-week";4
console.clear();
console.log(new Date().getTimezoneOffset());
console.log("start date: ", new Date(state.startdate).getTime());
console.log("converted start date: ", convertDate(new Date(state.startdate).getTime()));
console.log("current date: ", new Date(currentDate).getTime());
console.log("converted current date: ", convertDate(new Date(currentDate).getTime()));
console.log("end date: ", new Date(state.enddate).getTime());
console.log("converted end date: ", convertDate(new Date(state.enddate).getTime()));
}
ar.push(
<div key={v4()} id={i} className={cName} onClick={handleClick}>
{i}
</div>
);
}
const displayDate = new Date(date).setDate(1);
let dayInTheWeek = new Date(displayDate).getDay();
let empty = [];
for (let i = 1; i < dayInTheWeek; i++) {
empty.push(<div key={v4()} id={i} className="single-number empty"></div>);
}
return [...empty, ...ar];
};
Here's a pic of what I am console.logging so you can see that I am capturing the intended dates (ignore the undefined). This is the state being console logged in the useEffect() But also check out the individual logs from within the renderDays(). They're a day behind
I just need the days in the picker to + 1 in the view Thanks in advanced you for your help
With the help of Sergei and Heretic in the comments I was able to get it to work by adding the following helper function outside of the main view object
function addDays(date, days) {
var result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
Then I updated my render function to conditionally check this way
let currentTime = new Date(currentDate).getTime()
let startdayinview = new Date(state.startdate).getTime()
let enddayinview = new Date(state.enddate).getTime()
if (
addDays(startdayinview, -1) <= addDays(currentTime, -2) &&
addDays(currentTime, 0) <= addDays(enddayinview, 1)
) {
cName = cName + "selected-week";
}
As Heretic mentioned, the Date object is not ideal, but we gotta work with what we're given!

Get next date(YYYY-MM-DD) according to the input date string in jQuery

Consider, I have a date that format is (Year-Month-Date),
adate = "2020-10-02";
Now I would like to create a jQuery function that input adate and return the next_date such like below,
function make_next_date(adate) {
next_date = adate + 1; //"2020-10-03"
return next_date;
}
Function should be work properly for the following input date,
adate = "2021-05-31";
next_date = "2021-06-01";
adate = "2020-12-31";
next_date = "2021-01-01";
adate = "2021-02-28";
next_date = "2021-03-01";
This is just JavaScript. JavaScript has dates. jQuery is not relevant to date manipulation.
function make_next_date(adate) {
next_date = new Date(adate);
next_date.setDate(next_date.getDate() + 1);
return next_date.toISOString().split('T')[0];
}
[
"2021-05-31",
"2020-12-31",
"2021-02-28",
].forEach(date => {
console.log({
date,
out: make_next_date(date)
});
});
function make_next_date(adate) {
const date = new Date(adate);
date.setDate(date.getDate() + 1);
// YEAR
const rYear = date.getFullYear();
// MONTH
let rMonth = date.getMonth() + 1;
rMonth = rMonth < 10 ? `0${rMonth}` : rMonth;
// DATE
let rDate = date.getDate();
rDate = rDate < 10 ? `0${rDate}` : rDate;
return `${rYear}-${rMonth}-${rDate}`;
}
["2021-05-31", "2020-12-31", "2021-02-28"].forEach((date) => {
console.log({
date,
out: make_next_date(date),
});
});
Change your string to date object.
And add 1.
Let date = new Date();
date.SetDate(Date.parseDate(your string + 1);
You can use Date class and padStart function to achieve it.
let adate = "2020-10-02";
function make_next_date(adate) {
const [year, month, day] = adate
.split("-")
.map(item => parseInt(item));
const date = new Date(year, month, day);
date.setDate(date.getDate() + 1);
return [
date.getFullYear(),
date.getMonth().toString().padStart(2, 0),
date.getDate().toString().padStart(2, 0)
].join("-")
}
console.log(make_next_date(adate));
Also, there is a very useful date manipulating package called moment. You can achieve it by just 3 lines of codes using moment.
const moment = require("moment");
const FORMAT = "YYYY-MM-DD";
let adate = "2020-10-02";
function make_next_date(adate) {
return moment(adate, FORMAT)
.add(1, "day")
.format(FORMAT);
}

How to find between 2 dates whichever comes first

I tried to find someone between 2 dates earlier in the year or month and it didn't work
converteDateToDatePipe(dCheck: Date, d1: Date): boolean {
var d11 = this.pipe.transform(d1, 'shortDate');
var dCc = this.pipe.transform(dCheck, 'shortDate');
var dd11 = new Date(d11);
var ddcc = new Date(dCc);
if (dd11 <= ddcc)
return true;
else
return false;
}
test(){
let first = new Date(new Date().getTime() + 111111);
let second = new Date(new Date().getTime() + 22222);
let nextDate = this.nextDate(first, second);
console.log(second.getTime() === nextDate.getTime())
}
nextDate(first: Date, second: Date): Date {
let currentDay = new Date();
let firstDiff = currentDay.getTime() - first.getTime();
let secondDiff = currentDay.getTime() - second.getTime();
return (firstDiff >= secondDiff) ? first : second;
}

Create array of dates from starting date in JavaScript and React

I have a React component where I have a date string from which I need to generate an array of dates representing the next 11 days excluding the starting date (10/12/2016). Not sure how to achieve this. That's what I've tried so far but the problem is that by simply looping adding 1 for each iteration on the day, it won't generate the correct date when the date range of 11 days spans between two months:
addDays = () => {
const { startDate } = this.props.pageData.parcelDetails.parcelDetails;
const date = new Date(startDate);
let datesCollection = []
for (var i = 1; i < 12; i++) {
datesCollection.push(`${date.getDate() + i}/${date.getMonth() + 1}/${date.getFullYear()}`)
}
return datesCollection
}
The code above generates the following array:
[
"11/12/2016",
"12/12/2016",
"13/12/2016",
"14/12/2016",
"15/12/2016",
"16/12/2016",
"17/12/2016",
"18/12/2016",
"19/11/2016",
"20/12/2016",
"21/12/2016"
]
How do I generate the correct array, with proper dates for each month?
You can simply do that:
addDays = () => {
const { startDate } = this.props.pageData.parcelDetails.parcelDetails;
const date = new Date(startDate);
let datesCollection = []
for (var i = 1; i < 12; i++) {
const newDate = new Date(date.getTime() + i * 1000 * 60 * 60 * 24);
datesCollection.push(`${newDate.getDate()}/${newDate.getMonth() + 1}/${newDate.getFullYear()}`);
}
return datesCollection
}
You can try adding 1 day to each loop.
var dateuse = new Date();
dateuse.setDate(dateuse.getDate() + 1);
or you can try Moment.js
var today = moment();
var dateuse = moment(today).add(1, 'days');

Get a list of dates between two dates using javascript

From JavaScript is there a way to get list of days between two dates from MySQL format. I don't want to use any library for this.
This is what i did.
function generateDateList(from, to) {
var getDate = function(date) { //Mysql Format
var m = date.getMonth(), d = date.getDate();
return date.getFullYear() + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d);
}
var fs = from.split('-'), startDate = new Date(fs[0], fs[1], fs[2]), result = [getDate(startDate)], start = startDate.getTime(), ts, end;
if ( typeof to == 'undefined') {
end = new Date().getTime();
} else {
ts = to.split('-');
end = new Date(ts[0], ts[1], ts[2]).getTime();
}
while (start < end) {
start += 86400000;
startDate.setTime(start);
result.push(getDate(startDate));
}
return result;
}
console.log(generateDateList('2014-2-27', '2014-3-2'));
I test it from chrome and nodejs below are the result.
[ '2014-02-27',
'2014-02-28',
'2014-02-29',
'2014-02-30',
'2014-02-31',
'2014-03-01',
'2014-03-02' ]
yeh big leap year:-D..., how can i fix this? or is there any better way.?
const listDate = [];
const startDate ='2017-02-01';
const endDate = '2017-02-10';
const dateMove = new Date(startDate);
let strDate = startDate;
while (strDate < endDate) {
strDate = dateMove.toISOString().slice(0, 10);
listDate.push(strDate);
dateMove.setDate(dateMove.getDate() + 1);
};
Take the start date and increment it by one day until you reach the end date.
Note: MySQL dates are standard format, no need to parse it by hand just pass it to the Date constructor: new Date('2008-06-13').
const addDays = (date, days = 1) => {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
};
const dateRange = (start, end, range = []) => {
if (start > end) return range;
const next = addDays(start, 1);
return dateRange(next, end, [...range, start]);
};
const range = dateRange(new Date("2014-02-27"), new Date("2014-03-02"));
console.log(range);
console.log(range.map(date => date.toISOString().slice(0, 10)))
Here I use a recursive function, but you could achieve the same thing using a while (see other answers).
I have used this one from
https://flaviocopes.com/how-to-get-days-between-dates-javascript/
const getDatesBetweenDates = (startDate, endDate) => {
let dates = []
//to avoid modifying the original date
const theDate = new Date(startDate)
while (theDate < new Date(endDate)) {
dates = [...dates, new Date(theDate)]
theDate.setDate(theDate.getDate() + 1)
}
dates = [...dates, new Date(endDate)]
return dates
}
Invoke the function as follows:
getDatesBetweenDates("2021-12-28", "2021-03-01")
Note - I just had to fix issues with the Date object creation (new Date()) in the while loop and in the dates array. Other than that the code is pretty much same as seen on the above link
dateRange(startDate, endDate) {
var start = startDate.split('-');
var end = endDate.split('-');
var startYear = parseInt(start[0]);
var endYear = parseInt(end[0]);
var dates = [];
for(var i = startYear; i <= endYear; i++) {
var endMonth = i != endYear ? 11 : parseInt(end[1]) - 1;
var startMon = i === startYear ? parseInt(start[1])-1 : 0;
for(var j = startMon; j <= endMonth; j = j > 12 ? j % 12 || 11 : j+1) {
var month = j+1;
var displayMonth = month < 10 ? '0'+month : month;
dates.push([i, displayMonth, '01'].join('-'));
}
}
return dates;
}
var oDate1 = oEvent.getParameter("from"),
oDate2 = oEvent.getParameter("to");
var aDates = [];
var currentDate = oDate1;
while (currentDate <= oDate2) {
aDates.push(new Date(currentDate));
currentDate.setDate(currentDate.getDate() + 1);
}
I expanded Công Thắng's great answer to return {years, months, days}, thought it was worth sharing:
function getDates(startDate, endDate) {
const days = [],
months = new Set(),
years = new Set()
const dateMove = new Date(startDate)
let date = startDate
while (date < endDate){
date = dateMove.toISOString().slice(0,10)
months.add(date.slice(0, 7))
years.add(date.slice(0, 4))
days.push(date)
dateMove.setDate(dateMove.getDate()+1) // increment day
}
return {years: [...years], months: [...months], days} // return arrays
}
console.log(getDates('2016-02-28', '2016-03-01')) // leap year
/* =>
{
years: [ '2016' ],
months: [ '2016-02', '2016-03' ],
days: [ '2016-02-28', '2016-02-29', '2016-03-01' ]
}
*/
const {months} = getDates('2016-02-28', '2016-03-01') // get only months
Basically the function just increments the built-in Date object by one day from start to end, while the Sets capture unique months and years.

Categories

Resources