The reason it's that way is the string references are organized so that when month is 0 you get Morning Star in the journal and sleep bar etc. I'd have to change and test all that as well if I used 1-based numbering, and I went for the minimal code change required.
I am not exactly certain what you need to know, but then your business is quite the mystery to me. If
1-based numbering means numbering the first month of the year as 1 rather than 0, then I am optimistic since the first month in un-patch Morrowind is numbered 1.
Most script operations that have anything to do with time and date are going to be
reading the global variables Gamehour, Day, Month and Year, not
setting them. The only occasion for setting their value is to affect the passage of time, something I have long thought of as a little risky mostly because I was uncertain of how the engine would handle some situations.**
One thing already understood is that if a date 'outside the calendar' is set by a script (and presumably dialog results and console as well) it would revert to the next 'supportable date' whenever the gamehour crosses midnight by natural causes (normal passage of time, waiting/sleeping and probably fast travel as well). It is for this reason that earlier attempts to fix the calendar bug through scripting have failed.
I have done some testing both with and without the Morrowind Code Patch calendar fix installed. This was an installation with Morrowind and both expansions.
To allow the normal passage of time from one day to the next, I either waited/slept or set Gamehour to 23.99 through the console and allowed the game clock to take it from there. The results are a little erratic when you work outside coded days and months, but there are some patterns that may be useful.
If Day is set to -4 (through console) and then the day advances normally (any month real or imaginary), the behavior is the same w/ or w/o patch: the month stays the same and the day increases to -3.
This continues to advance the day (to -2 and -1) until a legitimate day is reached and normal behavior takes over.
If Month is set to -3 (through console) and then the day advances normally (from any day real or imaginary)...
w/ patch: Month = -3 (same month), Day = next day
w/o patch: Month = -3 (same month), Day = next day
This behavior appears to be consistent for any Month <= -3.
If Month is set to -2 (through console) and then the day advances normally (from any day in the month or greater than 31)...
w/ patch: Month = -1 (advanced but not legitimate), Day = 1
w/o patch: Month = -2 (same month), Day = next day
If Month is set to -1 (either by script or through console) and then the day advances normally (from any day in the month or greater than 31)...
w/ patch: Month = 0 (first month), Day = 1
w/o patch: Month = 0 (advanced but not legitimate), Day = 1
Advance a second day in the same fashion?
w/ patch: Month = 1 (first month), Day = 2
w/o patch: Month = 0 (first month), Day = 1
If Month is set to 12 (either by script or through console) and then the day advances normally (from any day in the month or greater than 31)...
w/ patch: Month = 0 (first month), Day = 1
w/o patch: Month = 1 (first month), Day = 1
If Month is set to 13 (through console) and then the day advances normally (from any day in the month or greater than 31)...
w/ patch: Month = 13 (same month), Day = next day*
w/o patch: Month = 1 (first month), Day = 1
*If Day >= 31 (w/ patch), then Month = 0 (first month), Day = 1
If Month is set to 14 (through console) and then the day advances normally (from any day in the month or greater than 31)...
w/ patch: Month = 14 (same month), Day = next day
w/o patch: Month = 14 (same month), Day = next day*
*If Day >= 31 (w/o patch), then Month = 1 (first month), Day = 1
If the month is set to 15 (through console) and then the day advances normally (from any day in the month or greater than 31)...
w/ patch: Month = 15 (same month), Day = next day
w/o patch: Month = 15 (same month), Day = next day
This behavior appears consistent for any Month >= 15.
There appears to be a range of somewhat normal behavior depending on Month. Exceed that range and any advancement of the day does not advance the month:
w/ patch: if Month <= -3 or Month >= 14, then Month does not advance
w/o patch: if Month <= -2 or Month >= 15, then Month does not advance
At first glance there may appear to be a pattern: a shift of the range by one unit because of the difference in the index of the first month. But something is amiss. The normal range of months is...
w/ patch: 0 <= Month <= 11
w/o patch: 1 <= Month <= 11
So erratic behavior begins three units below the first month in each case, but three and four units above the last month (patched and un-patched, respectively). I could double check my tests for the latter, but both are far enough outside any value of Month that would reasonably be encountered that I don't think it will matter.
I'm not sure scripts are resistant to the month being out of range of the expected values when it reaches Evening Star
Scripts seem to resist (if I am using the term correctly here) any set of conditions whether within or outside the normal range of legitimate dates. My test results:
If the day is advance by script [set Day to ( Day + 1 )], the month is not changed (regardless of the Day) the month is not changed and the day increases by one (apparently without an upper limit) regardless if the calendar fix is installed or not. Of course, once the day advances normally (game clock, wait/sleep and possibly fast travel), then the calendar will be correctly following the behavior outlined earlier in this post.
As I wrote at the beginning of this post, it is rare for scripts to write values to these globals - and ill-advised.
For the sake of my own curiosity I tested scripting
set Gamehour to ( Gamehour + 2 ) when Gamehour = 23.000. The result is the next 'legitimate' day (by previously examined Month conditions) or if Day is less than zero, Day will increase by 1. Regardless of how Day changes Gamehour will have a value of 0.000 not 1.000.
I hope this information is useful in clarifying how the game engine will manage the date under a variety of conditions. If further data is required, just let me know what circumstances you would like me to test and I will do my best to provide it.
Edit: **To say nothing about how such changes would affect other scripts keeping track of time.