public final class Day extends java.lang.Object implements java.lang.Comparable<Day>, java.io.Serializable
Note that, internally, this class, like all the other date-related classes in this package, uses the modern Gregorian calendar for all validation and calculations. The Gregorian calendar was introduced in 1582 but this class applies it to earlier dates as well (so using what is known as the "proleptic Gregorian calendar"). This fits with the ISO 8601 standard and is how the java.time
package works by default, but it's not how java.util.Calendar
works by default, so bear this in mind if you are working with dates from 1582 or before. You are of course unlikely to find good weather data from that far back, but we mention this just in case you find yourself using this class for other purposes as well!
Instances of this class are immutable. You can safely reuse them and call them from multiple threads at once.
Constructor and Description |
---|
Day(int year,
int monthOfYearWithJanAs1,
int dayOfMonth)
Constructs a
Day object representing a date with the
specified year, month, and day. |
Modifier and Type | Method and Description |
---|---|
boolean |
after(Day comparisonDay)
Returns
true if this Day object is
chronologically after comparisonDay ; false
otherwise. |
DayRange |
asRange()
Returns a non-null
DayRange covering this Day
only. |
boolean |
before(Day comparisonDay)
Returns
true if this Day object is
chronologically before comparisonDay ; false
otherwise. |
int |
compareTo(Day comparisonDay)
Compares two
Day objects for chronological ordering. |
int |
dayOfMonth()
Returns a number between 1 and 31 (inclusive) indicating the
day-of-the-month component of this
Day . |
DayOfWeek |
dayOfWeek()
Returns a non-null
DayOfWeek object indicating the
day of the week of this Day . |
int |
dayOfYear()
Returns a number between 1 and 366 inclusive (365 for non-leap years)
indicating the day of the year of this
Day . |
int |
daysAfter(Day comparisonDay)
Returns the number of days that this
Day is after
comparisonDay , which will be negative if this
Day comes first chronologically. |
int |
daysBefore(Day comparisonDay)
Returns the number of days that this
Day is before
comparisonDay , which will be negative if
comparisonDay comes first chronologically. |
boolean |
equals(java.lang.Object o)
Returns
true if o is a Day
representing the same date as this Day ; false
otherwise. |
static Day |
fromCalendar(java.util.Calendar calendar)
Returns the non-null
Day object represented by the
YEAR , MONTH , and DAY_OF_MONTH
fields of calendar . |
static Day |
fromDateUtc(java.util.Date date)
Returns the non-null
Day object represented by
date , as interpreted in the context of the UTC time-zone. |
static Day |
fromString(java.lang.String dateString)
Parses a string date in ISO
YYYY-MM-DD format (the format
used by XML schema's date type), or YYYYMMDD format. |
DayRange |
fullCalendarMonth()
Returns a non-null
DayRange representing the calendar month
in which this Day falls. |
DayRange |
fullCalendarYear()
Returns a non-null
DayRange representing the calendar year
in which this Day falls. |
DayRange |
fullMonth(StartOfMonth startOfMonth)
Returns a non-null
DayRange representing the month (starting
on the specified StartOfMonth ) in which this
Day falls. |
DayRange |
fullWeek(DayOfWeek firstDayOfWeek)
Returns a non-null
DayRange representing the week (starting
on the specified firstDayOfWeek ) in which this
Day falls. |
DayRange |
fullYear(StartOfYear startOfYear)
Returns a non-null
DayRange representing the year (starting
on the specified StartOfYear ) in which this Day
falls. |
int |
hashCode()
Overridden to ensure consistency with
equals . |
Day |
minusDays(int numberOfDays)
Returns the non-null
Day that comes the specified
numberOfDays before this Day in the calendar. |
Day |
minusMonths(int numberOfMonths)
Returns the non-null
Day that comes the specified
numberOfMonths before this Day in the calendar. |
Day |
minusWeeks(int numberOfWeeks)
Returns the non-null
Day that comes the specified
numberOfWeeks before this Day in the calendar. |
Day |
minusYears(int numberOfYears)
Returns the non-null
Day that comes the specified
numberOfYears before this Day in the calendar. |
int |
monthOfYear()
Returns a number between 1 (January) and 12 (December) indicating the
month-of-the-year component of this
Day . |
Day |
next()
Returns the non-null
Day that comes immediately after this
Day in the calendar. |
static Day |
of(int year,
int monthOfYearWithJanAs1,
int dayOfMonth)
Returns a non-null
Day object representing a date with the
specified year, month, and day. |
Day |
plusDays(int numberOfDays)
Returns the non-null
Day that comes the specified
numberOfDays after this Day in the calendar. |
Day |
plusMonths(int numberOfMonths)
Returns the non-null
Day that comes the specified
numberOfMonths after this Day in the calendar. |
Day |
plusWeeks(int numberOfWeeks)
Returns the non-null
Day that comes the specified
numberOfWeeks after this Day in the calendar. |
Day |
plusYears(int numberOfYears)
Returns the non-null
Day that comes the specified
numberOfYears after this Day in the calendar. |
Day |
previous()
Returns the non-null
Day that comes immediately before this
Day in the calendar. |
DayRange |
to(Day firstOrLastDayInRange)
Returns the non-null
DayRange covering (inclusively) the
days between this Day and firstOrLastDayInRange
(which can be before, after, or equal to this Day ). |
DayRange |
to(int toYear,
int toMonthOfYearWithJanAs1,
int toDayOfMonth)
Returns the non-null
DayRange covering (inclusively) the
days between this Day and the Day represented
by the specified parameters (which can be before, after, or equal to this
Day ). |
static Day |
todayInSystemTimeZone()
Returns the non-null
Day object representing the current
date in the system time-zone. |
static Day |
todayInUtc()
Returns the non-null
Day object representing the current
date in the UTC time-zone. |
java.lang.String |
toNumericString()
Returns a non-null, non-empty string representation of this
Day in YYYYMMDD format. |
java.lang.String |
toString()
Returns a non-null, non-empty string representation of this
Day in YYYY-MM-DD format. |
int |
year()
Returns a number indicating the year component of this
Day
object. |
public Day(int year, int monthOfYearWithJanAs1, int dayOfMonth)
Day
object representing a date with the
specified year, month, and day.
It is usually better to call of(int, int, int)
as that can re-use cached
instances to conserve memory.year
- the year - a number greater than 0 and less than or equal to
9999.monthOfYearWithJanAs1
- the month of the year - a number between 1
and 12 (inclusive), January being 1 and December being 12.dayOfMonth
- the day of the month - a number between 1 and 31,
although the upper limit depends on the month (since different
months have different numbers of days), and the year (since
February has 29 days on leap years and 28 otherwise).java.lang.IllegalArgumentException
- if any of the parameters are outside of
their allowed ranges i.e. the date doesn't correspond to a real
calendar date, or it is outside the range allowed by
Day
(0001-01-01 to 9999-12-31 inclusive).of(int, int, int)
public int year()
Day
object.public int monthOfYear()
Day
.public int dayOfMonth()
Day
.public int dayOfYear()
Day
.public static Day of(int year, int monthOfYearWithJanAs1, int dayOfMonth)
Day
object representing a date with the
specified year, month, and day.
This will return Day
objects from an internal cache when
possible, to conserve memory.year
- the year - a number greater than 0 and less than or equal to
9999.monthOfYearWithJanAs1
- the month of the year - a number between 1
and 12 (inclusive), January being 1 and December being 12.dayOfMonth
- the day of the month - a number between 1 and 31,
although the upper limit depends on the month (since different
months have different numbers of days), and the year (since
February has 29 days on leap years and 28 otherwise).java.lang.IllegalArgumentException
- if any of the parameters are outside of
their allowed ranges i.e. the date doesn't correspond to a real
calendar date, or it is outside the range allowed by
Day
(0001-01-01 to 9999-12-31 inclusive).public static Day fromString(java.lang.String dateString) throws java.lang.NumberFormatException
YYYY-MM-DD
format (the format
used by XML schema's date type), or YYYYMMDD
format. Both
formats can optionally have a '+' in front - XML schema doesn't allow the
'+', but ISO does.Day
object corresponding to the date
represented by dateString
.java.lang.NullPointerException
- if dateString
is
null
.java.lang.NumberFormatException
- if dateString
has an invalid
format, or if it represents a non-existent date or one that is
outside the range allowed by Day
(0001-01-01 to
9999-12-31 inclusive).toString()
,
toNumericString()
public static Day fromCalendar(java.util.Calendar calendar)
Day
object represented by the
YEAR
, MONTH
, and DAY_OF_MONTH
fields of calendar
. (We correct for the fact that
Calendar.MONTH
is zero-based.)java.lang.NullPointerException
- if calendar
is
null
.java.lang.IllegalArgumentException
- if the fields of calendar
represent a date that is outside the range allowed by
Day
(0001-01-01 to 9999-12-31 inclusive).public static Day fromDateUtc(java.util.Date date)
Day
object represented by
date
, as interpreted in the context of the UTC time-zone. (A
Date
represents a specific instant in time, so the
Day
that it corresponds to depends on the time-zone. This
method assumes a UTC time-zone.)java.lang.NullPointerException
- if date
is null
.java.lang.IllegalArgumentException
- if date
is outside the
range allowed by Day
(0001-01-01 to 9999-12-31
inclusive).public static Day todayInSystemTimeZone()
Day
object representing the current
date in the system time-zone.java.lang.IllegalArgumentException
- if the system clock is configured with a
date that is outside the range allowed by Day
(0001-01-01 to 9999-12-31 inclusive).public static Day todayInUtc()
Day
object representing the current
date in the UTC time-zone.java.lang.IllegalArgumentException
- if the system clock is configured with a
date that is outside the range allowed by Day
(0001-01-01 to 9999-12-31 inclusive).public boolean equals(java.lang.Object o)
true
if o
is a Day
representing the same date as this Day
; false
otherwise.equals
in class java.lang.Object
public int hashCode()
equals
.hashCode
in class java.lang.Object
public int compareTo(Day comparisonDay)
Day
objects for chronological ordering.compareTo
in interface java.lang.Comparable<Day>
comparisonDay
- the Day
to be compared. Cannot be
null
.Day
is before
comparisonDay
; zero if this Day
is
equal to comparisonDay
; or a positive integer if
this Day
is after comparisonDay
.java.lang.NullPointerException
- if comparisonDay
is
null
.public boolean before(Day comparisonDay)
true
if this Day
object is
chronologically before comparisonDay
; false
otherwise.comparisonDay
- the Day
to compare with this
Day
. Cannot be null
.java.lang.NullPointerException
- if comparisonDay
is
null
.public boolean after(Day comparisonDay)
true
if this Day
object is
chronologically after comparisonDay
; false
otherwise.comparisonDay
- the Day
to compare with this
Day
. Cannot be null
.java.lang.NullPointerException
- if comparisonDay
is
null
.public Day next()
Day
that comes immediately after this
Day
in the calendar. Will happily cross the borders between
months and years.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a Day
object with a year less than 1 or
greater than 9999.public Day previous()
Day
that comes immediately before this
Day
in the calendar. Will happily cross the borders between
months and years.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a Day
object with a year less than 1 or
greater than 9999.public Day plusDays(int numberOfDays)
Day
that comes the specified
numberOfDays
after this Day
in the calendar.
This will happily cross the borders between months and years, and it will
always ensure that the returned result is a valid Day
,
unless it is outside the range allowed by Day
(0001-01-01 to
9999-12-31 inclusive), in which case it will throw an
IllegalStateException
.
For example 2019-02-14 plus 365 days would give a result of 2020-02-14.
Day
is immutable, so calling this method will not change
this Day
object.
numberOfDays
- the number of days to add to this Day
.
Can be positive (to go forwards in time), zero, or negative (to go
backwards in time).Day
object representing the result of the
operation.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a Day
object with a year less than 1 or
greater than 9999.public Day minusDays(int numberOfDays)
Day
that comes the specified
numberOfDays
before this Day
in the calendar.
This will happily cross the borders between months and years, and it will
always ensure that the returned result is a valid Day
,
unless it is outside the range allowed by Day
(0001-01-01 to
9999-12-31 inclusive), in which case it will throw an
IllegalStateException
.
For example 2020-02-14 minus 365 days would give a result of 2019-02-14.
Day
is immutable, so calling this method will not change
this Day
object.
numberOfDays
- the number of days to subtract from this
Day
. Can be positive (to go backwards in time), zero,
or negative (to go forwards in time).Day
object representing the result of the
operation.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a Day
object with a year less than 1 or
greater than 9999.public Day plusWeeks(int numberOfWeeks)
Day
that comes the specified
numberOfWeeks
after this Day
in the calendar.
This will happily cross the borders between months and years, and it will
always ensure that the returned result is a valid Day
,
unless it is outside the range allowed by Day
(0001-01-01 to
9999-12-31 inclusive), in which case it will throw an
IllegalStateException
.
For example 2020-07-24 (a Friday) plus 2 weeks would give a result of 2020-08-07 (also a Friday).
Day
is immutable, so calling this method will not change
this Day
object.
numberOfWeeks
- the number of weeks to add to this Day
.
Can be positive (to go forwards in time), zero, or negative (to go
backwards in time).Day
object representing the result of the
operation.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a Day
object with a year less than 1 or
greater than 9999.public Day minusWeeks(int numberOfWeeks)
Day
that comes the specified
numberOfWeeks
before this Day
in the calendar.
This will happily cross the borders between months and years, and it will
always ensure that the returned result is a valid Day
,
unless it is outside the range allowed by Day
(0001-01-01 to
9999-12-31 inclusive), in which case it will throw an
IllegalStateException
.
For example 2020-08-07 (a Friday) minus 2 weeks would give a result of 2020-07-24 (also a Friday).
Day
is immutable, so calling this method will not change
this Day
object.
numberOfWeeks
- the number of weeks to subtract from this
Day
. Can be positive (to go backwards in time), zero,
or negative (to go forwards in time).Day
object representing the result of the
operation.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a Day
object with a year less than 1 or
greater than 9999.public Day plusMonths(int numberOfMonths)
Day
that comes the specified
numberOfMonths
after this Day
in the calendar.
This will happily cross the borders between years, and it will always
ensure that the returned result is a valid Day
, unless it is
outside the range allowed by Day
(0001-01-01 to 9999-12-31
inclusive), in which case it will throw an
IllegalStateException
.
The dayOfMonth()
of the returned Day
will be the
same as that of this Day
when possible, but sometimes it
will have to be reduced, to fit within the constraints of the resulting
month. For example:
However, the dayOfMonth()
will only change when absolutely
necessary, for example:
Day
is immutable, so calling this method will not change
this Day
object.
numberOfMonths
- the number of months to add to this
Day
. Can be positive (to go forwards in time), zero,
or negative (to go backwards in time).Day
object representing the result of the
operation.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a Day
object with a year less than 1 or
greater than 9999.public Day minusMonths(int numberOfMonths)
Day
that comes the specified
numberOfMonths
before this Day
in the calendar.
This will happily cross the borders between years, and it will always
ensure that the returned result is a valid Day
, unless it is
outside the range allowed by Day
(0001-01-01 to 9999-12-31
inclusive), in which case it will throw an
IllegalStateException
.
The dayOfMonth()
of the returned Day
will be the
same as that of this Day
when possible, but sometimes it
will have to be reduced, to fit within the constraints of the resulting
month. For example:
However, the dayOfMonth()
will only change when absolutely
necessary, for example:
Day
is immutable, so calling this method will not change
this Day
object.
numberOfMonths
- the number of months to subtract from this
Day
. Can be positive (to go backwards in time), zero,
or negative (to go forwards in time).Day
object representing the result of the
operation.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a Day
object with a year less than 1 or
greater than 9999.public Day plusYears(int numberOfYears)
Day
that comes the specified
numberOfYears
after this Day
in the calendar.
This will always return a valid Day
, unless it is outside
the range allowed by Day
(0001-01-01 to 9999-12-31
inclusive), in which case it will throw an
IllegalStateException
.
The monthOfYear()
of the returned Day
will always
be the same as that of this Day
. However, the
dayOfMonth()
of the returned Day
will change if
this Day
represents February 29th (in a leap year), and the
resulting Day
does not fall in a leap year. In this unusual
situation the dayOfMonth()
of the returned Day
will
be 28 instead of 29, to ensure that it represents a valid date on the
Gregorian calendar. For example:
Day
is immutable, so calling this method will not change
this Day
object.
numberOfYears
- the number of years to add to this Day
.
Can be positive (to go forwards in time), zero, or negative (to go
backwards in time).Day
object representing the result of the
operation.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a Day
object with a year less than 1 or
greater than 9999.public Day minusYears(int numberOfYears)
Day
that comes the specified
numberOfYears
before this Day
in the calendar.
This will always return a valid Day
, unless it is outside
the range allowed by Day
(0001-01-01 to 9999-12-31
inclusive), in which case it will throw an
IllegalStateException
.
The monthOfYear()
of the returned Day
will always
be the same as that of this Day
. However, the
dayOfMonth()
of the returned Day
will change if
this Day
represents February 29th (in a leap year), and the
resulting Day
does not fall in a leap year. In this unusual
situation the dayOfMonth()
of the returned Day
will
be 28 instead of 29, to ensure that it represents a valid date on the
Gregorian calendar. For example:
Day
is immutable, so calling this method will not change
this Day
object.
numberOfYears
- the number of years to subtract from this
Day
. Can be positive (to go backwards in time), zero,
or negative (to go forwards in time).Day
object representing the result of the
operation.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a Day
object with a year less than 1 or
greater than 9999.public DayRange to(Day firstOrLastDayInRange)
DayRange
covering (inclusively) the
days between this Day
and firstOrLastDayInRange
(which can be before, after, or equal to this Day
).firstOrLastDayInRange
- the Day
that the returned
DayRange
should extend from this Day
to.
Can be before, after, or equal to this Day
. Cannot be
null
.DayRange
object that extends from the
earlier of this Day
and
firstOrLastDayInRange
to the later of those two
Day
objects.java.lang.NullPointerException
- if firstOrLastDayInRange
is
null
.to(int, int, int)
public DayRange to(int toYear, int toMonthOfYearWithJanAs1, int toDayOfMonth)
DayRange
covering (inclusively) the
days between this Day
and the Day
represented
by the specified parameters (which can be before, after, or equal to this
Day
).toYear
- the year of the Day
that this Day
should be extended to - a number greater than 0 and less than or
equal to 9999.toMonthOfYearWithJanAs1
- the month-of-the-year of the
Day
that this Day
should be extended to
- a number between 1 and 12 (inclusive), January being 1 and
December being 12.toDayOfMonth
- the day-of-the-month of the Day
that
this Day
should be extended to - a number between 1
and 31, although the upper limit depends on the month (since
different months have different numbers of days), and the year
(since February has 29 days on leap years and 28 otherwise).java.lang.IllegalArgumentException
- if any of the parameters are outside of
their allowed ranges i.e. the to-date specified doesn't
correspond to a real calendar date, or it is outside the range
allowed by Day
(0001-01-01 to 9999-12-31 inclusive).to(Day)
public DayRange asRange()
DayRange
covering this Day
only.
This is essentially a convenience method. Instead of typing
Day.of(2011, 1, 1).to(2011, 1, 1)
you can type
Day.of(2011, 1, 1).asRange()
public int daysAfter(Day comparisonDay)
Day
is after
comparisonDay
, which will be negative if this
Day
comes first chronologically.
For example:
Day.of(2020, 5, 15).daysAfter(Day.of(2020, 5, 14))
will
return 1
.Day.of(2020, 7, 18).daysAfter(Day.of(2020, 7, 20))
will
return -2
.Day.of(1999, 12, 31).daysAfter(Day.of(1999, 12, 31))
will return 0
.java.lang.NullPointerException
- if comparisonDay
is
null
.daysBefore(net.degreedays.time.Day)
public int daysBefore(Day comparisonDay)
Day
is before
comparisonDay
, which will be negative if
comparisonDay
comes first chronologically.
For example:
Day.of(2020, 7, 18).daysBefore(Day.of(2020, 7, 20))
will
return 2
.Day.of(2020, 5, 15).daysBefore(Day.of(2020, 5, 14))
will
return -1
.Day.of(1999, 12, 31).daysBefore(Day.of(1999, 12, 31))
will return 0
.java.lang.NullPointerException
- if comparisonDay
is
null
.daysAfter(net.degreedays.time.Day)
public DayOfWeek dayOfWeek()
DayOfWeek
object indicating the
day of the week of this Day
.public DayRange fullMonth(StartOfMonth startOfMonth)
DayRange
representing the month (starting
on the specified StartOfMonth
) in which this
Day
falls.
For example
Day.of(2020, 6, 21).fullMonth(StartOfMonth.of(15))
would
return a DayRange
covering 2020-06-15 to 2020-07-14
(inclusive).
startOfMonth
- indicating the first day of a "month" e.g.
StartOfMonth.of(1)
for calendar months starting on
the 1st. Cannot be null
.java.lang.NullPointerException
- if startOfMonth
is
null
.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a DayRange
extending outside of the range
allowed by Day
(0001-01-01 to 9999-12-31 inclusive).fullCalendarMonth()
public DayRange fullCalendarMonth()
DayRange
representing the calendar month
in which this Day
falls.
For example Day.of(2020, 6, 21).fullCalendarMonth()
would
return a DayRange
covering 2020-06-01 to 2020-06-30
(inclusive).
java.lang.IllegalStateException
- in the unlikely event of this method
requiring a DayRange
extending outside of the range
allowed by Day
(0001-01-01 to 9999-12-31 inclusive).fullMonth(net.degreedays.time.StartOfMonth)
public DayRange fullYear(StartOfYear startOfYear)
DayRange
representing the year (starting
on the specified StartOfYear
) in which this Day
falls.
For example
Day.of(2020, 6, 21).fullYear(StartOfYear.of(4, 6))
would
return a DayRange
covering 2020-04-06 to 2021-04-05
(inclusive).
startOfYear
- indicating the first day of a "year" e.g.
StartOfYear.of(1, 1)
for calendar years starting on
January 1st. Cannot be null
.java.lang.NullPointerException
- if startOfYear
is
null
.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a DayRange
extending outside of the range
allowed by Day
(0001-01-01 to 9999-12-31 inclusive).fullCalendarYear()
public DayRange fullCalendarYear()
DayRange
representing the calendar year
in which this Day
falls.
For example Day.of(2020, 6, 21).fullCalendarYear()
would
return a DayRange
covering 2020-01-01 to 2020-12-31
(inclusive).
java.lang.IllegalStateException
- in the unlikely event of this method
requiring a DayRange
extending outside of the range
allowed by Day
(0001-01-01 to 9999-12-31 inclusive).fullYear(net.degreedays.time.StartOfYear)
public DayRange fullWeek(DayOfWeek firstDayOfWeek)
DayRange
representing the week (starting
on the specified firstDayOfWeek
) in which this
Day
falls.
For example Day.of(2020, 6, 21).fullWeek(DayOfWeek.MONDAY)
would return a DayRange
covering Monday 2020-06-15 to Sunday
2020-06-21 (inclusive).
firstDayOfWeek
- indicating the first day of a "week" e.g.
DayOfWeek.MONDAY
for weeks running from Monday to
Sunday (inclusive). Cannot be null
.java.lang.NullPointerException
- if firstDayOfWeek
is
null
.java.lang.IllegalStateException
- in the unlikely event of this method
requiring a DayRange
extending outside of the range
allowed by Day
(0001-01-01 to 9999-12-31 inclusive).public java.lang.String toNumericString()
Day
in YYYYMMDD
format.toString()
,
fromString(java.lang.String)
public java.lang.String toString()
Day
in YYYY-MM-DD
format.toString
in class java.lang.Object
toNumericString()
,
fromString(java.lang.String)
See www.degreedays.net/api/ for more about the Degree Days.net API.
You can sign up for a Degree Days.net API account and read the integration guide that is useful and applicable whether you are using Java or not.