Qual è la differenza tra i metodi getActualMinimum e getGreatestMinimum di Calendar?
Poiché getActualMinimum()e getGreatestMinimum()restituiranno lo stesso valore per ogni campo qual è la differenza esatta?
Risposte
Il getActualMinimum()metodo restituisce il valore minimo possibile che un attributo potrebbe avere. Ad esempio, Calendar.DAY_OF_MONTHnon è mai inferiore a 1, poiché nessun mese inizia con un giorno numerato 0 o inferiore.
Il getGreatestMinimum()metodo restituisce il valore massimo possibile che getActualMinimum()potrebbe mai avere. Mentre nella maggior parte dei casi questi valori saranno sempre gli stessi (i mesi iniziano quasi sempre con 1), il codice consente loro di essere diversi in alcune rare circostanze. L'utilizzo getGreatestMinimum()è appropriato per gli scenari di convalida dei dati.
Un luogo in cui ciò può (e si verifica) è quando ci sono date saltate o discontinuità in un calendario. Java GregorianCalendar, ad esempio, implementa le date nel calendario giuliano prima di una data di completamento e il calendario gregoriano dopo quella data, e quindi ha un intervallo di diversi giorni in cui le date nel calendario semplicemente non esistono.
Il metodo della Calendarclasse getGreatestMinimum()è astratto, quindi deve essere implementato da una sottoclasse. L'implementazione di JRE per GregorianCalendarmostra che potrebbe differire sul DAY_OF_MONTHcampo se i "giorni saltati" nel mese di completamento non includono il primo del mese:
public int getGreatestMinimum(int field) {
if (field == DAY_OF_MONTH) {
BaseCalendar.Date d = getGregorianCutoverDate();
long mon1 = getFixedDateMonth1(d, gregorianCutoverDate);
d = getCalendarDate(mon1);
return Math.max(MIN_VALUES[field], d.getDayOfMonth());
}
return MIN_VALUES[field];
}
Usando questo come spunto, puoi usare setGregorianChange()per impostare la data di cutover per il cambiamento da Giuliano a Gregoriano. Per impostazione predefinita è il 15 ottobre 1582 (sono stati saltati 10 giorni dal 4 ottobre 1582). Paesi diversi si sono alternati in momenti diversi, ad esempio la Gran Bretagna è stata attivata il 14 settembre 1752 (il giorno dopo il 2 settembre).
Impostando questo cutover su una data in un mese che fa sovrapporre i giorni saltati al primo del mese, possiamo generare questi casi limite.
Una discontinuità effettiva locale-based con un vero appuntamento cutover è probabilmente la Romania, in cui il giorno dopo il 31 mar 1919 era 14 aprile 1919. Quindi, in un locale rumeno, il mese di aprile 1919 sarebbe solo includere giorni da 14 a 30, e getGreatestMin()lo farà ritorno 14.
Poiché non ho quella locale installata, posso cambiare la data di cutover per simulare cosa succederebbe:
GregorianCalendar cal = new GregorianCalendar();
// Deprecated, but an easy way of showing this example
cal.setGregorianChange(new Date(1911, Calendar.APRIL, 14));
System.out.println("actual min = " + cal.getActualMinimum(cal.DAY_OF_MONTH));
System.out.println("greatest min = " + cal.getGreatestMinimum(cal.DAY_OF_MONTH));
Produzione:
actual min = 1
greatest min = 14
Esiste un altro caso limite se si utilizza Date(Long.MIN_VALUE)come cutover, fornendo un calendario "gregoriano puro" senza spazi vuoti. Ma in quel caso, "l'inizio del tempo" è il 16 del mese (nel calendario gregoriano), quindi il minimo massimo in questo caso è 16.
Altri sistemi di calendario possono avere discontinuità e casi limite simili.
Ti consiglio di smettere di usare l' java.utilAPI data-ora obsoleta e soggetta a errori . Nella moderna API data-ora, il si smallestMaximumriferisce al più piccolo dei valori massimi, ad esempio il numero massimo di giorni per il mese varia da 28(for Feb) a 31e quindi smallestMaximumè 28.
Simile è il caso con il largestMinimumcui nome è auto-descrittivo. Tuttavia, a differenza di smallestMaximumche contiene il valore più piccolo dell'intervallo di valori massimi , non sono stato in grado di trovare l' intervallo di valori minimi da cui il valore più grande deve essere mantenuto da largestMinimum. In altre parole, i valori mantenuti da minimume largestMinimumsono gli stessi per tutti gli ChronoFields.
Con la moderna API data-ora :
import java.time.temporal.ChronoField;
public class Main {
public static void main(String[] args) {
// e.g. Value range for ChronoField.DAY_OF_MONTH
System.out.println("Stats of ChronoField.DAY_OF_MONTH:");
System.out.println("Supported value range: " + ChronoField.DAY_OF_MONTH.range());
System.out.println("Maximum supported value: " + ChronoField.DAY_OF_MONTH.range().getMaximum());
System.out.println("Minimum supported value: " + ChronoField.DAY_OF_MONTH.range().getMinimum());
System.out.println("Largest minimum supported value: " + ChronoField.DAY_OF_MONTH.range().getLargestMinimum());
System.out
.println("Smallest maximum supported value: " + ChronoField.DAY_OF_MONTH.range().getSmallestMaximum());
// e.g. Value range for ChronoField.DAY_OF_YEAR
System.out.println("\nStats of ChronoField.DAY_OF_YEAR:");
System.out.println("Supported value range: " + ChronoField.DAY_OF_YEAR.range());
System.out.println("Maximum supported value: " + ChronoField.DAY_OF_YEAR.range().getMaximum());
System.out.println("Minimum supported value: " + ChronoField.DAY_OF_YEAR.range().getMinimum());
System.out.println("Largest minimum supported value: " + ChronoField.DAY_OF_YEAR.range().getLargestMinimum());
System.out.println("Smallest maximum supported value: " + ChronoField.DAY_OF_YEAR.range().getSmallestMaximum());
}
}
Produzione:
Stats of ChronoField.DAY_OF_MONTH:
Supported value range: 1 - 28/31
Maximum supported value: 31
Minimum supported value: 1
Largest minimum supported value: 1
Smallest maximum supported value: 28
Stats of ChronoField.DAY_OF_YEAR:
Supported value range: 1 - 365/366
Maximum supported value: 366
Minimum supported value: 1
Largest minimum supported value: 1
Smallest maximum supported value: 365
Controlla TemporalAccessor#rangeper maggiori dettagli. Ulteriori informazioni sulla moderna API data-ora da Trail: Date Time .
Non esiste un metodo come il minimo minimo. I metodi sono getActualMaximum (), getActualMinimum (), getLeastMaximum (), getMaximum () e getMinimum ()
getLeastMaximum () restituirà 28, getMaximum () restituirà 31, getMinimum () restituirà 1 per l'input come Calendar.DAY_OF_WEEK
I metodi con "Actual" restituiranno i valori minimi o massimi corrispondenti specifici per il valore dell'istanza di calendario in uso. (Alcuni calendari hanno 13 mesi in un anno)
Quindi i valori effettivi sono relativi e gli altri 3 metodi sono assoluti.
Ho appena letto il documento java e i 2 link sottostanti per arrivare a questa conclusione
getActualMaximum ()
getActualMinimum ()