Ask HN: Why isn't there a `setDay` method on the Date prototype?

2 points by saghm ↗ HN
Recently, I was using a JavaScript shell and was playing around with a `Date` object. When looking at the various methods, I saw getters for various parts of the date (`getSeconds`, `getMinutes`, `getHours`, `getDay`, `getMonth`, `getYear`, etc.). However, when looking at the setter methods available, I noticed that while there are methods `setSeconds`, `setMinutes`, and analogues for most of the getters, there is no `setDay` analog for `getDay`. From looking at the Mozilla documentation (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date), it appears that this wasn't an oversight of the shell implementation but seemingly part of the spec. To make sure thi wasn't just a Mozilla thing, I tried checking for the method in Node and in the Chrome console; neither of them had a `setDay` method.

Does anyone know what the historical reason is for the lack of a `setDay` method? Was it a mistake in an early implementation of the language that just got propagated through until today? Was it even a mistake at all? I can't think of any reason why the method should be omitted, but maybe I'm missing something. From googling, I can only find a few references to the `setDay` method being missing, and none of them have any explanation for this.

15 comments

[ 3.3 ms ] story [ 39.8 ms ] thread
(comment deleted)
Maybe its just to avoid confusion with date handling? Seems that a call to setDay would really just be a call to setDate with +/- 6 days.
it is called setDate , i know, a bit confusing haha

var today = new Date() // today is 19/09/2016

console.log(today.getDate()) // will print 19

today.setDate(20)

console.log(today.getDate()) // will print 20

But `getDate` is separate from `getDay`, so why isn't there a `setDay` as well as a `setDate`?
getDay returns the index of the week day your date is getDate returns the day number within the month so for 19/09/2016

getDay returns 1 (Sunday=0, Monday=1, ....)

getDate returns 19

So why not have a method that sets the day of the week as well? It just seems odd to me that they would implement setters for all of the other time units but not this one
See my comment above. What interpretation would you prefer? setDay changes the date into the future or past by changing the date, the month or the year. At a minimum there are 6 possible values. To me none of them are an obvious choice.
Given that `setMinute` sets the minute in the same hour and `setHour` sets the hour in the same day, I'd think `setDay` setting to the day in the same week would be rather logical
cause if you have the date 19/09/2016 whats the point of setting the day of the week? so do you wanna set the date to be Thursday but still keep the 19/09/2016 that wouldnt make any sense, cause 19/09/2016 is Monday, and in all cases must be Monday.
What if I wanted to get the day at the beginning of the week that a date occurred in? For instance, if you had a payroll system where you paid hourly workers weekly, it would be useful to be able to bucket the hours worked on the day that the paycheck is sent
console.log(today.getDay()) // prints 1

assuming there was a setDay, and you invoke:

today.setDay(3)

should today now be: 21/9/2016 or 14/9/2016 or 19/10/2016 or 19/9/2040 or ... ?

I think you can see that unlike the other setters, setDay would not have an "obvious" implementation.

If you were to set the day, what would be the resulting date? Would you move forward or backward in time?
I don't see how that would be any less hard to define than `setMonth` or `setHour`
Set hour is easier because it has an obvious result. The date doesn't change.
So setting the day of the week would set to that day in the same week the date occurred; I don't think that's any weirder than calling `setMonth` to change the month on a date