I’ve just been through this myself. I’ve found that the best approach is to create your custom trading hours in the exchange time zone, much like the built-in templates do.
Then session times are automatically converted by NinjaTrader into your local NT time zone (from Settings → General → Time Zone). Any adjustments for daylight savings times or other seasonal offsets are handled automatically when the time zone conversions are performed.
If you need to directly access your custom trading hours templates yourself and do conversions, such as for calculating the session end when you don’t want the overhead of SessionIterator, then you can do something like the following:
TimeZoneInfo tziTradingHours = Strategy.TradingHours.TimeZoneInfo;
TimeZoneInfo tziLocal = NinjaTrader.Core.Globals.GeneralOptions.TimeZoneInfo;
DateTime dtLocal = TimeZoneInfo.ConvertTime(dtInExchangeTime, tziTradingHours, tziLocal);
DateTime dtExchange = TimeZoneInfo.ConvertTime(dtInLocalTime, tziLocal, tziTradingHours);
These conversions should handle any seasonal offsets.