Java.Time.Year的Java 8 doc页面指出,支持的最小和最大年份分别为-999,999,999和999,999,999.
现场总结
static intMAX_VALUE支持的最大年份,'+999,999,999'.
static intMIN_VALUE支持的最低年份'-999,999,999'.
但是,存储年份值的原始类型变量是int,它应该能够存储在-2,147,483,648和2,147,483,647之间.
/**
* The year being represented.
*/
private final int year;
Run Code Online (Sandbox Code Playgroud)
为什么有这些任意限制?
使用999,999,999的原因与代码中解析实现的任何特定问题无关.
它可能已被选中,因为它是由1到9位数组成的任何数字的最大值.我们无法使用INT将整套年份存储到10位数,因为9,999,999,999(以及另外79%的可能10位数字)不能存储在整数中.值得注意的是,格式化程序本身可以无缝地支持最多64位的单个数字,并且仅使用MIN/MAX进行错误检查.如果Min/Max被提升到INT_MIN和INT_MAX,它仍然可以正常运行.超过INT_MAX的值将正确抛出错误并防止有关整数溢出的任何问题,因此不会担心任何类型的解析失败.
ISO_LOCAL_DATE = new DateTimeFormatterBuilder()
.appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR, 2)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH, 2)
.toFormatter(ResolverStyle.STRICT, IsoChronology.INSTANCE);
Run Code Online (Sandbox Code Playgroud)
年份是传统ISO的4个数字,即0-9999,或者具有+/-,即999999年的+999999.
值得注意的是,ISO_LOCAL_DATE Formatter默认接受10位数年份,不包括+/-符号,因此实际上正确解析了值+9,876,543,210,但超出了MAX_YEAR的可接受值.
Text '+9876543210-10-31' could not be parsed: Invalid value for Year (valid values -999999999 - 999999999): 9876543210
Run Code Online (Sandbox Code Playgroud)
DateTimeFormatterBuilder中的所有内容最多支持64位数字,一次解析一个数字.所有这些值都安全地作为BigIntegers进行解析,并在索引向右移动时小心地乘以10,并在完成后转换并存储在由字段名称和长整数组成的解析上下文中,即使可以清楚地存储字段Months和Days作为INTS.稍后将这些转换回其关联的基元.
实际上,DateTimeFormatterBuilder绝对可以2,147,483,647用作有效的最小/最大年份而不会破坏.
实际上,"Java接受任何年份值高达9位数"的描述提出了一个具体的障碍,即在将两年加在一起时没有整数溢出或混淆的可能性,并减少任何潜在的黑盒混淆为什么年份2,100,000,000工作但2,200,000,000停止了.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |