FULL PRODUCT VERSION : java version "1.8.0" Java(TM) SE Runtime Environment (build 1.8.0-b132) Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode) ADDITIONAL OS VERSION INFORMATION : Microsoft Windows [Version 6.1.7601] A DESCRIPTION OF THE PROBLEM : There is a discrepancy between the Java 8 Nashorn implementation of setFullYear and other implementations. If the time is set on a Date object when calling setFullYear the new Date is calculated to be one day less than if the date is set to midnight (00:00:00:00) and is also one day less than the Rhino engine used in Java 7. REGRESSION. Last worked in version 7u45 STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : Create a date with the time set e.g. new Date("January 01, 1950 00:00:01"); call setFullYear(1960) on the date the date is now: Thu Dec 31 1959 00:00:01 GMT+0000 (GMT) rather than Fri Jan 01 1960 00:00:01 GMT-0000 (GMT) This was noticed in regression testing of moving some code from Java 7 to Java 8. (Rhino returns the expected result, Nashorn returns the actual). EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - Before: Sun Jan 01 1950 00:00:00 GMT-0000 (GMT) After: Fri Jan 01 1960 00:00:00 GMT-0000 (GMT) Before: Sun Jan 01 1950 00:00:01 GMT-0000 (GMT) After: Fri Jan 01 1960 00:00:01 GMT-0000 (GMT) This was produced using Java 7 Rhino. ACTUAL - Before: Sun Jan 01 1950 00:00:00 GMT+0000 (GMT) After: Fri Jan 01 1960 00:00:00 GMT+0000 (GMT) Before: Sun Jan 01 1950 00:00:01 GMT+0000 (GMT) After: Thu Dec 31 1959 00:00:01 GMT+0000 (GMT) REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- print("version: " +java.lang.System.getProperty("java.version")); var date1 = new Date("January 01, 1950 00:00:00"); print("Before: "+date1); date1.setFullYear(1960); print("After: "+date1); var date2 = new Date("January 01, 1950 00:00:01"); print("Before: "+date2); date2.setFullYear(1960); print("After: "+date2); ---------- END SOURCE ---------- CUSTOMER SUBMITTED WORKAROUND : The time element was actually unnecessary for our usage so we were able to amend the code to set the date to midnight before calling setFullYear()
|