У меня есть DST правила, как это:Преобразование правила перехода на летнее время для DateTime в C#
"2, -1,1,3600000"
- 2 является нулевой основе месяц
- The - 1 - номер недели, содержащий день, -1 означает последнюю неделю в месяце, которая содержит день
- 1 день недели, 1 - воскресенье до 7 - суббота
- 3600000 - это mS с полуночи в назначенный день, когда изменение на/f rom DST будет иметь место и выражается в местном времени, включая DST, поэтому конец времени переключения DST находится в DST.
Каков правильный способ его преобразования в C# DateTime?
До сих пор я сделал это:
public static DateTime ConvertDstRule(int year, string rule, bool isEndRule)
{
const int DaysInWeek = 7;
var ruleName = isEndRule ? "endRule" : "startRule";
var startStrings = rule.Split(',');
var month = Convert.ToInt32(startStrings[0]);
if ((month < 0) || (month > 11))
{
throw new ArgumentOutOfRangeException(ruleName, "The month value must be between 0 and 11");
}
var week = Convert.ToInt32(startStrings[1]);
if ((week < -1) || (week > 5))
{
throw new ArgumentOutOfRangeException(ruleName, "The week value must be between -1 and 5");
}
if ((Convert.ToInt32(startStrings[2]) < 1) || (Convert.ToInt32(startStrings[2]) > 7))
{
throw new ArgumentOutOfRangeException(ruleName, "The day value must be between 1 and 7");
}
var day = (DayOfWeek)(Convert.ToInt32(startStrings[2]) - 1); // DayOfWeek is zero based so shift by one.
var timeOffset = Convert.ToInt64(startStrings[3]);
if ((timeOffset/1000/60) > 86400)
{
throw new ArgumentOutOfRangeException(ruleName, "The time offset is limited to one day");
}
// Find the start of the relevant year.
var startTime = new DateTime(year, 1, 1);
// Add on the month to get to the start of the selected month.
startTime = startTime.AddMonths(month);
// If the week is negative then go to the first occurance of the day in
// the next month, adding a negative week number will jump back into
// the previous month.
if (week < 0)
{
startTime = startTime.AddMonths(1);
}
else
{
week = week - 1;
}
// Jump to the first occurence of the day to switch in that month.
var monthStartsOn = startTime.DayOfWeek;
var daysToSwitchDay = (int)day - (int)monthStartsOn;
// This is likely to be negative as most zones switch on a Sunday
if (daysToSwitchDay < 0)
{
daysToSwitchDay = DaysInWeek + daysToSwitchDay; // daysToSwitchDay is negative so add it.
}
startTime = startTime.AddDays(daysToSwitchDay); // Now on the correct day.
startTime = startTime.AddDays(week * 7); // Week counts from 1.
startTime = startTime.AddMilliseconds(timeOffset);
if (isEndRule)
{
startTime = startTime.AddHours(-1); // Take off the DST hour to convert it to UTC.
}
return startTime;
}
ли она учитывает получасовые изменения летнего времени, как в Индии? Вы можете обнаружить ошибку в этом коде?
Тот факт, что вы пытаетесь написать этот код самостоятельно, является ошибкой для меня. Вы должны использовать [nodatime] (http://nodatime.org/). –
Кроме того, вопросы проверки кода не соответствуют теме. Они должны быть опубликованы на codereview.stackexchange.com –
Если эти правила DST предназначены для гипотетических стран, не имеющих стран и часовых поясов, тогда я все же уверен, что вы можете использовать nodatime, но если эти правила DST предназначены для реальных стран и часовых поясов, nodatime уже есть ваши ответы. –