When I described the two ways that the TIME_ZONE_INFORMATION
structure represents the rules for daylight saving time,
commenter Voo
argued (and I hope I interpreted the message correctly)
that either there should be two functions, one for each of the ways,
or have
GetTimeZoneInformationForYear
function calculate the day automatically from the week and return that.
That way, callers always see the correct day.
Okay, there are multiple things in play here, but they all boil down to “no code is an island”.
If all you needed to support was a way to answer the
question “When does daylight saving time start and end
in this specific year”,
then certainly the nth week rules could be
interpreted by the
GetTimeZoneInformationForYear
function,
so that all that came out of the function was a specific date and time.
But that’s not the only function that deals with time zone information.
For starters, we have
GetTimeZoneInformation
.
Since this function is not dependent on the year,
it wouldn’t know what year to use to calculate
the date on which the third Sunday falls.
It would have to leave the structure in generic form.
Now, maybe you say, “Yeah, these two functions return the same structure, and you just have to know that one of the functions will autoconvert and the other won’t.” Some people will find that confusing.
Maybe you solve that problem by saying, “These two functions return different structures, reflecting their different natures.” Some people will be frustrated by that, because they will have to write two versions of the same function, one for each structure.
(I’m not event going to bother adding
GetDynamicTimeZoneInformation
.
to the mix.)
And then there’s the question of whether it’s okay
that the Get
function returns a structure
that cannot be passed into the corresponding
Set
function.
(Which is a bit of a pointless question here,
seeing as there is no
SetTimeZoneInformationForYear
function, but maybe someday it will show up.)
It also means that you cannot compare two
TIME_ZONE_INFORMATION
structures from different years to see whether
the time zone transition rules are the same in those years.
(This is, admitted, a fringe scenario.)
Two functions seems the less crazy way out.
There would be a
GetUnexpandedTimeZoneInformationForYear
which returns the unprocesed information
and a
GetExpandedTimeZoneInformationForYear
that does the date lookup for the appropriate year.
Though personally, I would keep
GetTimeZoneInformationForYear
as-is and add a
CalculateDaylightSavingTransitionDatesForYear
function.
That way, you could use it to expand other things.
I suspect no such
CalculateDaylightSavingTransitionDatesForYear
function exists because the kernel folks have
a general bias against writing functions that you could
have written yourself,
so that they can focus on writing functions that
you can’t write yourself because
it requires special access to things that only the
kernel has access to.
(Like querying the current time zone.)