RFR JDK-5077522 : Duration.compare incorrect for some values (original) (raw)
huizhe wang huizhe.wang at oracle.com
Tue Jun 17 19:19:54 UTC 2014
- Previous message: RFR: JDK-8044629: (reflect) Constructor.getAnnotatedReceiverType() returns wrong value
- Next message: RFR JDK-5077522 : Duration.compare incorrect for some values
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi,
This is a long time compatibility issue: Duration.compare returns equal for INDETERMINATE relations defined in XML Schema standard (http://www.w3.org/TR/xmlschema-2/#duration-order) as listed in the following table:
Relation
P1Y > P364D <> P365D <> P366D < P367D* P1M > P27D* <> P28D <> P29D <> P30D <> P31D < P32D* P5M > P149D* <> P150D <> P151D <> P152D <> P153D < P154D
The order-relation of two Duratoin values x and y is x < y iff s+x < s+y for each qualified datetime s listed below:
- 1696-09-01T00:00:00Z
- 1697-02-01T00:00:00Z
- 1903-03-01T00:00:00Z
- 1903-07-01T00:00:00Z
The original implementation used Unix epoch, that is, 00:00:00 UTC on 1 January 1970, as s in the above calculation which violated the above specification. A patch during JDK 6 development added correct implementation of the spec, but it was unfortunately added after the original calculation using Epoch time.
The fix to the issue therefore is simply removing the calculation using Epoch time. I also consolidated the tedious max field value checks into a method called checkMaxValue.
Patch: http://cr.openjdk.java.net/~joehw/jdk9/5077522/webrev/
Test: testCompareWithInderterminateRelation: this is a copy of the JCK test that tests INDETERMINATE relations. testVerifyOtherRelations: this is added to verify edge cases, e.g. +- 1 second to the original test cases. For example, to the original test: PT525600M is P365D <> P1Y, I added "PT525599M59S", "<", "P1Y", and PT527040M -> P366D <> P1Y, "PT527040M1S", ">", "P1Y"
Below is the test result: Comparing P1Y and P365D: INDETERMINATE Comparing P1Y and P366D: INDETERMINATE Comparing P1M and P28D: INDETERMINATE Comparing P1M and P29D: INDETERMINATE Comparing P1M and P30D: INDETERMINATE Comparing P1M and P31D: INDETERMINATE Comparing P5M and P150D: INDETERMINATE Comparing P5M and P151D: INDETERMINATE Comparing P5M and P152D: INDETERMINATE Comparing P5M and P153D: INDETERMINATE Comparing PT2419200S and P1M: INDETERMINATE Comparing PT2678400S and P1M: INDETERMINATE Comparing PT31536000S and P1Y: INDETERMINATE Comparing PT31622400S and P1Y: INDETERMINATE Comparing PT525600M and P1Y: INDETERMINATE Comparing PT527040M and P1Y: INDETERMINATE Comparing PT8760H and P1Y: INDETERMINATE Comparing PT8784H and P1Y: INDETERMINATE Comparing P365D and P1Y: INDETERMINATE Comparing P1Y and P364D: expected: GREATER actual: GREATER Comparing P1Y and P367D: expected: LESSER actual: LESSER Comparing P1Y2D and P366D: expected: GREATER actual: GREATER Comparing P1M and P27D: expected: GREATER actual: GREATER Comparing P1M and P32D: expected: LESSER actual: LESSER Comparing P1M and P31DT1H: expected: LESSER actual: LESSER Comparing P5M and P149D: expected: GREATER actual: GREATER Comparing P5M and P154D: expected: LESSER actual: LESSER Comparing P5M and P153DT1H: expected: LESSER actual: LESSER Comparing PT2419199S and P1M: expected: LESSER actual: LESSER Comparing PT2678401S and P1M: expected: GREATER actual: GREATER Comparing PT31535999S and P1Y: expected: LESSER actual: LESSER Comparing PT31622401S and P1Y: expected: GREATER actual: GREATER Comparing PT525599M59S and P1Y: expected: LESSER actual: LESSER Comparing PT527040M1S and P1Y: expected: GREATER actual: GREATER Comparing PT8759H59M59S and P1Y: expected: LESSER actual: LESSER Comparing PT8784H1S and P1Y: expected: GREATER actual: GREATER
Number of tests passed: 36 Number of tests failed: 0
Thanks, Joe
- Previous message: RFR: JDK-8044629: (reflect) Constructor.getAnnotatedReceiverType() returns wrong value
- Next message: RFR JDK-5077522 : Duration.compare incorrect for some values
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]