0

I have the related.date: {"isoYear":"2021","isoWeek":"31"} property with the following value received from the backend. How can I receive first date and last date from isoWeek 31 for the isoYear by using momenjs?

NewTech Lover
  • 1,185
  • 4
  • 20
  • 44

3 Answers3

0
const date = moment().isoWeek(related.date.isoWeek).year(related.date.year)
const first = moment().weekday(0)
const last = moment().weekday(6)

by default the weekday 0 is sunday, if you live in an area where the first weekday is monday, you have to parse that on your own or use configured moment-with-locales-es6

PRSHL
  • 1,359
  • 1
  • 11
  • 30
  • Thanks for replying, I think this approach will be a bit problematic for isoMonth since how last date is going to be found? Some months have 30 days some 31 – NewTech Lover Aug 10 '21 at 15:04
  • In this case you could go to the first day of the following month (`moment().add(1, 'months')`) and subtract one day (`moment().subtract(1, 'days')`). This will give you the last day of the given month. – PRSHL Aug 10 '21 at 15:06
0

You can use startOf('isoWeek').

// related.date: {"isoYear":"2021","isoWeek":"31"}
const related = {
  date: {
    isoYear: '2021',
    isoWeek: '31',
  },
};
const now = moment();
console.log(now.clone().isoWeek(Number(related.date.isoWeek)).startOf('isoWeek'));
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.1/moment.min.js"></script>
kyun
  • 9,710
  • 9
  • 31
  • 66
  • I receive value like this: {"isoYear":"2021","isoWeek":"31"} Not the usual object. I think firstly some conversion is needed – NewTech Lover Aug 10 '21 at 15:08
0

You could use startOf('isoWeek') and endOf('isoWeek') after you get isoYear from object and add isoWeek weeks:

let related = {"isoYear":"2021","isoWeek":"31"};

console.log(moment(related.isoYear, 'YYYY').add(parseInt(related.isoWeek), 'weeks').startOf('isoWeek').format('DD/MM/YYYY'))

console.log(moment(related.isoYear, 'YYYY').add(parseInt(related.isoWeek), 'weeks').endOf('isoWeek').format('DD/MM/YYYY'))

console.log(moment(related.isoYear, 'YYYY').add(parseInt(related.isoWeek), 'weeks').startOf('month').format('DD/MM/YYYY'))

console.log(moment(related.isoYear, 'YYYY').add(parseInt(related.isoWeek), 'weeks').endOf('month').format('DD/MM/YYYY'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>

EDIT

Now if you want to get month from month property you could do:

let related = {"isoYear":"2021","isoWeek":"31", "month": "06"}

console.log(moment(related.isoYear, 'YYYY').add(parseInt(related.month) - 1, 'months').startOf('month').format('DD/MM/YYYY'))

console.log(moment(related.isoYear, 'YYYY').add(parseInt(related.month) - 1, 'months').endOf('month').format('DD/MM/YYYY'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>

Note the -1 on add function: this because in moment months number start from 0 (January).

Giovanni Esposito
  • 10,696
  • 1
  • 14
  • 30
  • 1
    It looks like it returns from Sunday not Monday – NewTech Lover Aug 10 '21 at 15:12
  • 1
    @NewTechLover yes, if you want that the first day of week is Monday you have to call `startOf('isoWeek')` and `endOf('isoWeek')`. I updated my answer – Giovanni Esposito Aug 10 '21 at 15:14
  • Last question will this structure work if I use it for isoMonth? – NewTech Lover Aug 10 '21 at 15:17
  • @NewTechLover yes it works, take a look at [this](https://stackoverflow.com/questions/39267623/moment-js-get-first-and-last-day-of-current-month) question (I think `isoMonth` does not exists, `month` exists) – Giovanni Esposito Aug 10 '21 at 15:19
  • @NewTechLover I updated my answer with start and end month. – Giovanni Esposito Aug 10 '21 at 15:29
  • It returns invalid date on my side – NewTech Lover Aug 10 '21 at 15:44
  • @NewTechLover I can't see your code but on snippet it works. Let me see your code (just the line in which you use `startOf('month')`) and I will try to understand why is not working. Would be very useful if you could reproduce your error in codesandbox. – Giovanni Esposito Aug 10 '21 at 17:10
  • I have a month number which is 06 so I need to get start date and end date like did for the week I am using related.month like this: moment(related.isoYear).add(related.month , 'months').startOf('month'), moment(related.isoYear).add(related.month , 'months').endOf('month'), Also tried your sample but both are not working for month case – NewTech Lover Aug 10 '21 at 17:31
  • @NewTechLover watch better my answer: write `moment(related.isoYear)` is not sufficient for moment because you have to indicate the date format (YYYY). Then I see another error: `related.month` seems to be a string... but moment wants a number. So, please, modify your code in this way: `moment(related.isoYear, 'YYYY').add(parseInt(related.month), 'months').startOf('month')` – Giovanni Esposito Aug 10 '21 at 19:11
  • @NewTechLover I updated my answer with the startOf and endOf for month – Giovanni Esposito Aug 10 '21 at 19:18