/*******************************************************************************
 * Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v3
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl-3.0-standalone.html
 ******************************************************************************/
package se.unlogic.standardutils.date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtils {

   public static final SimpleDateFormat DATE_TIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm");
   public static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd");
   public static final SimpleDateFormat YEAR_FORMATTER = new SimpleDateFormat("yyyy");

   public static boolean isValidDate(DateFormat sdf, String date) {

      try {
         sdf.parse(date);
      } catch (ParseException e) {
         return false;
      } catch (RuntimeException e) {
         return false;
      }
      return true;
   }

   public static Date getDate(DateFormat sdf, String date) {

      try {
         return sdf.parse(date);
      } catch (ParseException e) {
         return null;
      } catch (RuntimeException e) {
         return null;
      }
   }

   public static long daysBetween(Date startDate, Date endDate) {

      Calendar start = Calendar.getInstance();
      start.setTime(startDate);

      Calendar end = Calendar.getInstance();
      end.setTime(endDate);

      return daysBetween(start, end);
   }

   public static long daysBetween(Calendar startDate, Calendar endDate) {

      startDate = (Calendar) startDate.clone();

      long daysBetween = 0;

      while (startDate.get(Calendar.YEAR) < endDate.get(Calendar.YEAR)) {

         if(startDate.get(Calendar.DAY_OF_YEAR) != 1){

            int diff = startDate.getMaximum(Calendar.DAY_OF_YEAR) - startDate.get(Calendar.DAY_OF_YEAR);

            diff++;

            startDate.add(Calendar.DAY_OF_YEAR, diff);

            daysBetween += diff;

         }else{

            daysBetween += startDate.getMaximum(Calendar.DAY_OF_YEAR);

            startDate.add(Calendar.YEAR, 1);
         }
      }

      daysBetween += endDate.get(Calendar.DAY_OF_YEAR) - startDate.get(Calendar.DAY_OF_YEAR);

      return daysBetween;
   }
}
