64ac736ec5
Former-commit-id: f3cc9b82f3e5bd8f0fd3ebc098f789556b44e9cd
70 lines
2.8 KiB
C#
70 lines
2.8 KiB
C#
// Licensed to the .NET Foundation under one or more agreements.
|
|
// The .NET Foundation licenses this file to you under the MIT license.
|
|
// See the LICENSE file in the project root for more information.
|
|
|
|
namespace System
|
|
{
|
|
partial class TimeZoneInfo
|
|
{
|
|
//
|
|
// TransitionTimeToDateTime -
|
|
//
|
|
// Helper function that converts a year and TransitionTime into a DateTime
|
|
//
|
|
static internal DateTime TransitionTimeToDateTime(Int32 year, TransitionTime transitionTime) {
|
|
DateTime value;
|
|
DateTime timeOfDay = transitionTime.TimeOfDay;
|
|
|
|
if (transitionTime.IsFixedDateRule) {
|
|
// create a DateTime from the passed in year and the properties on the transitionTime
|
|
|
|
// if the day is out of range for the month then use the last day of the month
|
|
Int32 day = DateTime.DaysInMonth(year, transitionTime.Month);
|
|
|
|
value = new DateTime(year, transitionTime.Month, (day < transitionTime.Day) ? day : transitionTime.Day,
|
|
timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);
|
|
}
|
|
else {
|
|
if (transitionTime.Week <= 4) {
|
|
//
|
|
// Get the (transitionTime.Week)th Sunday.
|
|
//
|
|
value = new DateTime(year, transitionTime.Month, 1,
|
|
timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);
|
|
|
|
int dayOfWeek = (int)value.DayOfWeek;
|
|
int delta = (int)transitionTime.DayOfWeek - dayOfWeek;
|
|
if (delta < 0) {
|
|
delta += 7;
|
|
}
|
|
delta += 7 * (transitionTime.Week - 1);
|
|
|
|
if (delta > 0) {
|
|
value = value.AddDays(delta);
|
|
}
|
|
}
|
|
else {
|
|
//
|
|
// If TransitionWeek is greater than 4, we will get the last week.
|
|
//
|
|
Int32 daysInMonth = DateTime.DaysInMonth(year, transitionTime.Month);
|
|
value = new DateTime(year, transitionTime.Month, daysInMonth,
|
|
timeOfDay.Hour, timeOfDay.Minute, timeOfDay.Second, timeOfDay.Millisecond);
|
|
|
|
// This is the day of week for the last day of the month.
|
|
int dayOfWeek = (int)value.DayOfWeek;
|
|
int delta = dayOfWeek - (int)transitionTime.DayOfWeek;
|
|
if (delta < 0) {
|
|
delta += 7;
|
|
}
|
|
|
|
if (delta > 0) {
|
|
value = value.AddDays(-delta);
|
|
}
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
} // TimezoneInfo
|
|
} // namespace System
|