/*
 *******************************************************************************
 * Copyright (C) 2013, International Business Machines Corporation and         *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.samples.text.dateintervalformat;


// ---dtitvfmtPreDefinedExample 
import java.util.Date;

import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.DateIntervalFormat;
import com.ibm.icu.text.DateIntervalInfo;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.DateInterval;
import com.ibm.icu.util.GregorianCalendar;
import com.ibm.icu.util.ULocale;
// ---dtitvfmtPreDefinedExample
public class DateIntervalFormatSample{

    public static void main (String[] args){

        dtitvfmtPreDefined();
        dtitvfmtCustomized();

    }

    public static void dtitvfmtPreDefined()
    {
        System.out.println("==============================================================================");
        System.out.println(" dtitvfmtPreDefined()");
        System.out.println();
        System.out.println(" Use DateIntervalFormat to get Date interval format for pre-defined skeletons:");
        System.out.println(" yMMMd, MMMd per locale");
        System.out.println("==============================================================================");
        // ---dtitvfmtPreDefinedExample  
        final Date date[] = {
                new GregorianCalendar(2007,10,10,10,10,10).getTime(),
                new GregorianCalendar(2008,10,10,10,10,10).getTime(),
                new GregorianCalendar(2008,11,10,10,10,10).getTime(),
                new GregorianCalendar(2008,11,10,15,10,10).getTime(),
        };
        final DateInterval dtitv[] = {
                new DateInterval(date[0].getTime(),date[1].getTime()),
                new DateInterval(date[1].getTime(),date[2].getTime()),
                new DateInterval(date[2].getTime(),date[3].getTime()),
        };
        final String [] skeletons = {
                DateFormat.YEAR_ABBR_MONTH_DAY,
                DateFormat.MONTH_DAY,
                DateFormat.HOUR_MINUTE,
                };
        System.out.printf("%-15s%-35s%-35s%-35s%-35s\n", "Skeleton", "from","to","Date Interval in en_US", "Date Interval in Ja");
        int i=0;
        for (String skeleton:skeletons) {
        System.out.printf("%-15s%-35s%-35s", skeleton,date[i].toString(), date[i+1].toString());
                DateIntervalFormat dtitvfmtEn = DateIntervalFormat.getInstance(skeleton, ULocale.ENGLISH);
                DateIntervalFormat dtitvfmtJa = DateIntervalFormat.getInstance(skeleton, ULocale.JAPANESE);
                System.out.printf("%-35s%-35s\n", dtitvfmtEn.format(dtitv[i]),dtitvfmtJa.format(dtitv[i]));
                i++;
        }
        /** output of the sample code:
         *********************************************************************************************************************************************************
         Skeleton       from                               to                                 Date Interval in en_US             Date Interval in Ja
         yMMMd          Sat Nov 10 10:10:10 EST 2007       Mon Nov 10 10:10:10 EST 2008       Nov 10, 2007 – Nov 10, 2008        2007年11月10日～2008年11月10日 
         MMMMd          Mon Nov 10 10:10:10 EST 2008       Wed Dec 10 10:10:10 EST 2008       November 10 – December 10          11月10日～12月10日 
         jm             Wed Dec 10 10:10:10 EST 2008       Wed Dec 10 15:10:10 EST 2008       10:10 AM – 3:10 PM                 10:10～15:10

         *********************************************************************************************************************************************************/
        // ---dtitvfmtPreDefinedExample
}
    public static void dtitvfmtCustomized()
    {
        System.out.println("================================================================================");
        System.out.println(" dtitvfmtCustomized()");
        System.out.println();
        System.out.println(" Use DateIntervalFormat to create customized date interval format for yMMMd, Hm");
        System.out.println("================================================================================");
        // ---dtitvfmtCustomizedExample 
        final Date date[] = {
                new GregorianCalendar(2007,9,10,10,10,10).getTime(),
                new GregorianCalendar(2007,10,10,10,10,10).getTime(),
                new GregorianCalendar(2007,10,10,22,10,10).getTime(),
        };
        final DateInterval dtitv[] = {
                new DateInterval(date[0].getTime(),date[1].getTime()),
                new DateInterval(date[1].getTime(),date[2].getTime()),
        };
        final String [] skeletons = {
                DateFormat.YEAR_ABBR_MONTH_DAY,
                DateFormat.HOUR24_MINUTE,
                };
        System.out.printf("%-15s%-35s%-35s%-45s%-35s\n", "Skeleton", "from","to", "Date Interval in en_US", "Date Interval in Ja");
        // Create an empty DateIntervalInfo object
        DateIntervalInfo dtitvinf = new DateIntervalInfo(ULocale.ENGLISH);
        // Set Date Time internal pattern for MONTH, DAY_OF_MONTH, HOUR_OF_DAY
        dtitvinf.setIntervalPattern("yMMMd", Calendar.MONTH, "y 'Diff' MMM d --- MMM d");
        dtitvinf.setIntervalPattern("Hm", Calendar.HOUR_OF_DAY, "yyyy MMM d HH:mm ~ HH:mm");
        // Set fallback interval pattern
        dtitvinf.setFallbackIntervalPattern("{0} ~~~ {1}");
        // Get the DateIntervalFormat with the custom pattern
        for (String skeleton:skeletons){
            for (int i=0;i<2;i++) {
            System.out.printf("%-15s%-35s%-35s", skeleton,date[i].toString(), date[i+1].toString());
            DateIntervalFormat dtitvfmtEn = DateIntervalFormat.getInstance(skeleton,ULocale.ENGLISH,dtitvinf);
            DateIntervalFormat dtitvfmtJa = DateIntervalFormat.getInstance(skeleton,ULocale.JAPANESE,dtitvinf);
            System.out.printf("%-45s%-35s\n", dtitvfmtEn.format(dtitv[i]),dtitvfmtJa.format(dtitv[i]));
            }
       }
        /** output of the sample code:
         *************************************************************************************************************************************************************************
          Skeleton       from                               to                                 Date Interval in en_US                       Date Interval in Ja
          yMMMd          Wed Oct 10 10:10:10 EDT 2007       Sat Nov 10 10:10:10 EST 2007       2007 Diff Oct 10 --- Nov 10                  2007 Diff 10月 10 --- 11月 10
          yMMMd          Sat Nov 10 10:10:10 EST 2007       Sat Nov 10 22:10:10 EST 2007       Nov 10, 2007                                 2007年11月10日
          Hm             Wed Oct 10 10:10:10 EDT 2007       Sat Nov 10 10:10:10 EST 2007       10/10/2007, 10:10 ~~~ 11/10/2007, 10:10      2007/10/10 10:10 ~~~ 2007/11/10 10:10
          Hm             Sat Nov 10 10:10:10 EST 2007       Sat Nov 10 22:10:10 EST 2007       2007 Nov 10 10:10 ~ 22:10                    2007 11月 10 10:10 ~ 22:10
         *************************************************************************************************************************************************************************/
      // ---dtitvfmtCustomizedExample

    }
}

