Wrote something in .NET; it works well. Now I am trying to rewrite it as a shell extension with the Win32 API. Ultimately I want to convert FILETIME
s to and from ISO-8601 strings. This is doable without fuss, using GetTimeZoneInformation
and FileTimeToSystemTime
and SystemTimeToTzSpecificLocalTime
and StringCchPrintf
to assemble the members of the SYSTEMTIME
and TIME_ZONE_INFORMATION
structs into a string.
The problem, as usual when working with date/times, is Daylight Saving Time. Using GetTimeZoneInformation
tells me the UTC offset that's in effect now. Using .NET's DateTime.ToString("o")
takes into account the daylight saving time at the time represented in the DateTime.
Example for the same FILETIME
:
Output of ToString("o")
: 2017-06-21T12:00:00.0000000-05:00
Output of chained APIs: 2017-06-21T12:00:00-06:00
The UTC offset is wrong coming from the chained API calls. How does .NET's DateTime
do it? How do we replicate that in Win32? Is there something like GetTimeZoneInformationForYear
, but instead of for a year, for a moment in local time?
First, I use
DYNAMIC_TIME_ZONE_INFORMATION
structure andGetDynamicTimeZoneInformation
DYNAMIC_TIME_ZONE_INFORMATION
andTIME_ZONE_INFORMATION
also has aDaylightBias
member:So, if the date is in daylight saving time, you need to add this
DaylightBias
toBias
. In addition, you can determine whether the current date is daylight saving time according to the description inDaylightDate
: