1 /* 2 * Copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos 3 * 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * * Redistributions of source code must retain the above copyright notice, 10 * this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright notice, 13 * this list of conditions and the following disclaimer in the documentation 14 * and/or other materials provided with the distribution. 15 * 16 * * Neither the name of JSR-310 nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 package org.threeten.bp.chrono; 33 34 import static org.threeten.bp.temporal.ChronoField.ERA; 35 36 import java.util.Locale; 37 38 import org.threeten.bp.DateTimeException; 39 import org.threeten.bp.format.DateTimeFormatterBuilder; 40 import org.threeten.bp.format.TextStyle; 41 import org.threeten.bp.temporal.ChronoField; 42 import org.threeten.bp.temporal.ChronoUnit; 43 import org.threeten.bp.temporal.Temporal; 44 import org.threeten.bp.temporal.TemporalField; 45 import org.threeten.bp.temporal.TemporalQueries; 46 import org.threeten.bp.temporal.TemporalQuery; 47 import org.threeten.bp.temporal.UnsupportedTemporalTypeException; 48 import org.threeten.bp.temporal.ValueRange; 49 50 /** 51 * An era in the ISO calendar system. 52 * <p> 53 * The ISO-8601 standard does not define eras. 54 * A definition has therefore been created with two eras - 'Current era' (CE) for 55 * years from 0001-01-01 (ISO) and 'Before current era' (BCE) for years before that. 56 * <p> 57 * <b>Do not use {@code ordinal()} to obtain the numeric representation of {@code IsoEra}. 58 * Use {@code getValue()} instead.</b> 59 * 60 * <h3>Specification for implementors</h3> 61 * This is an immutable and thread-safe enum. 62 */ 63 public enum IsoEra implements Era { 64 65 /** 66 * The singleton instance for the era BCE, 'Before Current Era'. 67 * The 'ISO' part of the name emphasizes that this differs from the BCE 68 * era in the Gregorian calendar system. 69 * This has the numeric value of {@code 0}. 70 */ 71 BCE, 72 /** 73 * The singleton instance for the era CE, 'Current Era'. 74 * The 'ISO' part of the name emphasizes that this differs from the CE 75 * era in the Gregorian calendar system. 76 * This has the numeric value of {@code 1}. 77 */ 78 CE; 79 80 //----------------------------------------------------------------------- 81 /** 82 * Obtains an instance of {@code IsoEra} from an {@code int} value. 83 * <p> 84 * {@code IsoEra} is an enum representing the ISO eras of BCE/CE. 85 * This factory allows the enum to be obtained from the {@code int} value. 86 * 87 * @param era the BCE/CE value to represent, from 0 (BCE) to 1 (CE) 88 * @return the era singleton, not null 89 * @throws DateTimeException if the value is invalid 90 */ of(int era)91 public static IsoEra of(int era) { 92 switch (era) { 93 case 0: 94 return BCE; 95 case 1: 96 return CE; 97 default: 98 throw new DateTimeException("Invalid era: " + era); 99 } 100 } 101 102 //----------------------------------------------------------------------- 103 /** 104 * Gets the numeric era {@code int} value. 105 * <p> 106 * The era BCE has the value 0, while the era CE has the value 1. 107 * 108 * @return the era value, from 0 (BCE) to 1 (CE) 109 */ 110 @Override getValue()111 public int getValue() { 112 return ordinal(); 113 } 114 115 //----------------------------------------------------------------------- 116 @Override isSupported(TemporalField field)117 public boolean isSupported(TemporalField field) { 118 if (field instanceof ChronoField) { 119 return field == ERA; 120 } 121 return field != null && field.isSupportedBy(this); 122 } 123 124 @Override range(TemporalField field)125 public ValueRange range(TemporalField field) { 126 if (field == ERA) { 127 return field.range(); 128 } else if (field instanceof ChronoField) { 129 throw new UnsupportedTemporalTypeException("Unsupported field: " + field); 130 } 131 return field.rangeRefinedBy(this); 132 } 133 134 @Override get(TemporalField field)135 public int get(TemporalField field) { 136 if (field == ERA) { 137 return getValue(); 138 } 139 return range(field).checkValidIntValue(getLong(field), field); 140 } 141 142 @Override getLong(TemporalField field)143 public long getLong(TemporalField field) { 144 if (field == ERA) { 145 return getValue(); 146 } else if (field instanceof ChronoField) { 147 throw new UnsupportedTemporalTypeException("Unsupported field: " + field); 148 } 149 return field.getFrom(this); 150 } 151 152 //------------------------------------------------------------------------- 153 @Override adjustInto(Temporal temporal)154 public Temporal adjustInto(Temporal temporal) { 155 return temporal.with(ERA, getValue()); 156 } 157 158 @SuppressWarnings("unchecked") 159 @Override query(TemporalQuery<R> query)160 public <R> R query(TemporalQuery<R> query) { 161 if (query == TemporalQueries.precision()) { 162 return (R) ChronoUnit.ERAS; 163 } 164 if (query == TemporalQueries.chronology() || query == TemporalQueries.zone() || 165 query == TemporalQueries.zoneId() || query == TemporalQueries.offset() || 166 query == TemporalQueries.localDate() || query == TemporalQueries.localTime()) { 167 return null; 168 } 169 return query.queryFrom(this); 170 } 171 172 //----------------------------------------------------------------------- 173 @Override getDisplayName(TextStyle style, Locale locale)174 public String getDisplayName(TextStyle style, Locale locale) { 175 return new DateTimeFormatterBuilder().appendText(ERA, style).toFormatter(locale).format(this); 176 } 177 178 } 179