Class HealthInterval
The bucket width of an AggregateQuery -- "per hour", "per calendar
day", "per calendar month".
Fixed durations and calendar periods are not the same thing
A calendar day is 23 or 25 hours across a daylight-saving transition,
and a month is 28 to 31 days. Bucketing by a fixed 86400000 therefore
drifts against the dates a user sees in your UI, silently, twice a
year. Both platforms model the distinction natively -- Health Connect
splits aggregateGroupByDuration from aggregateGroupByPeriod, and
HealthKit takes DateComponents -- so this API keeps it too.
Calendar-based intervals require an explicit ZoneId. Nothing
here reads the JVM default, because a server-side default of UTC would put
a user's evening walk into the wrong day.
-
Method Summary
Modifier and TypeMethodDescriptionlongbucketStart(long millis, long anchorMillis) The start of the bucket that containsmillis.static HealthIntervalcalendarDays(int days, ZoneId zone) Calendar days inzone, aligned to local midnight.static HealthIntervalcalendarMonths(int months, ZoneId zone) Calendar months inzone, aligned to local midnight on the first of the month.static HealthIntervalcalendarWeeks(int weeks, ZoneId zone, int firstDayOfWeek) Calendar weeks inzone, aligned tofirstDayOfWeek(ajava.util.Calendarday constant such asCalendar.MONDAY).This interval as aDuration, or null when it is calendar-based.longThe fixed width in milliseconds, or 0 whenisCalendarBased().getZone()The zone calendar boundaries are computed in, or null for a fixed-duration interval.static HealthIntervalhours(int hours) A fixed number of hours.booleantruewhen this interval follows the calendar rather than a fixed number of milliseconds.static HealthIntervalmillis(long millis) A fixed number of milliseconds.static HealthIntervalminutes(int minutes) A fixed number of minutes.longnextBoundary(long bucketStartMillis) The start of the bucket after the one starting atbucketStartMillis.static HealthIntervalAn interval oflength.toString()Returns a string representation of the object.
-
Method Details
-
millis
A fixed number of milliseconds. -
minutes
A fixed number of minutes. -
hours
A fixed number of hours. -
calendarDays
Calendar days inzone, aligned to local midnight. Correct across daylight-saving transitions. -
calendarWeeks
Calendar weeks inzone, aligned tofirstDayOfWeek(ajava.util.Calendarday constant such asCalendar.MONDAY). The first day of the week is explicit because it differs by locale and silently guessing it shifts every bucket boundary. -
calendarMonths
Calendar months inzone, aligned to local midnight on the first of the month. -
isCalendarBased
public boolean isCalendarBased()truewhen this interval follows the calendar rather than a fixed number of milliseconds. -
getFixedMillis
public long getFixedMillis()The fixed width in milliseconds, or 0 whenisCalendarBased(). -
getZone
The zone calendar boundaries are computed in, or null for a fixed-duration interval.
A
ZoneIdrather than ajava.util.TimeZone, and immutable, so it can be handed out as-is. The mutable type needed a caveat instead of an answer: an interval built from aSimpleTimeZonethat was later reconfigured moved its bucket boundaries, putting the same samples in different days, and the compile target could not defend against it -- the CLDC 1.1 subset exposes no publicTimeZone.clone(), andgetTimeZone(getID())answers GMT for an unrecognised id, which would have silently discarded the rules of the very zone being protected. -
getDuration
-
of
An interval oflength. -
bucketStart
public long bucketStart(long millis, long anchorMillis) The start of the bucket that containsmillis. For a fixed interval this is anchored onanchorMillis; for a calendar interval it snaps to the local period boundary andanchorMillisis ignored. -
nextBoundary
public long nextBoundary(long bucketStartMillis) The start of the bucket after the one starting atbucketStartMillis. Bucketn's exclusive end is bucketn+1's inclusive start, so buckets tile with no gap and no overlap even when their widths differ. -
toString
Description copied from class:ObjectReturns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method. The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of: getClass().getName() + '@' + Integer.toHexString(hashCode())
-