/// <summary> /// Optimized conversion from an Instant to an OffsetDateTime in the specified calendar. /// This is equivalent to <c>new OffsetDateTime(new LocalDateTime(instant.Plus(offset), calendar), offset)</c> /// but with less overhead. /// </summary> internal OffsetDateTime(Instant instant, Offset offset, CalendarSystem calendar) { unchecked { int days = instant.DaysSinceEpoch; long nanoOfDay = instant.NanosecondOfDay + offset.Nanoseconds; if (nanoOfDay >= NanosecondsPerDay) { days++; nanoOfDay -= NanosecondsPerDay; } else if (nanoOfDay < 0) { days--; nanoOfDay += NanosecondsPerDay; } yearMonthDayCalendar = calendar.GetYearMonthDayFromDaysSinceEpoch(days).WithCalendar(calendar); nanosecondsAndOffset = nanoOfDay | (((long)offset.Seconds) << NanosecondsBits); } }
/// <summary> /// Constructs an instance from the number of days since the unix epoch, and a calendar /// system. The calendar system is assumed to be non-null, but the days since the epoch are /// validated. /// </summary> // TODO: See if we still need this. internal LocalDate(int daysSinceEpoch, [Trusted][NotNull] CalendarSystem calendar) { Preconditions.DebugCheckNotNull(calendar, nameof(calendar)); this.yearMonthDayCalendar = calendar.GetYearMonthDayFromDaysSinceEpoch(daysSinceEpoch).WithCalendar(calendar); }