private static Boolean AdjustTimeZoneToLocal(ref DateTimeResult result, bool bTimeOnly) {
long resultTicks = result.parsedDate.Ticks;
// Convert to local ticks
CurrentSystemTimeZone tz = (CurrentSystemTimeZone)TimeZone.CurrentTimeZone;
Boolean isAmbiguousLocalDst = false;
if (resultTicks < Calendar.TicksPerDay) {
//
// This is time of day.
//
// Adjust timezone.
resultTicks -= result.timeZoneOffset.Ticks;
// If the time is time of day, use the current timezone offset.
resultTicks += tz.GetUtcOffset(bTimeOnly ? DateTime.Now: result.parsedDate).Ticks;
if (resultTicks < 0) {
resultTicks += Calendar.TicksPerDay;
}
} else {
// Adjust timezone to GMT.
resultTicks -= result.timeZoneOffset.Ticks;
if (resultTicks < DateTime.MinTicks || resultTicks > DateTime.MaxTicks) {
// If the result ticks is greater than DateTime.MaxValue, we can not create a DateTime from this ticks.
// In this case, keep using the old code.
resultTicks += tz.GetUtcOffset(result.parsedDate).Ticks;
} else {
// Convert the GMT time to local time.
resultTicks += tz.GetUtcOffsetFromUniversalTime(new DateTime(resultTicks), ref isAmbiguousLocalDst);
}
}
if (resultTicks < DateTime.MinTicks || resultTicks > DateTime.MaxTicks) {
result.parsedDate = DateTime.MinValue;
result.SetFailure(ParseFailureKind.Format, "Format_DateOutOfRange", null);
return false;
}
result.parsedDate = new DateTime(resultTicks, DateTimeKind.Local, isAmbiguousLocalDst);
return true;
}