/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

import java.time.*;
import java.math.*;
import java.time.temporal.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
        ZoneId z = ZoneId.of ( "America/Montreal" );
        ZonedDateTime zdtStart = ZonedDateTime.of ( 2015 , 2 , 21 , 12 , 34 , 56 , 0 , z );
        ZonedDateTime zdtStop = ZonedDateTime.of ( 2016 , 3 , 15 , 12 , 34 , 56 , 0 , z );

        Period p = Period.between ( zdtStart.toLocalDate () , zdtStop.toLocalDate () );
        int years = p.getYears ();

        ZonedDateTime zdtStartFractional = zdtStart.plusYears ( years );
        Duration fractionalYear = Duration.between ( zdtStartFractional , zdtStop );
        ZonedDateTime zdtFractionalYear_StartOfYear = zdtStartFractional.with ( TemporalAdjusters.firstDayOfYear () ).toLocalDate ().atStartOfDay ( z );
        Duration wholeYear = Duration.between (zdtFractionalYear_StartOfYear , zdtFractionalYear_StartOfYear.plusYears ( 1 ) );

        BigDecimal fractionalYearAsNanos = new BigDecimal ( fractionalYear.toNanos () );
        BigDecimal wholeYearAsNanos = new BigDecimal ( wholeYear.toNanos () );
        BigDecimal ratio = fractionalYearAsNanos.divide ( wholeYearAsNanos , 32 , RoundingMode.HALF_EVEN );
        BigDecimal result = ratio.add ( new BigDecimal ( years ) );

        System.out.println ( zdtStart + "/" + zdtStop );
        System.out.println ( "Years: " + result.toPlainString () );

    }
}