{"action":"created","comment":{"url":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/comments/23122566","id":23122566,"diff_hunk":"@@ -0,0 +1,887 @@\n+/*\n+ * Copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos\n+ *\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions are met:\n+ *\n+ *  * Redistributions of source code must retain the above copyright notice,\n+ *    this list of conditions and the following disclaimer.\n+ *\n+ *  * Redistributions in binary form must reproduce the above copyright notice,\n+ *    this list of conditions and the following disclaimer in the documentation\n+ *    and/or other materials provided with the distribution.\n+ *\n+ *  * Neither the name of JSR-310 nor the names of its contributors\n+ *    may be used to endorse or promote products derived from this software\n+ *    without specific prior written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+package org.threeten.extra.chrono;\n+\n+import java.io.Serializable;\n+\n+import java.time.Clock;\n+import java.time.DateTimeException;\n+import java.time.DayOfWeek;\n+import java.time.LocalDate;\n+import java.time.LocalTime;\n+import java.time.ZoneId;\n+\n+import java.time.chrono.ChronoLocalDate;\n+import java.time.chrono.ChronoLocalDateTime;\n+import java.time.chrono.ChronoPeriod;\n+\n+import java.time.temporal.ChronoField;\n+import java.time.temporal.ChronoUnit;\n+import java.time.temporal.Temporal;\n+import java.time.temporal.TemporalAccessor;\n+import java.time.temporal.TemporalField;\n+import java.time.temporal.TemporalQuery;\n+import java.time.temporal.TemporalUnit;\n+import java.time.temporal.UnsupportedTemporalTypeException;\n+import java.time.temporal.ValueRange;\n+\n+import java.util.Locale;\n+\n+/**\n+ * A date in the International fixed calendar system.\n+ * <p>\n+ * Implements a pure International Fixed calendar (also known as the Cotsworth plan, the Eastman plan,\n+ * the 13 Month calendar or the Equal Month calendar) a solar calendar proposal for calendar reform designed by\n+ * Moses B. Cotsworth, who presented it in 1902.</p>\n+ * <p>\n+ * It provides for a year of 13 months of 28 days each, with one or two days a year belonging to no month or week.\n+ * It is therefore a perennial calendar, with every date fixed always on the same weekday.\n+ * Though it was never officially adopted in any country, it was the official calendar of the Eastman Kodak Company\n+ * from 1928 to 1989.</p>\n+ * <p>\n+ * This date operates using the {@linkplain InternationalFixedChronology International fixed calendar}.\n+ * This calendar system is a proposed reform calendar system, and is not in common use.\n+ * The International fixed differs from the Gregorian in terms of month count and length, and the leap year rule.\n+ * Dates are aligned such that {@code 0001-01-01 (International fixed)} is {@code 0001-01-01 (ISO)}.</p>\n+ * <p>\n+ * More information is available in the <a href='https://en.wikipedia.org/wiki/International_Fixed_Calendar'>International fixed Calendar</a> Wikipedia article.</p>\n+ * <p>\n+ * <h3>Implementation Requirements</h3>\n+ * This class is immutable and thread-safe.\n+ * <p>\n+ * This class must be treated as a value type. Do not synchronize, rely on the\n+ * identity hash code or use the distinction between equals() and ==.</p>\n+ */\n+public final class InternationalFixedDate\n+        extends AbstractDate\n+        implements ChronoLocalDate, Serializable {\n+    /**\n+     * Serialization version UID.\n+     */\n+    private static final long serialVersionUID = -908631218899744973L;\n+    /**\n+     * The days per 400 year cycle.\n+     */\n+    private static final int DAYS_PER_CYCLE = 146097;\n+    /**\n+     * Number of years in a decade.\n+     */\n+    private static final int YEARS_IN_DECADE = 10;\n+    /**\n+     * Number of years in a century.\n+     */\n+    private static final int YEARS_IN_CENTURY = 100;\n+    /**\n+     * Number of years in a millennium.\n+     */\n+    private static final int YEARS_IN_MILLENNIUM = 1000;\n+    /**\n+     * The proleptic year.\n+     */\n+    private final int prolepticYear;\n+    /**\n+     * The day of the year, it is calculated as (month - 1) * 28 + dayOfMonth + (isLeapYear() ? 1 : 0).\n+     */\n+    private final int dayOfYear;\n+\n+    /**\n+     * Dates for both leap day and year day may only be instantiated through {@link InternationalFixedDate#of(int,boolean,boolean)}.\n+     * It is therefore not possible to instantiated leap day as 2004-07-01 or year day as 2005-13-29.\n+     *\n+     * For calculation purposes, internally leap day is treated as day-of-year 169,\n+     * squeezed between end of month 6 and beginning of month 7.\n+     * Similarly, year day is treated as day-of-year 365 - or 366 in a leap year.\n+     */\n+\n+    //-----------------------------------------------------------------------\n+    /**\n+     * Creates an instance from validated data.\n+     *\n+     * @param prolepticYear the International fixed proleptic-year\n+     * @param month         the International fixed month, from 1 to 13\n+     * @param dayOfMonth    the International fixed day-of-month, from 1 to 28\n+     * @return the International fixed date\n+     */\n+    private InternationalFixedDate(final int prolepticYear, final int month, final int dayOfMonth) {\n+        this.prolepticYear = prolepticYear;\n+        this.dayOfYear = (month - 1) * InternationalFixedChronology.DAYS_IN_MONTH + dayOfMonth + (isLeapYear() && month > 6 ? 1 : 0);\n+    }\n+\n+    /**\n+     * Creates an instance from validated data.\n+     *\n+     * @param prolepticYear the International fixed proleptic-year\n+     * @param isLeapDay     is it leap-day, month-less day between end of June and beginning of Sol\n+     * @param isYearDay     is it year-day, month-less day between end of December of the old year and beginning of January of the following year\n+     * @return the International fixed date\n+     */\n+    private InternationalFixedDate(final int prolepticYear, final boolean isLeapDay, final boolean isYearDay) {\n+        this.prolepticYear = prolepticYear;\n+\n+        if (isLeapDay) {\n+            this.dayOfYear = InternationalFixedChronology.DAYS_IN_MONTH * 6 + 1;\n+        } else {\n+            this.dayOfYear = InternationalFixedChronology.DAYS_IN_YEAR + (isLeapYear() ? 1 : 0);\n+        }\n+    }\n+\n+    /**\n+     * Obtains the current {@code InternationalFixedDate} from the system clock in the default time-zone.\n+     * <p/>\n+     * This will query the {@link Clock#systemDefaultZone() system clock} in the default\n+     * time-zone to obtain the current date.\n+     * <p/>\n+     * Using this method will prevent the ability to use an alternate clock for testing\n+     * because the clock is hard-coded.\n+     *\n+     * @return the current date using the system clock and default time-zone, not null\n+     */\n+    public static InternationalFixedDate now() {\n+        return now(Clock.systemDefaultZone());\n+    }\n+\n+    /**\n+     * Obtains the current {@code InternationalFixedDate} from the system clock in the specified time-zone.\n+     * <p/>\n+     * This will query the {@link Clock#system(ZoneId) system clock} to obtain the current date.\n+     * Specifying the time-zone avoids dependence on the default time-zone.\n+     * <p/>\n+     * Using this method will prevent the ability to use an alternate clock for testing\n+     * because the clock is hard-coded.\n+     *\n+     * @param zone the zone ID to use, not null\n+     * @return the current date using the system clock, not null\n+     */\n+    public static InternationalFixedDate now(final ZoneId zone) {\n+        return now(Clock.system(zone));\n+    }\n+\n+    /**\n+     * Obtains the current {@code InternationalFixedDate} from the specified clock.\n+     * <p/>\n+     * This will query the specified clock to obtain the current date - today.\n+     * Using this method allows the use of an alternate clock for testing.\n+     * The alternate clock may be introduced using {@linkplain Clock dependency injection}.\n+     *\n+     * @param clock the clock to use, not null\n+     * @return the current date, not null\n+     * @throws DateTimeException if the current date cannot be obtained\n+     */\n+    public static InternationalFixedDate now(final Clock clock) {\n+        LocalDate now = LocalDate.now(clock);\n+\n+        return InternationalFixedDate.ofEpochDay(now.toEpochDay());\n+    }\n+\n+    /**\n+     * Obtains a {@code InternationalFixedDate} representing a date in the International fixed calendar\n+     * system from the proleptic-year, month-of-year and day-of-month fields.\n+     * <p/>\n+     * This returns a {@code InternationalFixedDate} with the specified fields.\n+     * The day must be valid for the year and month, otherwise an exception will be thrown.\n+     *\n+     * @param prolepticYear the International fixed proleptic-year\n+     * @param month         the International fixed month-of-year, from 1 to 13\n+     * @param dayOfMonth    the International fixed day-of-month, from 1 to 28\n+     * @return the date in International fixed calendar system, not null\n+     * @throws DateTimeException if the value of any field is out of range, or if the day-of-month is invalid for the month-year\n+     */\n+    public static InternationalFixedDate of(final int prolepticYear, final int month, final int dayOfMonth) {\n+        return create(prolepticYear, month, dayOfMonth);\n+    }\n+\n+    /**\n+     * Obtains a {@code InternationalFixedDate} representing a date in the International fixed calendar\n+     * system from the proleptic-year, for the month-less days of leap-day and year-day.\n+     * <p/>\n+     * This returns a {@code InternationalFixedDate} with the specified fields.\n+     *\n+     * @param prolepticYear the International fixed proleptic-year\n+     * @param isLeapDay     is it leap-day, month-less day between end of June and beginning of Sol\n+     * @param isYearDay     is it year-day, month-less day between end of December of the old year and beginning of January of the following year\n+     * @return the date in International fixed calendar system, not null\n+     * @throws DateTimeException if the value of any field is out of range,\n+     *                           or if the day-of-month is invalid for the month-year\n+     */\n+    public static InternationalFixedDate of(final int prolepticYear, final boolean isLeapDay, final boolean isYearDay) {\n+        return create(prolepticYear, isLeapDay, isYearDay);\n+    }\n+\n+    //-----------------------------------------------------------------------\n+    /**\n+     * Obtains a {@code InternationalFixedDate} from a temporal object.\n+     * <p/>\n+     * This obtains a date in the International fixed calendar system based on the specified temporal.\n+     * A {@code TemporalAccessor} represents an arbitrary set of date and time information,\n+     * which this factory converts to an instance of {@code InternationalFixedDate}.\n+     * <p/>\n+     * The conversion typically uses the {@link ChronoField#EPOCH_DAY EPOCH_DAY}\n+     * field, which is standardized across calendar systems.\n+     * <p/>\n+     * This method matches the signature of the functional interface {@link TemporalQuery}\n+     * allowing it to be used as a query via method reference, {@code InternationalFixedDate::from}.\n+     *\n+     * @param temporal the temporal object to convert, not null\n+     * @return the date in the International fixed calendar system, not null\n+     * @throws DateTimeException if unable to convert to a {@code InternationalFixedDate}\n+     */\n+    public static InternationalFixedDate from(final TemporalAccessor temporal) {\n+        if (temporal instanceof InternationalFixedDate) {\n+            return (InternationalFixedDate) temporal;\n+        }\n+\n+        return InternationalFixedDate.ofEpochDay(temporal.getLong(ChronoField.EPOCH_DAY));\n+    }\n+\n+    /**\n+     * Obtains a {@code InternationalFixedDate} representing a date in the International fixed calendar\n+     * system from the proleptic-year and day-of-year fields.\n+     * <p/>\n+     * This returns a {@code InternationalFixedDate} with the specified fields.\n+     * The day must be valid for the year, otherwise an exception will be thrown.\n+     *\n+     * @param prolepticYear the International fixed proleptic-year\n+     * @param dayOfYear     the International fixed day-of-year, from 1 to 366\n+     * @return the date in International fixed calendar system, not null\n+     * @throws DateTimeException if the value of any field is out of range, or if the day-of-year is invalid for the year\n+     */\n+    static InternationalFixedDate ofYearDay(final int prolepticYear, final int dayOfYear) {\n+        InternationalFixedChronology.YEAR_RANGE.checkValidValue(prolepticYear, ChronoField.YEAR_OF_ERA);\n+        InternationalFixedChronology.DAY_OF_YEAR_RANGE.checkValidValue(dayOfYear, ChronoField.DAY_OF_YEAR);\n+\n+        boolean isLeapYear = InternationalFixedChronology.INSTANCE.isLeapYear(prolepticYear);\n+        boolean isYearDay = dayOfYear == InternationalFixedChronology.DAYS_IN_YEAR + (isLeapYear ? 1 : 0);\n+        boolean isLeapDay = isLeapYear && dayOfYear == 169;\n+\n+        if (isYearDay || isLeapDay) {\n+            return of(prolepticYear, isLeapDay, isYearDay);\n+        }\n+\n+        int doy = (isLeapYear && dayOfYear > 169) ? dayOfYear - 2 : dayOfYear - 1;\n+        int dayOfMonth = 1 + (doy % InternationalFixedChronology.DAYS_IN_MONTH);\n+        int month = 1 + (doy / InternationalFixedChronology.DAYS_IN_MONTH);\n+\n+        return of(prolepticYear, month, dayOfMonth);\n+    }\n+\n+    /**\n+     * Obtains a {@code InternationalFixedDate} representing a date in the International fixed calendar\n+     * system from the epoch-day.\n+     *\n+     * @param epochDay the epoch day to convert based on 1970-01-01 (ISO)\n+     * @return the date in International fixed calendar system, not null\n+     * @throws DateTimeException if the epoch-day is out of range\n+     */\n+    static InternationalFixedDate ofEpochDay(final long epochDay) {\n+        InternationalFixedChronology.EPOCH_DAY_RANGE.checkValidValue(epochDay, ChronoField.EPOCH_DAY);\n+        long zeroDay = epochDay + InternationalFixedChronology.DAYS_0000_TO_1970;\n+\n+        if (zeroDay < 0) {\n+            throw new DateTimeException(\"Invalid epoch: \" + epochDay);\n+        }\n+\n+        long year = (400 * zeroDay) / DAYS_PER_CYCLE;\n+        long doy = zeroDay - (InternationalFixedChronology.DAYS_IN_YEAR * year + getLeapYearsBefore(year));\n+\n+        return ofYearDay((int) year, (int) doy);\n+    }\n+\n+    private static InternationalFixedDate resolvePreviousValid(final int prolepticYear, final int month, final int day) {\n+        int monthR = Math.min(month, InternationalFixedChronology.MONTHS_IN_YEAR);\n+        int dayR = Math.min(day, InternationalFixedChronology.DAYS_IN_MONTH);\n+\n+        return InternationalFixedDate.of(prolepticYear, monthR, dayR);\n+    }\n+\n+    //-----------------------------------------------------------------------\n+    /**\n+     * Get the count of leap years since International fixed year 1.\n+     * <p/>\n+     *\n+     * @param prolepticYear The year.\n+     * @return The number of leap years since International fixed year 1.\n+     */\n+    private static long getLeapYearsBefore(final long prolepticYear) {\n+        long yearBefore = prolepticYear - 1;\n+\n+        return (yearBefore / 4) - (yearBefore / 100) + (yearBefore / 400);\n+    }\n+\n+    /**\n+     * Factory method, validates the given triplet year, month and dayOfMonth\n+     * Leap day or year day must be created with {@link InternationalFixedDate#create(int,boolean,boolean)}.\n+     *\n+     * @param prolepticYear the International fixed proleptic-year\n+     * @param month         the International fixed month, from 1 to 13\n+     * @param dayOfMonth    the International fixed day-of-month, from 1 to 28\n+     * @return the International fixed date\n+     * @throws DateTimeException if the date is invalid\n+     */\n+    static InternationalFixedDate create(final int prolepticYear, final int month, final int dayOfMonth) {\n+        InternationalFixedChronology.YEAR_RANGE.checkValidValue(prolepticYear, ChronoField.YEAR_OF_ERA);\n+        InternationalFixedChronology.MONTH_OF_YEAR_RANGE.checkValidValue(month, ChronoField.MONTH_OF_YEAR);\n+        InternationalFixedChronology.DAY_OF_MONTH_RANGE.checkValidValue(dayOfMonth, ChronoField.DAY_OF_MONTH);\n+\n+        if (1 > prolepticYear) {\n+            throw new DateTimeException(\"Invalid date: \" + prolepticYear + '-' + month + '-' + dayOfMonth);\n+        }\n+\n+        return new InternationalFixedDate(prolepticYear, month, dayOfMonth);\n+    }\n+\n+    /**\n+     * Factory method, validates the given triplet year, month and dayOfMonth\n+     *\n+     * @param prolepticYear the International fixed proleptic-year\n+     * @param isLeapDay     is it leap-day, month-less day between end of June and beginning of Sol\n+     * @param isYearDay     is it year-day, month-less day between end of December of the old year and beginning of January of the following year\n+     * @return the International fixed date\n+     * @throws DateTimeException if the date is invalid\n+     */\n+    static InternationalFixedDate create(final int prolepticYear, final boolean isLeapDay, final boolean isYearDay) {\n+        InternationalFixedChronology.YEAR_RANGE.checkValidValue(prolepticYear, ChronoField.YEAR_OF_ERA);\n+\n+        if (1 > prolepticYear) {\n+            throw new DateTimeException(\"Invalid date: \" + prolepticYear);\n+        }\n+\n+        if (isLeapDay == isYearDay) {\n+            throw new DateTimeException(\"Invalid date: \" + prolepticYear + \" both leap-day and year-day are \" + isYearDay);\n+        }\n+\n+        if (isLeapDay && !InternationalFixedChronology.INSTANCE.isLeapYear(prolepticYear)) {\n+            throw new DateTimeException(\"Invalid leap day for year: \" + prolepticYear);\n+        }\n+\n+        return new InternationalFixedDate(prolepticYear, isLeapDay, isYearDay);\n+    }\n+\n+    /**\n+     *\n+     * Validates the object.\n+     *\n+     * @return the resolved date, not null\n+     */\n+    private Object readResolve() {\n+        if (isLeapDay() || isYearDay()) {\n+            return InternationalFixedDate.of(prolepticYear, isLeapDay(), isYearDay());\n+        }\n+\n+        return InternationalFixedDate.of(prolepticYear, getMonth(), getDayOfMonth());\n+    }\n+\n+    //-----------------------------------------------------------------------\n+    /**\n+     * {@inheritDoc}\n+     */\n+    @Override\n+    int getProlepticYear() {\n+        return prolepticYear;\n+    }\n+\n+    public boolean isLeapDay() {\n+        return isLeapYear() && dayOfYear == 169;\n+    }\n+\n+    public boolean isYearDay() {\n+        return dayOfYear == InternationalFixedChronology.DAYS_IN_YEAR + (isLeapYear() ? 1 : 0);\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    @Override\n+    int getMonth() {\n+        if (isYearDay() || isLeapDay()) {\n+            return 0;\n+        }\n+\n+        int doy = getDayOfYearAdjusted() - 1;\n+\n+        return 1 + (doy / InternationalFixedChronology.DAYS_IN_MONTH);\n+    }\n+\n+    /**\n+     * For calculation purposes, consider leap day to be associated with month Sol.\n+     * In the same spirit, associate year day with the last month of the year.\n+     * @return\n+     */\n+    private int getCalculatedMonth() {\n+        return isYearDay() ?\n+            InternationalFixedChronology.MONTHS_IN_YEAR : isLeapDay() ? 7 : getMonth();\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    @Override\n+    int getDayOfMonth() {\n+        if (isYearDay() || isLeapDay()) {\n+            return 0;\n+        }\n+\n+        int doy = getDayOfYearAdjusted() - 1;\n+\n+        return 1 + (doy % InternationalFixedChronology.DAYS_IN_MONTH);\n+    }\n+\n+    private int getCalculatedDayOfMonth() {\n+        return isYearDay() ? InternationalFixedChronology.DAYS_IN_MONTH + 1 : isLeapDay() ? 1 : getDayOfMonth();\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    @Override\n+    public int getDayOfYear() {\n+        return dayOfYear;\n+    }\n+\n+    private int getDayOfYearAdjusted() {\n+        return isLeapYear() && dayOfYear > 6 * InternationalFixedChronology.DAYS_IN_MONTH ? dayOfYear - 1 : dayOfYear;\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    @Override\n+    int lengthOfYearInMonths() {\n+        return InternationalFixedChronology.MONTHS_IN_YEAR;\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    @Override\n+    ValueRange rangeAlignedWeekOfMonth() {\n+        return ValueRange.of(1, InternationalFixedChronology.WEEKS_IN_MONTH);\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    @Override\n+    InternationalFixedDate resolvePrevious(final int newYear, final int newMonth, final int dayOfMonth) {\n+        return resolvePreviousValid(newYear, newMonth, dayOfMonth);\n+    }\n+\n+    //-----------------------------------------------------------------------\n+    /**\n+     * Gets the chronology of this date, which is the International fixed calendar system.\n+     * <p/>\n+     * The {@code Chronology} represents the calendar system in use.\n+     * The era and other fields in {@link ChronoField} are defined by the chronology.\n+     *\n+     * @return the International fixed chronology, not null\n+     */\n+    @Override\n+    public InternationalFixedChronology getChronology() {\n+        return InternationalFixedChronology.INSTANCE;\n+    }\n+\n+    /**\n+     * Gets the era applicable at this date.\n+     * <p/>\n+     * The International fixed calendar system only has one era, 'CE',\n+     * defined by {@link InternationalFixedEra}.\n+     *\n+     * @return the era applicable at this date, not null\n+     */\n+    @Override\n+    public InternationalFixedEra getEra() {\n+        return InternationalFixedEra.CE;\n+    }\n+\n+    /**\n+     * Returns the length of the month represented by this date.\n+     * <p/>\n+     * This returns the length of the month in days.\n+     * Month lengths do not match those of the ISO calendar system.\n+     *\n+     * @return the length of the month in days: 28\n+     */\n+    @Override\n+    public int lengthOfMonth() {\n+        return InternationalFixedChronology.DAYS_IN_MONTH;\n+    }\n+\n+    /**\n+     * Returns the length of the year represented by this date.\n+     * <p/>\n+     * This returns the length of the year in days.\n+     * Year lengths match those of the ISO calendar system.\n+     *\n+     * @return the length of the year in days: 365 or 366\n+     */\n+    @Override\n+    public int lengthOfYear() {\n+        return InternationalFixedChronology.DAYS_IN_YEAR + (isLeapYear() ? 1 : 0);\n+    }\n+\n+    @Override\n+    public InternationalFixedDate plus(final long amountToAdd, final TemporalUnit unit) {","path":"src/main/java/org/threeten/extra/chrono/InternationalFixedDate.java","position":561,"original_position":551,"commit_id":"0c3ac6cdd79ea5aa906a53cdc59bab3f9098c080","original_commit_id":"46170d68512f1e097d3872d5e43bad5a3d9ad365","user":{"login":"Clockwork-Muse","id":5569508,"avatar_url":"https://avatars.githubusercontent.com/u/5569508?v=3","gravatar_id":"","url":"https://api.github.com/users/Clockwork-Muse","html_url":"https://github.com/Clockwork-Muse","followers_url":"https://api.github.com/users/Clockwork-Muse/followers","following_url":"https://api.github.com/users/Clockwork-Muse/following{/other_user}","gists_url":"https://api.github.com/users/Clockwork-Muse/gists{/gist_id}","starred_url":"https://api.github.com/users/Clockwork-Muse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Clockwork-Muse/subscriptions","organizations_url":"https://api.github.com/users/Clockwork-Muse/orgs","repos_url":"https://api.github.com/users/Clockwork-Muse/repos","events_url":"https://api.github.com/users/Clockwork-Muse/events{/privacy}","received_events_url":"https://api.github.com/users/Clockwork-Muse/received_events","type":"User","site_admin":false},"body":"False.\r\n`2012-06-28 (Saturday) + 1 Week` should yield `2012-07-07 (Saturday)`, not `2012-07-06 (Friday)`.\r\nThe moment you have non-week days, `Week` went from an absolute measure (always 7 days) to a _relative_ one (like month).","created_at":"2015-01-17T03:55:34Z","updated_at":"2015-01-17T03:55:34Z","html_url":"https://github.com/ThreeTen/threeten-extra/pull/31#discussion_r23122566","pull_request_url":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/31","_links":{"self":{"href":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/comments/23122566"},"html":{"href":"https://github.com/ThreeTen/threeten-extra/pull/31#discussion_r23122566"},"pull_request":{"href":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/31"}}},"pull_request":{"url":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/31","id":26997093,"html_url":"https://github.com/ThreeTen/threeten-extra/pull/31","diff_url":"https://github.com/ThreeTen/threeten-extra/pull/31.diff","patch_url":"https://github.com/ThreeTen/threeten-extra/pull/31.patch","issue_url":"https://api.github.com/repos/ThreeTen/threeten-extra/issues/31","number":31,"state":"open","locked":false,"title":"New Chronology for International Fixed Calendar","user":{"login":"catull","id":150055,"avatar_url":"https://avatars.githubusercontent.com/u/150055?v=3","gravatar_id":"","url":"https://api.github.com/users/catull","html_url":"https://github.com/catull","followers_url":"https://api.github.com/users/catull/followers","following_url":"https://api.github.com/users/catull/following{/other_user}","gists_url":"https://api.github.com/users/catull/gists{/gist_id}","starred_url":"https://api.github.com/users/catull/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/catull/subscriptions","organizations_url":"https://api.github.com/users/catull/orgs","repos_url":"https://api.github.com/users/catull/repos","events_url":"https://api.github.com/users/catull/events{/privacy}","received_events_url":"https://api.github.com/users/catull/received_events","type":"User","site_admin":false},"body":"Hello 3-10 stakeholders\r\n\r\nThis changes have been incorporated from the code review:\r\n\r\n- InternationalFixedChronology is now final\r\n- method names now followed directly by open parenthesis\r\n- corrected comments referring to Julian or Pax chronologies\r\n- member item comments not preceded by a blank line anymore\r\n- deprecated InternationalFixedChronology constructor and commented accordingly\r\n- grouping of methods aligned, followed the examples of PaxDate and PaxChronology\r\n- InternationalFixedChronology#eraOf now has return type InternationalFixedChronology\r\n- Corrected exception messages to better reflect the error\r\n- the name 'International Fixed' calendar was chosen by Cotsworth, and yes, it was boldly done for global spreading.\r\n  Perhaps a better name would be KodakFixedChronology / KodakFixedDate, since it was used for 71 years at Eastman Kodak internally.\r\n  Another choice is CutsworthFixedChronology / CutsworthFixedDate.\r\n- Corrected comments on the alignment of Fixed calendar with Gregorian calendar\r\n- Corrected (non-leap) year constant DAYS_IN_YEAR to hold 365 days\r\n- introduced a factory method which validates a given date first, only invokes the constructor if date is accepted\r\n- Corrected year-range check in InternationalFixedDate\r\n- Corrected leap-year check in factory method to call InternationalFixedChronology#isLeapYear(long)\r\n- Corrected CheckStyle warnings and errors for fixed chronology, era and date\r\n- Generated new serial version UID for fixed chronology and date\r\n- Corrected tests affected by code changes above\r\n- Added missing range checks\r\n- Re-worked the internal representation of InternationalFixedDate, to distinguish between calendar days and month-less days.\r\n- Added test cases for leap-day and year-day.\r\n- Added test cases for dateYearDay\r\n- Implemented day-of-week and test cases.\r\n","created_at":"2015-01-07T23:38:19Z","updated_at":"2015-01-17T03:55:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"92f4b48a59b465853e23229bc1aa7f7fd886c531","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/31/commits","review_comments_url":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/31/comments","review_comment_url":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/comments/{number}","comments_url":"https://api.github.com/repos/ThreeTen/threeten-extra/issues/31/comments","statuses_url":"https://api.github.com/repos/ThreeTen/threeten-extra/statuses/0c3ac6cdd79ea5aa906a53cdc59bab3f9098c080","head":{"label":"catull:ifc","ref":"ifc","sha":"0c3ac6cdd79ea5aa906a53cdc59bab3f9098c080","user":{"login":"catull","id":150055,"avatar_url":"https://avatars.githubusercontent.com/u/150055?v=3","gravatar_id":"","url":"https://api.github.com/users/catull","html_url":"https://github.com/catull","followers_url":"https://api.github.com/users/catull/followers","following_url":"https://api.github.com/users/catull/following{/other_user}","gists_url":"https://api.github.com/users/catull/gists{/gist_id}","starred_url":"https://api.github.com/users/catull/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/catull/subscriptions","organizations_url":"https://api.github.com/users/catull/orgs","repos_url":"https://api.github.com/users/catull/repos","events_url":"https://api.github.com/users/catull/events{/privacy}","received_events_url":"https://api.github.com/users/catull/received_events","type":"User","site_admin":false},"repo":{"id":28574506,"name":"threeten-extra","full_name":"catull/threeten-extra","owner":{"login":"catull","id":150055,"avatar_url":"https://avatars.githubusercontent.com/u/150055?v=3","gravatar_id":"","url":"https://api.github.com/users/catull","html_url":"https://github.com/catull","followers_url":"https://api.github.com/users/catull/followers","following_url":"https://api.github.com/users/catull/following{/other_user}","gists_url":"https://api.github.com/users/catull/gists{/gist_id}","starred_url":"https://api.github.com/users/catull/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/catull/subscriptions","organizations_url":"https://api.github.com/users/catull/orgs","repos_url":"https://api.github.com/users/catull/repos","events_url":"https://api.github.com/users/catull/events{/privacy}","received_events_url":"https://api.github.com/users/catull/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/catull/threeten-extra","description":"Provides additional date-time classes that complement those in JDK 8","fork":true,"url":"https://api.github.com/repos/catull/threeten-extra","forks_url":"https://api.github.com/repos/catull/threeten-extra/forks","keys_url":"https://api.github.com/repos/catull/threeten-extra/keys{/key_id}","collaborators_url":"https://api.github.com/repos/catull/threeten-extra/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/catull/threeten-extra/teams","hooks_url":"https://api.github.com/repos/catull/threeten-extra/hooks","issue_events_url":"https://api.github.com/repos/catull/threeten-extra/issues/events{/number}","events_url":"https://api.github.com/repos/catull/threeten-extra/events","assignees_url":"https://api.github.com/repos/catull/threeten-extra/assignees{/user}","branches_url":"https://api.github.com/repos/catull/threeten-extra/branches{/branch}","tags_url":"https://api.github.com/repos/catull/threeten-extra/tags","blobs_url":"https://api.github.com/repos/catull/threeten-extra/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/catull/threeten-extra/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/catull/threeten-extra/git/refs{/sha}","trees_url":"https://api.github.com/repos/catull/threeten-extra/git/trees{/sha}","statuses_url":"https://api.github.com/repos/catull/threeten-extra/statuses/{sha}","languages_url":"https://api.github.com/repos/catull/threeten-extra/languages","stargazers_url":"https://api.github.com/repos/catull/threeten-extra/stargazers","contributors_url":"https://api.github.com/repos/catull/threeten-extra/contributors","subscribers_url":"https://api.github.com/repos/catull/threeten-extra/subscribers","subscription_url":"https://api.github.com/repos/catull/threeten-extra/subscription","commits_url":"https://api.github.com/repos/catull/threeten-extra/commits{/sha}","git_commits_url":"https://api.github.com/repos/catull/threeten-extra/git/commits{/sha}","comments_url":"https://api.github.com/repos/catull/threeten-extra/comments{/number}","issue_comment_url":"https://api.github.com/repos/catull/threeten-extra/issues/comments/{number}","contents_url":"https://api.github.com/repos/catull/threeten-extra/contents/{+path}","compare_url":"https://api.github.com/repos/catull/threeten-extra/compare/{base}...{head}","merges_url":"https://api.github.com/repos/catull/threeten-extra/merges","archive_url":"https://api.github.com/repos/catull/threeten-extra/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/catull/threeten-extra/downloads","issues_url":"https://api.github.com/repos/catull/threeten-extra/issues{/number}","pulls_url":"https://api.github.com/repos/catull/threeten-extra/pulls{/number}","milestones_url":"https://api.github.com/repos/catull/threeten-extra/milestones{/number}","notifications_url":"https://api.github.com/repos/catull/threeten-extra/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/catull/threeten-extra/labels{/name}","releases_url":"https://api.github.com/repos/catull/threeten-extra/releases{/id}","created_at":"2014-12-28T23:53:33Z","updated_at":"2015-01-12T13:39:55Z","pushed_at":"2015-01-14T16:53:07Z","git_url":"git://github.com/catull/threeten-extra.git","ssh_url":"git@github.com:catull/threeten-extra.git","clone_url":"https://github.com/catull/threeten-extra.git","svn_url":"https://github.com/catull/threeten-extra","homepage":"http://www.threeten.org/threeten-extra/","size":1121,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ThreeTen:master","ref":"master","sha":"c8e5db44db23d04a0fe9cf97988ef3a1d612b78b","user":{"login":"ThreeTen","id":873264,"avatar_url":"https://avatars.githubusercontent.com/u/873264?v=3","gravatar_id":"","url":"https://api.github.com/users/ThreeTen","html_url":"https://github.com/ThreeTen","followers_url":"https://api.github.com/users/ThreeTen/followers","following_url":"https://api.github.com/users/ThreeTen/following{/other_user}","gists_url":"https://api.github.com/users/ThreeTen/gists{/gist_id}","starred_url":"https://api.github.com/users/ThreeTen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThreeTen/subscriptions","organizations_url":"https://api.github.com/users/ThreeTen/orgs","repos_url":"https://api.github.com/users/ThreeTen/repos","events_url":"https://api.github.com/users/ThreeTen/events{/privacy}","received_events_url":"https://api.github.com/users/ThreeTen/received_events","type":"Organization","site_admin":false},"repo":{"id":6742151,"name":"threeten-extra","full_name":"ThreeTen/threeten-extra","owner":{"login":"ThreeTen","id":873264,"avatar_url":"https://avatars.githubusercontent.com/u/873264?v=3","gravatar_id":"","url":"https://api.github.com/users/ThreeTen","html_url":"https://github.com/ThreeTen","followers_url":"https://api.github.com/users/ThreeTen/followers","following_url":"https://api.github.com/users/ThreeTen/following{/other_user}","gists_url":"https://api.github.com/users/ThreeTen/gists{/gist_id}","starred_url":"https://api.github.com/users/ThreeTen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThreeTen/subscriptions","organizations_url":"https://api.github.com/users/ThreeTen/orgs","repos_url":"https://api.github.com/users/ThreeTen/repos","events_url":"https://api.github.com/users/ThreeTen/events{/privacy}","received_events_url":"https://api.github.com/users/ThreeTen/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ThreeTen/threeten-extra","description":"Provides additional date-time classes that complement those in JDK 8","fork":false,"url":"https://api.github.com/repos/ThreeTen/threeten-extra","forks_url":"https://api.github.com/repos/ThreeTen/threeten-extra/forks","keys_url":"https://api.github.com/repos/ThreeTen/threeten-extra/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ThreeTen/threeten-extra/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ThreeTen/threeten-extra/teams","hooks_url":"https://api.github.com/repos/ThreeTen/threeten-extra/hooks","issue_events_url":"https://api.github.com/repos/ThreeTen/threeten-extra/issues/events{/number}","events_url":"https://api.github.com/repos/ThreeTen/threeten-extra/events","assignees_url":"https://api.github.com/repos/ThreeTen/threeten-extra/assignees{/user}","branches_url":"https://api.github.com/repos/ThreeTen/threeten-extra/branches{/branch}","tags_url":"https://api.github.com/repos/ThreeTen/threeten-extra/tags","blobs_url":"https://api.github.com/repos/ThreeTen/threeten-extra/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ThreeTen/threeten-extra/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ThreeTen/threeten-extra/git/refs{/sha}","trees_url":"https://api.github.com/repos/ThreeTen/threeten-extra/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ThreeTen/threeten-extra/statuses/{sha}","languages_url":"https://api.github.com/repos/ThreeTen/threeten-extra/languages","stargazers_url":"https://api.github.com/repos/ThreeTen/threeten-extra/stargazers","contributors_url":"https://api.github.com/repos/ThreeTen/threeten-extra/contributors","subscribers_url":"https://api.github.com/repos/ThreeTen/threeten-extra/subscribers","subscription_url":"https://api.github.com/repos/ThreeTen/threeten-extra/subscription","commits_url":"https://api.github.com/repos/ThreeTen/threeten-extra/commits{/sha}","git_commits_url":"https://api.github.com/repos/ThreeTen/threeten-extra/git/commits{/sha}","comments_url":"https://api.github.com/repos/ThreeTen/threeten-extra/comments{/number}","issue_comment_url":"https://api.github.com/repos/ThreeTen/threeten-extra/issues/comments/{number}","contents_url":"https://api.github.com/repos/ThreeTen/threeten-extra/contents/{+path}","compare_url":"https://api.github.com/repos/ThreeTen/threeten-extra/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ThreeTen/threeten-extra/merges","archive_url":"https://api.github.com/repos/ThreeTen/threeten-extra/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ThreeTen/threeten-extra/downloads","issues_url":"https://api.github.com/repos/ThreeTen/threeten-extra/issues{/number}","pulls_url":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls{/number}","milestones_url":"https://api.github.com/repos/ThreeTen/threeten-extra/milestones{/number}","notifications_url":"https://api.github.com/repos/ThreeTen/threeten-extra/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ThreeTen/threeten-extra/labels{/name}","releases_url":"https://api.github.com/repos/ThreeTen/threeten-extra/releases{/id}","created_at":"2012-11-18T01:01:13Z","updated_at":"2015-01-09T23:56:03Z","pushed_at":"2015-01-09T23:56:21Z","git_url":"git://github.com/ThreeTen/threeten-extra.git","ssh_url":"git@github.com:ThreeTen/threeten-extra.git","clone_url":"https://github.com/ThreeTen/threeten-extra.git","svn_url":"https://github.com/ThreeTen/threeten-extra","homepage":"http://www.threeten.org/threeten-extra/","size":2003,"stargazers_count":33,"watchers_count":33,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":9,"mirror_url":null,"open_issues_count":4,"forks":9,"open_issues":4,"watchers":33,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/31"},"html":{"href":"https://github.com/ThreeTen/threeten-extra/pull/31"},"issue":{"href":"https://api.github.com/repos/ThreeTen/threeten-extra/issues/31"},"comments":{"href":"https://api.github.com/repos/ThreeTen/threeten-extra/issues/31/comments"},"review_comments":{"href":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/31/comments"},"review_comment":{"href":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/ThreeTen/threeten-extra/pulls/31/commits"},"statuses":{"href":"https://api.github.com/repos/ThreeTen/threeten-extra/statuses/0c3ac6cdd79ea5aa906a53cdc59bab3f9098c080"}}}}