Я пытаюсь построить логический набор записей часовых поясов, представляющий пятилетний период, когда стоп и дата начала/время совпадают с тем, что человек воспринимает как момент изменения времени. Например, в Америке/New_York ид, я хочу:NodaTime ZoneIntervals
03/13/2016 2:00 am - 11/06/2016 01:59:59 am gmtOffset: -4:00
11/06/2016 2:00 am - 03/12/2017 01:59:59 am gmtOffset: -5:00
Я могу построить эти записи, но я не вижу другого пути, чем не начать до 1912 года, когда ДСТ вошел в силу и отслеживать Конечный момент для все интервалы зон. Я не вижу способа определить смещение в действии, когда начинается период интервальной записи, кроме предыдущей записи интервала. Есть ли способ сделать это, используя только одну запись ZoneInterval?
Вопрос отметил в коде:
private void processTZ()
{
IDateTimeZoneProvider provider = DateTimeZoneProviders.Tzdb;
using (StreamWriter sw = new StreamWriter(@"c:\tzOut.txt"))
{
foreach (string id in provider.Ids)
{
sw.WriteLine("Id: {0}", id);
DateTimeZone zone = provider[id];
// Time period I wish to create logical representation.
Instant instantValidityBegin = (new LocalDateTime(2014, 1, 1, 0, 0)).InZoneLeniently(zone).ToInstant();
Instant instantValidityEnd = (new LocalDateTime(2019, 12, 31, 23, 59, 59, 0)).InZoneLeniently(zone).ToInstant();
// Time period from zone intervals to iterate. The first year dst was observed was 1916.
Instant instantFetchYearBegin = (new LocalDateTime(1916, 1, 1, 0, 0)).InZoneLeniently(zone).ToInstant();
Instant instantFetchYearEnd = (new LocalDateTime(2019, 12, 31, 23, 59, 0)).InZoneLeniently(zone).ToInstant();
// Get the intervals
IEnumerable<NodaTime.TimeZones.ZoneInterval> intervals = zone.GetZoneIntervals(instantFetchYearBegin, instantFetchYearEnd);
// Determine number of intervals for this tzId.
int count = 0;
foreach (NodaTime.TimeZones.ZoneInterval zi in intervals)
count++;
bool singleEntry = (1 == count);
// myStart and myEnd are desired output period
// capture IsoLocalEnd of an interval to be used as the start date of program output (myStart). Don't display older than 1900.
DateTime myStart, myEnd, prevEnd = new DateTime(1900, 1, 1);
foreach (NodaTime.TimeZones.ZoneInterval zi in intervals)
{
if (singleEntry)
{
// No question here
}
else
{
// skip intervals for this tzId that represent a period beginning after time period I want.
if (instantValidityEnd < zi.Start)
break;
// Skip intervals ending prior to time period I want, but capture the IsoLocalEnd to be used for report output.
if (zi.End < instantValidityBegin)
{
prevEnd = (zi.End == Instant.MinValue) ? prevEnd = new DateTime(1900, 1, 1) : prevEnd = zi.IsoLocalEnd.ToDateTimeUnspecified(); ;
continue;
}
// ***Question*** Can this myStart value be determined using the current interval record instead of storing the previous interval's IsoLocalEnd??
myStart = prevEnd;
if (zi.End == Instant.MaxValue)
prevEnd = myEnd = new DateTime(9999, 12, 31);
else
{
prevEnd = zi.IsoLocalEnd.ToDateTimeUnspecified();
myEnd = prevEnd.Subtract(TimeSpan.FromSeconds(1)); // force period back 1 second for logical representation.
}
sw.WriteLine("Name: " + zi.Name);
sw.WriteLine("Multi Entry: {0}", zi.ToString());
sw.WriteLine("myStart: {0:G} myEnd: {1:G} gmtOffset: {2:G}", myStart, myEnd, zi.WallOffset.ToTimeSpan());
sw.WriteLine();
}
}
sw.WriteLine("------------------------------------------------------------------");
sw.WriteLine();
}
}
}
Чтобы быть более точным, время начала интервала «выключено» значением dst предыдущей записи; однако предыдущая конечная запись хранит время, необходимое для этого типа логического представления. –
[Документы для 'ZoneInterval'] (http://nodatime.org/1.3.x/api/?topic=html/Properties_T_NodaTime_TimeZones_ZoneInterval.htm) содержит комментарий о' IsoLocalEnd', не включая сохранение. Тем не менее, неясно, используете ли вы это, или используете «Start» и «End», и конвертируете их. Не могли бы вы изменить свой вопрос, чтобы показать код, который у вас есть? Возможно, мы сможем помочь вам, если вы это сделаете.См. Также [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и [Как задать хороший вопрос?] (Http://stackoverflow.com/help/ how-to-ask) –
«Я не вижу способа определить смещение, действующее на запись ZoneInterval» - вот для чего «WallOffset». Кроме того, у меня возникли проблемы с пониманием вашего вопроса, которого я боюсь. –