fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. import java.time.*;
  8. import java.math.*;
  9. import java.time.temporal.*;
  10.  
  11. /* Name of the class has to be "Main" only if the class is public. */
  12. class Ideone
  13. {
  14. public static void main (String[] args) throws java.lang.Exception
  15. {
  16. ZoneId z = ZoneId.of ( "America/Montreal" );
  17. ZonedDateTime zdtStart = ZonedDateTime.of ( 2015 , 2 , 21 , 12 , 34 , 56 , 0 , z );
  18. ZonedDateTime zdtStop = ZonedDateTime.of ( 2016 , 3 , 15 , 12 , 34 , 56 , 0 , z );
  19.  
  20. Period p = Period.between ( zdtStart.toLocalDate () , zdtStop.toLocalDate () );
  21. int years = p.getYears ();
  22.  
  23. ZonedDateTime zdtStartFractional = zdtStart.plusYears ( years );
  24. Duration fractionalYear = Duration.between ( zdtStartFractional , zdtStop );
  25. ZonedDateTime zdtFractionalYear_StartOfYear = zdtStartFractional.with ( TemporalAdjusters.firstDayOfYear () ).toLocalDate ().atStartOfDay ( z );
  26. Duration wholeYear = Duration.between (zdtFractionalYear_StartOfYear , zdtFractionalYear_StartOfYear.plusYears ( 1 ) );
  27.  
  28. BigDecimal fractionalYearAsNanos = new BigDecimal ( fractionalYear.toNanos () );
  29. BigDecimal wholeYearAsNanos = new BigDecimal ( wholeYear.toNanos () );
  30. BigDecimal ratio = fractionalYearAsNanos.divide ( wholeYearAsNanos , 32 , RoundingMode.HALF_EVEN );
  31. BigDecimal result = ratio.add ( new BigDecimal ( years ) );
  32.  
  33. System.out.println ( zdtStart + "/" + zdtStop );
  34. System.out.println ( "Years: " + result.toPlainString () );
  35.  
  36. }
  37. }
Success #stdin #stdout 0.11s 711680KB
stdin
Standard input is empty
stdout
2015-02-21T12:34:56-05:00[America/Montreal]/2016-03-15T12:34:56-04:00[America/Montreal]
Years: 1.06272768670309653916211293260474